MQTT: hét protocol voor domotica

Door: koen-vervloesem | 13 januari 2021 09:07

domotica
How To

Er bestaan talloze domoticaprotocollen, maar uiteindelijk moet je ze allemaal aan elkaar knopen in één oplossing. MQTT (Message Queuing Telemetry Transport) is sinds jaar en dag hét protocol om boodschappen uit te wisselen op het gebied van het Internet of Things en domotica. Wat is het, hoe werkt het en hoe ga je ermee aan de slag in je eigen huis?

Als je een tijdje met domotica bezig bent, dan heb je waarschijnlijk apparaten in huis die allerlei protocollen gebruiken: Z-Wave, ZigBee, Thread, KNX, maar ook wifi en bluetooth zijn voor domotica bruikbaar. Dat levert al snel een taalbarrière op vanwege alle apparaten die hun eigen taaltje spreken. Fabrikanten dachten daar iets op te hebben gevonden: ze ontwikkelden hun eigen domoticaplatformen die al deze standaarden ondersteunden. Zo heb je HomeKit van Apple, SmartThings van Samsung … Een groep bedrijven waaronder Apple, Google, Amazon en de ZigBee Alliance werken sinds kort samen aan een nieuwe standaard: Project Connected Home over IP. Maar we vragen ons af of die platformen zo dan wel lekker met elkaar gaan samenwerken. En dat terwijl er al twintig jaar een open protocol bestaat om op een gestandaardiseerde manier boodschappen uit te wisselen via ip-netwerken: MQTT (Message Queuing Telemetry Transport).

01 Message Queuing Telemetry Transport

MQTT is ontwikkeld door IBM als een protocol dat efficiënt gebruikmaakt van de beschikbare netwerkbandbreedte en allerlei soorten data kan doorsturen. In MQTT staat de broker (de server) centraal, die de communicatie tussen zenders en ontvangers in goede banen leidt. Die zenders en ontvangers (de clients dus) worden in het MQTT-protocol publishers (uitgevers) en subscribers (abonnees) genoemd.

01 MQTT is een open standaard voor IoT-toepassingen om boodschappen uit te wisselen.

02 Boodschappen uitwisselen

Een broker kan meerdere clients hebben en elke client kan ook zowel zenden als ontvangen. Eigenlijk werkt de broker als tussenpartij zodat zenders en ontvangers niet van elkaars bestaan hoeven af te weten om boodschappen uit te wisselen.

Dat gaat als volgt: elke MQTT-boodschap heeft een onderwerp (topic) en een inhoud (payload). Een client die in een onderwerp geïnteresseerd is, abonneert zich daarop bij de broker. Een client die een boodschap wil sturen, publiceert zijn inhoud door een boodschap met een specifiek onderwerp naar de broker te sturen. Zodra de broker een boodschap ontvangt, stuurt hij die door naar alle clients die op dat onderwerp zijn geabonneerd.

02 MQTT werkt met een broker die clients boodschappen laat publiceren en ontvangen (bron: mqtt.org).

03 Onderwerpen zoals url’s

Een ‘onderwerp’ in MQTT is vergelijkbaar met wat een url voor het web is. Zoals elke webpagina op het web een unieke url heeft, heeft elke eigenschap die je op MQTT wilt publiceren een uniek onderwerp. En net zoals bij een url heeft een MQTT-onderwerp een hiërarchische naam met onderdelen die van elkaar worden gescheiden door een /. Er is wel een belangrijk verschil: een onderwerp start nooit met een /.

Een ander verschil met url’s is dat er geen vastgelegde topdomeinen zijn. Elke toepassing is vrij om een hiërarchie te kiezen. Een domoticatoepassing als Home Assistant doet dat door de onderwerpen voor de toestand van zijn componenten van de volgende vorm te maken: <discovery_prefix>/<component>/[<node_id>/]<object_id>/state.

Daarbij is discovery_prefix standaard gelijk aan homeassistant, component het type component, zoals binary_sensor enzovoort. Een voorbeeld van een onderwerp is homeassistant/sensor/slaapkamer_temperature/state, die als inhoud de temperatuur van een temperatuursensor in de slaapkamer bevat, zoals 18.7.

03 Home Assistant structureert de MQTT-onderwerpen hiërarchisch.

