Az okosotthonok világában egyre inkább előtérbe kerülnek azok a protokollok és technológiák, amelyek egyszerűsítik a különböző eszközök közötti kommunikációt és integrációt. Az MQTT (Message Queuing Telemetry Transport) egy ilyen protokoll, amelyet kifejezetten alacsony sávszélességű és erőforrásigényű eszközök számára terveztek. Az MQTT rugalmas, könnyen implementálható, és ideális megoldást kínál a különféle okosotthon eszközök összekapcsolására. Ebben a cikkben áttekintjük, miért tekinthető az MQTT az okosotthonok svájci bicskájának, és hogyan viszonyul a Z-Wave és Zigbee technológiákhoz.
Mi az MQTT és hogyan működik?
Az MQTT egy üzenetközvetítő protokoll, amely a „publish/subscribe” (publikálás/feliratkozás) modellt használja. Ez azt jelenti, hogy az eszközök (kliensek) nem közvetlenül kommunikálnak egymással, hanem egy központi szerveren (broker) keresztül. Az eszközök publikálhatnak üzeneteket bizonyos témákra (topics), és feliratkozhatnak az őket érdeklő témákra. A broker felelős az üzenetek továbbításáért a megfelelő klienseknek.
MQTT Előnyei
- Alacsony sávszélesség és erőforrásigény: Az MQTT minimális adatforgalmat generál, így ideális alacsony sávszélességű hálózatokhoz és erőforrás-korlátozott eszközökhöz.
- Rugalmas architektúra: A publish/subscribe modell lehetővé teszi a könnyű bővítést és a dinamikus eszközcsatlakozást.
- Egyszerű implementáció: Számos programozási nyelvben elérhető MQTT kliensek és szerverek, így könnyen integrálható különböző rendszerekbe.
Az MQTT helye az okosotthonokban
Az MQTT előnyei különösen akkor nyilvánvalóak, amikor sokféle, különböző protokollokat használó eszközt kell integrálni egyetlen rendszerbe, és a kommunikáció egyszerűsége és hatékonysága kiemelt fontosságú.
Míg a Z-Wave és a Zigbee IoT eszközök egy-egy csoportjára jellemző kommunikációs mód és nem ad átjárhatóságot más kommunikációs módok felé és kifejezetten eszköz szinthez közeli réteg, addig az MQTT egy magasabb szintű megoldás üzenetek fogadására és továbbítására. Ezen a ponton érnek össze a technológiák. Az eszközök a gyűjtött adatokat eg yközvetítő rétegen keresztül el tudnják juttatni az MQTT brokerhez, és onnan adatokat képesek lekérdezni a közvetítő rétegen keresztül igény esetén.
Mivel az MQTT egy általános célú üzenet fogadó és továbbító megoldás így használható különböző kommunikációs módokat használó IOT, okosotthon eszközök okosotthon központ alkalmazásokba történő egységes bekötésére. Azonban az MQTT általánosabb megközelítést kínál, amely széles körben alkalmazható különféle IoT projektekben is.
Összegzésképpen, az MQTT rugalmas, alacsony erőforrásigényű, és könnyen integrálható megoldást nyújt az okosotthon eszközök összekapcsolására és menedzselésére egy közvetítő rétegen használatával.
Z-Wave és Zigbee eszközök bekötése MQTT rendszer alá
Annak bemutatásaként, hogy miként kell különböző eszközöket bekötni az MQTT rendszerekbe alább olvasható.
A mintamegoldást Docker alapokon készítettem elő, hozzá tartozó konfigurációs file-ok alább láthatók.
Rabbit MQ
version: '3'
services:
rabbitmq:
image: 'rabbitmq:3-management'
container_name: rabbitmq
restart: unless-stopped
environment:
- HOSTNAME=rabbitmq-host
networks:
- rabbitmq-network
ports:
- "1883:1883"
- "5683:5683/udp" # CoAP port
- "5684:5684/udp" # CoAPS port (ha szükséges lenne)
- "5672:5672"
- "25672:25672"
- "15672:15672"
- "15692:15692"
volumes:
- "/opt/docker/rabbitmq/config:/etc/rabbitmq"
- "/opt/docker/rabbitmq/var:/var/lib/rabbitmq"
- "$PWD/rabbitmq_lvc_exchange-3.12.0.ez:/plugins/rabbitmq_lvc_exchange-3.12.0.ez"
networks:
rabbitmq-network:
driver: bridge
Az alábbi könyvtár struktúra tartozik a docker alapú megvalósításhoz az /opt/docker/rabbitmq/config könyvtár alatt.
(a docker-compose és docker megoldások ismertetése, használatának bemutatása nem volt cél)
.
├── conf.d
│ └── 10-defaults.conf
├── definitions.json
├── enabled_plugins
└── rabbitmq.conf
a könyvtárakban a file-ok tartalma:
root@mqtt-bridge:/opt/docker/rabbitmq/config# cat rabbitmq.conf
deprecated_features.permit.management_metrics_collection = true
mqtt.allow_anonymous = true
mqtt.vhost = rabbitmq_vhost
mqtt.exchange = amq.topic
mqtt.prefetch = 10
management.load_definitions = /etc/rabbitmq/definitions.json
root@mqtt-bridge:/opt/docker/rabbitmq/config# cat enabled_plugins
[rabbitmq_management,rabbitmq_prometheus,rabbitmq_mqtt,rabbitmq_lvc_exchange].
root@mqtt-bridge:/opt/docker/rabbitmq/config# cat definitions.json
{
"vhosts": [
{
"name": "rabbitmq_vhost"
}
],
"users": [
{
"name": "admin",
"password": "*****",
"tags": "administrator"
},
{
"name": "guest",
"password": "*****",
"tags": ""
}
],
"permissions": [
{
"user": "guest",
"vhost": "rabbitmq_vhost",
"configure": "amq.topic|mqtt-subscription-.*",
"write": ".*",
"read": ".*"
},
{
"user": "admin",
"vhost": "rabbitmq_vhost",
"configure": ".*",
"write": ".*",
"read": ".*"
}
],
"parameters": [],
"policies": [],
"queues": [],
"exchanges": [],
"bindings": []
}
root@mqtt-bridge:/opt/docker/rabbitmq/config# cat conf.d/10-defaults.conf
## DEFAULT SETTINGS ARE NOT MEANT TO BE TAKEN STRAIGHT INTO PRODUCTION
## see https://www.rabbitmq.com/configure.html for further information
## on configuring RabbitMQ
## allow access to the guest user from anywhere on the network
## https://www.rabbitmq.com/access-control.html#loopback-users
## https://www.rabbitmq.com/production-checklist.html#users
loopback_users.guest = false
## Send all logs to stdout/TTY. Necessary to see logs when running via
## a container
log.console = true
Ha minden sikeres volt az indítás, akkor meg kell jellenie a docker container-ek közt a rabbitmq konténernek.
rabbitmq:3-management "docker-entrypoint.s…" 12 days ago Up 5 hours 4369/tcp, 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp, 0.0.0.0:15692->15692/tcp, :::15692->15692/tcp, 0.0.0.0:25672->25672/tcp, :::25672->25672/tcp, 15691/tcp, 0.0.0.0:5683-5684->5683-5684/udp, :::5683-5684->5683-5684/udp rabbitmq
és a hozzá tartozó WEB-es felület bejelentkezve a definitions.json file-ban megadott jelszóval az alábbihoz hasonló felület érhető el.
Ezzel az MQTT broker elő i s van készítve a következő lépésekhez…
Zigbee2MQTT
Zigbee2MQTT egy olyan opensource alkalmazás ami kapcsolatot biztosít a Zigbee-s eszközök és az MQTT message queue kezelő rendszer közt mint köztes réteg. Jelenleg több mint 400(!) gyártó több ezer termékét támogatja…
Bővebben a Zigbee2MQTT-ről: https://www.zigbee2mqtt.io
version: '3.8'
services:
zigbee2mqtt:
container_name: zigbee2mqtt
image: koenkk/zigbee2mqtt
restart: unless-stopped
privileged: true
# group_add:
# - dialout
# user: 1000:1000
volumes:
- /opt/docker/zigbee2mqtt/data:/app/data
- /run/udev:/run/udev:ro
ports:
# Frontend port
- 8080:8080
environment:
- TZ=Europe/Budapest
devices:
# Make sure this matched your adapter location
- /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0:/dev/zigbee
Természetesen az üresen telepített Zigbee2MQTT rendszer nem tartalmazza a környezetében lévő Zigbee-s eszközöket és további konfigurációt igényel.
Ahhoz hogy miképp kell beállítani, hogy kell a Zigbee-s eszközöket párosítani a használt Zigbee adapterrel, részletesen megtalálható a készítői oldalakon: https://www.zigbee2mqtt.io/guide/getting-started
Z-Wave2MQTT
version: '3.7'
services:
zwave-js-ui:
container_name: zwave-js-ui
image: zwavejs/zwave-js-ui:latest
restart: unless-stopped
tty: true
stop_signal: SIGINT
environment:
- SESSION_SECRET=*****************
- ZWAVEJS_EXTERNAL_CONFIG=/usr/src/app/store/.config-db
- TZ=Europe/Budapest
networks:
- zwave-lan
devices:
- '/dev/serial/by-id/usb-Silicon_Labs_CP2102N_USB_to_UART_Bridge_Controller_90cf85ed4985ed11bd5dc69f9d1cc348-if00-port0:/dev/zwave'
volumes:
- /opt/docker/zwave2mqtt:/usr/src/app/store
ports:
- '8091:8091' # port for web interface
- '3000:3000' # port for Z-Wave JS websocket server
networks:
zwave-lan:
driver: bridge
Ebben az esetben a sikeres indítás után a WEB-es felület a 8091-es porton érhető el, és az alábbihoz hasonló képet mutat:
Az ismerettőnek ebben a részében sem tértem ki a részletes konfigurálásra, beüzemelésre, mivel az alkalmazás WEB oldalán részletes, naprakész leírás található róla: https://zwave-js.github.io/zwave-js-ui/#/usage/setup
És valóban működik?
Következő lépésként „már csak” az okosotthon vezérlő központokban kell bekonfigurálni, hogy használják az adott MQTT központot az adatok eléréséhez és felhasználásához…
Többekben felmerülhet a kérdés, hogy mi értelme ennek mikor pl. egy HomeAssistant alapú rendszer a fentiekből sok mindent megold és „nem kell vele foglakozni”…
Hirtelen két indok miért is célszerű a fentieket ismerni és kipróbálni:
- Megismerhetők a HA-s megoldás alapját adó technológiák részleteit.
Vigyázat! Nagyon mély a nyúl ürege… - Ha nem HomeAssistant-ot használ valaki központnak akkor nem szükséges még a HA-t is telepíteni-e, megismernie amennyiben a központja nem támogatja valamelyik típusú eszközöket, de az igény az meg lenne rá.
(persze az soha nem árt a szélesebb látókör)
és biztos számtalan további indokot fel lehetne még felsorolni…