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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
acl_file /share/mosquitto/accescontrollist
acl_file /share/mosquitto/accescontrollist
acl_file /share/mosquitto/accescontrollist

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
user internal_user
topic readwrite #
user external_user
topic readwrite modbus/#
user observer_user
topic read #
user internal_user topic readwrite # user external_user topic readwrite modbus/# user observer_user topic read #
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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 *