04 Wildcards

MQTT gebruikt ook wildcards voor onderwerpen. Een client die in alle onderwerpen onder homeassistant/sensor/slaapkamer_temperature is geïnteresseerd, abonneert zich dan op homeassistant/sensor/slaapkamer_temperature/#. Hij krijgt dan ook boodschappen over de onderwerpen homeassistant/sensor/slaapkamer_temperature/last_updated, homeassistant/sensor/slaapkamer_temperature/last_changed enzovoort.

En als een client in alle onderwerpen van Home Assistant is geïnteresseerd is, abonneert hij zich op homeassistant/#. De wildcard # komt dus overeen met alle componenten vanaf dat niveau in de hiërarchie van het onderwerp. Het ultieme wildcard-onderwerp is #: hiermee ontvangt een client álle berichten van de MQTT-broker.

Soms is een client geïnteresseerd in alle onderwerpen met een specifieke naam van het onderste niveau, ongeacht van het niveau erboven. Daarvoor gebruik je de wildcard +, die overeenkomt met alle componenten van het onderwerp op het huidige niveau. Zo abonneer je je bijvoorbeeld eenvoudig op de boodschappen over de laatste veranderingen van alle sensors in Home Assistant: homeassistant/sensor/+/last_changed.

04 Via wildcards kunnen clients op een flexibele manier boodschappen publiceren en ontvangen.

Conventies over de naamgeving

Omdat MQTT niets voorschrijft over de naamgeving van de onderwerpen, kiezen verschillende systemen hun eigen naamgeving. Gelukkig zijn er enkele conventies ontstaan. Een vroege conventie die door heel wat software wordt gevolgd, was mqtt-smarthome, maar dit project is de laatste jaren niet zo actief meer. Een recenter project is Homie. Dat is nog niet echt doorgebroken, maar wel veelbelovend. En uiteraard hebben ook domoticaplatformen zoals Home Assistant hun eigen MQTT-conventies. De bedoeling van zulke conventies is dat domotica-apparaten automatisch worden ontdekt, geconfigureerd en gebruikt, zodat ze plug-and-play met je domoticacontroller samenwerken.

Homie is een recente conventie voor MQTT-onderwerpen.

05 MQTT-broker in de cloud

De gemakkelijkste manier om met MQTT aan de slag te gaan, is gebruik te maken van een MQTT-broker in de cloud. Dan hoef je zelf geen MQTT-broker te installeren, maar het nadeel is dat je van je internetverbinding afhankelijk bent. Voor een domoticasysteem is dat niet ideaal: als je internetverbinding uitvalt, werken je apparaten die via MQTT communiceren niet meer. Bovendien moet je erop vertrouwen dat de clouddienst de toegang tot zijn broker goed beveiligt.

Maar om te experimenteren met MQTT is een MQTT-broker in de cloud een goed begin. Dat kan bijvoorbeeld met Adafruit IO, een platform van Adafruit om eenvoudig sensordata naar de cloud te sturen. Maak een gratis account aan met een klik op Get Started for Free bovenaan rechts. Met dit gratis account kun je dertig datapunten per minuut verwerken, krijg je dertig dagen gratis opslag en heb je toegang tot vijf feeds. Nadat je ingelogd bent, klik je rechtsboven op View AIO Key. Laat deze pagina even open staan, want deze gegevens dien je dadelijk te kopiëren.

Bij Adafruit IO moet je nog iets speciaals doen omdat het extra beperkingen oplegt aan de MQTT-boodschappen. Je moet in de webinterface een nieuwe feed aanmaken en kijk daarna in de feedinformatie naar het bijbehorende MQTT-onderwerp. Die gebruikt de vorm gebruikersnaam/feeds/feed-key. Volg bijvoorbeeld de workshop over Adafruit IO, waarin je een vochtsensor via een ESP8266 gegevens naar Adafruit IO laat sturen.

05 Adafruit IO is een cloudplatform voor IoT met ingebouwde MQTT-broker.

06 MQTT Explorer

Als je eens wilt kijken welke boodschappen je MQTT-clients allemaal naar je broker sturen, dan is het handig om een gebruiksvriendelijke client te hebben. Bijvoorbeeld MQTT Explorer, dat zowel op Windows en macOS als op Linux draait.

