HomeAssistant, Modbus, MQTT

Preface: száraz, technikai home automation post jön, magamnak és hasonló bűvös kockáknak.

A probléma

HomeAssistantban akartam egy PLC digitális kimeneteit szenzorokként látni. A PLC beszél Modbus TCP-t, HomeAssistantban meg ott a modbus támogatás gyárilag, így relatíve egyszerűnek tűnt a dolog.

Amint nekiálltam az első bináris modbus szenzor definíciójának elfogott a félsz, hogy mi van, ha a HomeAssistantnak nem lesz annyi esze, hogy az összes coil állapotát egy körben kérdezze le. Modbuson ugyanis egyetlen requesttel elkérheted az összes eszköz állapotát egy byte tömbben – ha jól emlékszem 10 msec alatt -, nálam pedig 96 coil lekérdezése a feladat, ezért nagyon nem mindegy, hogy 1*10 vagy 96*10 msec egy polling kör.

Így definiáltam két szenzort, majd meglestem mit csinál a modbus integráció és sajna igazam lett: a HomeAssistant egyesével polloz, így ez nekem nem járható út. Persze lehetne saját integrációt fejleszteni (nagy eséllyel ez lesz a vége), de egyelőre gyorsabbnak tűnt az, ha MQTT szenzorokra váltok. Ráadásul az MQTT szexi, minimál network forgalommal, szóval mindenképp szimpatikus.

HomeAssistant alatt régóta ott csücsül az MQTT integráció – egy Mosquitto brókert tudsz pár klikkel telepíteni és már megy is. Nálam ez már adott volt, mivel az adott configban monitorozott ZigBee szenzorok adatait egy Zigbee2MQTT integráció szállította MQTT-n keresztül a HomeAssistantnak. Az egész hóbelevanc ment magától a kezdetektől fogva, így nem is sejtettem, hogy egy külső script bármi galibát okozhatna.

Összeraktam a scriptet, elindítottam és benéztem a Mosquitto brókerbe, de a script által publikált modbus topicnak nyoma nem volt – WTF?

A megoldás

Ahhoz, hogy mindenki megkapja a maga releváns szeletét a brókerből, dedikált userek és access control lista kell.

Először csináld meg az usereket az MQTT bróker configjában:

certfile: fullchain.pem
customize:
  active: true
  folder: mosquitto
keyfile: privkey.pem
logins:
  - username: external_user
    password: external_pass
  - username: internal_user
    password: internal_pass
  - username: observer_user
    password: observer_pass
require_certificate: false

A logins blokk definiálja a brókerhez hozzáférő usereket. Amint látod, én hármat csináltam: az internal_usert kapják a belső integrációk, az external_user a modbus scripté, az observer_user pedig nekem egy külső monitoring toolhoz hasznos.

A customize blokkon belüli active: true mondja meg neki, hogy extra cfg file-okat kell még olvasgatnia induláskor, a folder: mosquitto pedig azt, hogy a share/mosquitto folderen belül lakó összes .conf végződésű file az övé.

Így már csak létre kell hoznod a share/mosquitto/acl.conf file-t benne a definícióval, ami megmondja a brókernek, hogy hol lesz az access control file:

acl_file /share/mosquitto/accescontrollist

Végül ebben a /share/mosquitto/accescontrollist fileban jogot kell adnod az egyes usernek:

user internal_user
topic readwrite #

user external_user
topic readwrite modbus/#

user observer_user
topic read #

Még a Zigbee2MQTT configjában kell definiálni az MQTT usert az MQTT blokkban és meg is vagyunk:

data_path: /config/zigbee2mqtt
external_converters: []
devices: devices.yaml
groups: groups.yaml
homeassistant: true
permit_join: true
mqtt:
  base_topic: zigbee2mqtt
  user: internal_user
  password: internal_pass

Már csak a Modbusról jövő MQTT szenzorok HomeAssistantba gyógyítása van hátra, de az majd inkább egy következő post lesz.

Leave a Reply

Your email address will not be published. Required fields are marked *