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.