In het venster van verbindingen dat na het opstarten verschijnt, klik je op het gele plusteken naast Connections om een nieuwe verbinding te definiëren. Geef de verbinding een naam (bijvoorbeeld Adafruit IO), zet Encryption (tls) aan, laat Protocol op mqtt:// staan, vul bij Host de hostname io.adafruit.com in en bij Port poortnummer 8883. Bij Username vul je je gebruikersnaam bij Adafruit IO in en bij Password je Adafruit IO-key. Klik dan op Advanced, verwijder de twee standaard aangemaakte abonnementen en voeg een abonnement toe op de wildcard gebruikersnaam/#. Keer terug naar het vorige venster, klik op Save om het profiel op te slaan en dan Connect om met de MQTT-broker te verbinden.

06 Stel in MQTT Explorer de verbinding met je MQTT-broker in.

07 Boodschappen verkennen

Als je nu een met Adafruit IO verbonden sensor een getal laat sturen naar de feed (of in de webinterface van Adafruit IO bij de feed op Add Data klikt), krijg je dat in MQTT Explorer te zien. Let overigens op, want het gratis account van Adafruit IO is beperkt tot dertig publicaties per minuut.

Maar je kunt de MQTT-verbinding ook eenvoudig uitproberen door in MQTT Explorer zelf een boodschap te publiceren. Vul rechts in het kader Publish bij Topic het onderwerp van een van je feeds in, vink raw aan en vul in het tekstveld eronder je boodschap in, zoals een meetwaarde. Klik daarna op Publish. Je ziet de boodschap nu links in MQTT Explorer verschijnen en als je in de webinterface van Adafruit IO kijkt, zie je het getal bij de feed.

07 MQTT Explorer toont ook grafieken van numerieke gegevens in MQTT-boodschappen.

08 Mosquitto installeren

Voor een domoticasysteem is het beter om zelf een MQTT-broker in huis te installeren: dan ben je niet afhankelijk van een andere partij of een werkende internetverbinding. De bekendste broker is Eclipse Mosquitto. Gebruik je Home Assistant als domoticaplatform, dan kun je Mosquitto daarin als add-on installeren.

Een andere optie is Docker, waarmee je een MQTT-broker op je Raspberry Pi of je nas draait. We gaan er in de volgende instructies van uit dat je Docker hebt geïnstalleerd. Zie bijvoorbeeld het artikel op onze website over Docker op de Raspberry Pi.

Maak eerst de directory’s aan waarin het programma zijn gegevens kan opslaan:

sudo mkdir -p /var/lib/mosquitto/{config,data,log}

Maak een configuratiebestand voor Mosquitto:

sudo nano /var/lib/mosquitto/config/mosquitto.conf

En plaats daarin de volgende regels:

port 1883

persistence true

persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log

Sla je wijzigingen op met Ctrl+O en sluit nano af met Ctrl+X. Download en start daarna de Docker-container van Mosquitto:

docker run -d --restart always -p 1883:1883 -v /var/lib/mosquitto:/mosquitto eclipse-mosquitto

Als je daarna de opdracht docker ps uitvoert, zie je de Docker-container draaien, ook na een herstart van je Raspberry Pi.

Maak nu een nieuw profiel in MQTT Explorer aan, vul de hostname of het ip-adres van je Raspberry Pi in en poortnummer 1883. In dit voorbeeld maken we geen gebruik van encryptie (TLS) en ook niet van een gebruikersnaam en wachtwoord.

MQTT-brokers om te testen

Wil je niet onmiddellijk een account bij een dienst aanmaken, dan kun je ook een gratis testserver zonder account gebruiken. Zo is er http://test.mosquitto.org. Bezoek je deze website, dan krijg je de benodigde verbindingsdetails te zien. Maak dan een profiel in MQTT Explorer met deze gegevens aan. Maar let op: iedereen kan alle boodschappen zien die naar deze MQTT-broker worden verstuurd. Stuur dus tijdens je test geen gevoelige gegevens in je boodschappen naar de broker.

De testserver van Mosquitto is ideaal om MQTT-clients te testen.

09 Home Assistant

Als je al een domoticasysteem hebt draaien, is het nuttig om dat te integreren met je MQTT-broker. We tonen hier hoe je dat doet in Home Assistant (als je niet de Mosquitto-add-on hebt geïnstalleerd). Open in de webinterface van Home Assistant het menu Configuration / Integrations, klik op het oranje icoontje van het plusteken rechts onderaan en kies MQTT in de lijst met integraties.

Vul dan de verbindingsgegevens van je MQTT-broker in en vink Enable discovery aan. Klik op Submit. Daarna luistert Home Assistant naar boodschappen die naar je MQTT-broker worden verstuurd. Dankzij het mechanisme voor MQTT-discovery ontdekt Home Assistant zelfs automatisch nieuwe apparaten op je netwerk als die de conventies van Home Assistant volgen voor MQTT-boodschappen (zie ook het kader ‘Conventies over de naamgeving’).

Aan de andere kant kan Home Assistant met zijn integratie MQTT Statestream ook veranderingen in toestanden als MQTT-boodschappen publiceren. Op die manier krijg je een integratie in twee richtingen tussen Home Assistant en je MQTT-broker.

09 Met MQTT-discovery herkent Home Assistant automatisch apparaten die de MQTT-conventies van het domoticaplatform volgen.

10 Node-RED

Ook Node-RED heeft een uitstekende ondersteuning voor MQTT. Zie onze basiscursus hoe je Node-RED installeert. Daarna kun je met de node mqtt in een Node-RED-flow laten reageren op een binnenkomende MQTT-boodschap.

Je definieert in de node het onderwerp waarnaar je luistert en de inhoud van de ontvangen boodschap wordt toegekend aan de payload van de node. Die kun je dan door andere nodes laten verwerken of in een dashboard tonen. Ook in de andere richting werkt het: met een node mqtt out kun je een MQTT-boodschap met een gegeven payload sturen naar een specifiek onderwerp. De nodes mqtt in als mqtt out vereisen beide dat je eerst een MQTT-broker met bijbehorende verbindingsinstellingen definieert.

10 Met de ‘mqtt in’-node kun je in Node-RED luisteren naar een MQTT-onderwerp.

11 Bluetooth

Heel wat goedkope sensors sturen hun gegevens door via bluetooth low energy. Zo kun je eenvoudig met een app op je smartphone de sensorgegevens uitlezen. Denk maar aan de Xiaomi Mi Flora-sensor die de temperatuur, lichtsterkte, grondvochtigheid en geleidbaarheid van de grond (een maat voor de hoeveelheid voedingsstoffen) meet. Xiaomi heeft ook bluetooth-thermometers, waarvan sommige zelfs met een e-ink-schermpje.

Deze en vele andere bluetoothsensors kun je met het programma bt-mqtt-gateway uitlezen op een Raspberry Pi. Het programma zet de meetgegevens dan om naar MQTT-boodschappen. Met de juiste configuratie, die je op de GitHub-pagina’s van bt-mqtt-gateway vindt, ontdekt Home Assistant zelfs automatisch de apparaten die door bt-mqtt-gateway worden uitgelezen.

11 Met bt-mqtt-gateway lees je bluetoothsensors uit.

12 Weersensors

Veel weersensors voor buiten, maar ook sommige temperatuursensors voor binnen, zenden hun meetgegevens op een radiofrequentie van 433,92 MHz. Dat is binnen de industriële, wetenschappelijke en medische frequentieband (ISM-band), die vrij mag worden gebruikt. Met een RTL-SDR-usb-dongel en bijbehorende antenne kun je alle sensors in en rond je huis uitlezen.

Dat doe je met de software rtl_433, die werkt op Windows, macOS en Linux (inclusief op een Raspberry Pi). Het programma herkent momenteel de protocollen van maar liefst 167 apparaten die in de ISM-band uitzenden. Het kan de ontvangen data ook naar een MQTT-broker sturen. Er is zelfs een Docker-container speciaal voor die taak, rtl_433toMQTT.

12 Met de RTL-SDR kun je onder meer signalen van weersensors ontvangen.

13 Z-Wave

Z-Wave is een draadloos mesh-protocol dat in Europa op een frequentie van 868,42 MHz werkt. Je hebt een speciale transceiver nodig om met de apparaten te communiceren. Je kunt die op een Raspberry Pi aansluiten, die dan als Z-Wave-gateway werkt. Mogelijke transceivers zijn de RaZberry die je op de gpio-header van de Pi bevestigt of een usb-transceiver zoals de Aeotec Z-Stick die je in een usb-poort van je Pi steekt.

Met Zwave2Mqtt op je Raspberry Pi vertaal je dan Z-Wave-boodschappen naar MQTT-boodschappen en omgekeerd. Op onze website vind je een cursus over de configuratie van Zwave2Mqtt. De software draait in Docker en biedt een webinterface waarmee je je Z-Wave-apparaten eenvoudig beheert. Er is ook integratie met MQTT-discovery van Home Assistant, zodat geconfigureerde apparaten automatisch in Home Assistant verschijnen.

13 Met Zwave2Mqtt en een Z-Wave-transceiver zoals de RaZberry praat je met je Z-Wave-apparaten via MQTT.

14 ZigBee

Ook ZigBee is een populair draadloos mesh-protocol. Onder andere de lampen van Philips Hue en IKEA Trådfri maken gebruik van de technologie. De apparaten zijn meestal iets goedkoper dan vergelijkbare Z-Wave-apparaten. Met Zigbee2MQTT vertaal je ZigBee-boodschappen naar MQTT-boodschappen en omgekeerd. Je hebt daar wel een speciale transceiver voor nodig. Zigbee2MQTT werkt het best met de CC2531-usb-sniffer. Je moet daar eerst aangepaste firmware op flashen met een speciale downloadkabel en enkele jumperwires. Daarna sluit je de CC2531 via een usb-kabel aan op je Raspberry Pi. Dat zorgt voor minder storing, omdat ZigBee op dezelfde frequentieband (2,4 GHz) werkt als bluetooth en wifi. Zigbee2MQTT heeft in zijn standaardconfiguratie al MQTT-discovery voor Home Assistant ingebouwd.

14 Zigbee2MQTT vertaalt ZigBee-boodschappen naar MQTT-boodschappen en omgekeerd.

15 KNX

Tot nu toe hebben we allemaal draadloze domoticaprotocollen besproken die je aan MQTT kunt koppelen, maar ook met bedrade protocollen zoals KNX is dit mogelijk. Zo is er knx-mqtt-bridge, die je rechtstreeks of in een Docker-container kunt draaien. KNX-boodschappen worden naar het MQTT-onderwerp knx/x/y/z geschreven, met x/y/z als het groepsadres. Waarden uit een groepsadres van KNX lezen, doe je door een MQTT-boodschap te sturen naar knx/x/y/z/read. En waarden naar een groepsadres schrijven, doe je met een boodschap naar knx/x/y/z/write.

Om dit project te gebruiken, heb je een KNX-ip-router nodig, die het KNX-netwerk met je computernetwerk verbindt. Knx-mqtt-bridge verbindt automatisch met je KNX-router via het multicast-adres. Je maakt het best in de ETS-software van je KNX-installatie een export van alle groepsadressen en hun datapunttypes. Naar dat xml-bestand verwijs je dan in het configuratiebestand van knx-mqtt-bridge. Op die manier worden waarden automatisch omgezet naar het juiste type vanuit hun ruwe waarden.

15 Met een KNX-ip-router en de software knx-mqtt-bridge bestuur je je KNX-apparaten via MQTT (bron: Gira).

OpenMQTTGateway

De projecten waarnaar we in deze cursus verwijzen draaien voornamelijk op een Raspberry Pi, maar er zijn ook heel wat projecten die op minder krachtige hardware draaien. Interessant is bijvoorbeeld OpenMQTTGateway, dat op een ESP32, ESP8266 of Arduino draait. Je sluit dan op je microcontrollerbordje transceivers aan voor 433,92MHz-golven, bluetooth low energy, infrarood of LORA. De software ontvangt al die sensordata en stuurt ze in de vorm van MQTT-boodschappen naar je broker. Het project heeft een lijst met ondersteunde apparaten. Het voordeel van OpenMQTTGateway is dat het op een microcontroller draait, die minder beheer vraagt dan een Raspberry Pi.

Met OpenMQTTGateway maak je van een microcontroller een gateway die draadloze sensordata naar MQTT-boodschappen vertaalt.

16 Loxone

Een ander bekend bedraad domoticaprotocol is Loxone. Met PyLoxone kun je ondersteuning voor Loxone toevoegen aan Home Assistant. Als je dan MQTT Statestream in Home Assistant inschakelt, worden alle statusupdates van je Loxone-apparaten ook als MQTT-boodschappen gepubliceerd. Je stelt in het configuratiebestand van PyLoxone het ip-adres, poortnummer, gebruikersnaam en wachtwoord voor je Loxone-miniserver in.

Een andere oplossing is LoxBerry. Dat is een opensource-project dat op de Raspberry Pi draait en de functies van je Loxone-miniserver uitbreidt met behulp van allerlei plug-ins. Een van die plug-ins is MQTT Gateway, die Mosquitto als MQTT-broker installeert, en Loxone-boodschappen naar MQTT-boodschappen vertaalt en andersom. Op die manier zijn je Loxone-apparaten ook eenvoudig te integreren met Home Assistant, Node-RED en andere domoticasoftware.

17 Encryptie

In de voorbeeldconfiguratie van Mosquitto (stap 8) verloopt alle MQTT-verkeer onversleuteld. Dat is te verantwoorden als je je hele thuisnetwerk vertrouwt, maar anders schakel je beter encryptie in. Daarvoor dien je een TLS-certificaat voor de computer waarop Mosquitto draait aan te maken. In de online documentatie van Mosquitto vind je de nodige instructies.

Zodra je in het configuratiebestand van Mosquitto het gebruik van TLS hebt ingesteld en de clients ook hebt geconfigureerd, is de communicatie tussen alle clients en de broker versleuteld. Let op: dit is geen end-to-end-encryptie. De server kan dus alle communicatie lezen, omdat er bij gebruik van MQTT altijd een centrale broker dient te zijn.

17 Met TLS versleutel je het verkeer van en naar je MQTT-broker.

18 Authenticatie en gebruikersrechten

In de standaardconfiguratie van Mosquitto kan iedereen op het netwerk zich abonneren op alle boodschappen om al het MQTT-verkeer af te luisteren. Dat kun je oplossen met authenticatie: je voegt gebruikers toe en maakt wachtwoorden voor hen aan, en stelt in dat Mosquitto alleen verbindingen van bekende gebruikers toestaat als ze zich met het juiste wachtwoord aanmelden.

Dat vul je dan nog aan met een toegangscontrolelijst. Daarin definieer je per gebruiker welke onderwerpen die gebruiker mag lezen en schrijven. Dat werkt ook hiërarchisch: zo kun je de gebruiker van Home Assistant lees- en schrijftoegang geven tot het wildcardonderwerp homeassistant/#, en de gebruiker van een dashboard om temperaturen weer te geven, beperken tot leestoegang tot de onderwerpen bt-mqtt-gateway/+/+/temperature en rtl433/+/+/+/temperature_C. Dankzij de flexibele hiërarchische opbouw van MQTT-onderwerpen is dat vrij eenvoudig.

MQTT over WebSocket

MQTT is ontworpen om over tcp/ip te draaien, meestal op poort 1883. Recentelijk is ook MQTT over WebSocket populair geworden, omdat dit het mogelijk maakt om rechtstreeks in een webbrowser via MQTT te communiceren. Daardoor kunnen webapplicaties dus met je MQTT-broker boodschappen uitwisselen. Een WebSocket-verbinding begint altijd als een http-aanvraag en schakelt dan over naar WebSocket. Een javascript-client in de web-app pakt de pakketten dan uit de WebSocket-laag uit en behandelt de MQTT-boodschappen die erin zitten. Andersom worden MQTT-boodschappen die de web-app wil sturen in een WebSocket-laag ingepakt en zo naar de MQTT-broker doorgestuurd. De broker moet dan uiteraard MQTT over WebSocket ondersteunen, wat bij populaire brokers zoals Mosquitto het geval is. MQTT over WebSocket verloopt meestal via poort 9001.

0 Reactie(s) op: MQTT: hét protocol voor domotica

  • Om te reageren moet je ingelogd zijn. Nog geen account? Registreer je dan en praat mee!
  • Er zijn nog geen reacties op dit artikel.

Wanneer je een reactie plaatst ga je akoord
met onze voorwaarden voor reacties.