© PXimport

MQTT: hét protocol voor domotica

Alarmsystemen

Geplaatst: 31 augustus 2022 - 09:37

Aangepast: 25 november 2022 - 11:47

Koen Vervloesem

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.

© PXimport

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.

© PXimport

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.

© PXimport

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.

© PXimport

Conventies over de naamgeving

© PXimport

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.

© PXimport

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.

© PXimport

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.

© PXimport

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

© PXimport

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.

© PXimport

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.

© PXimport

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.

© PXimport

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.

© PXimport

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.

© PXimport

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.

© PXimport

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.

© PXimport

OpenMQTTGateway

© PXimport

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.

© PXimport

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

Deel dit artikel
Reageer op dit artikel
Voeg toe aan favorieten
Wat vond je van dit artikel?

Aanbevolen voor jou

ID.nl logo

ID.nl, onderdeel van Reshift BV, is in 2022 gestart en uitgegroeid tot de meest toonaangevende en complete consumentensite van Nederland. Het doel van ID.nl is om de consument te helpen met alle technologie die hoort bij het dagelijks leven: van smart-health-meters tot e-bikes, van warmtepompen tot zonnepanelen - en alles daar tussenin!

Duidelijk, betrouwbaar en onafhankelijk: ID.nl maakt moeilijke dingen makkelijk.

Contact

ID.nl

Nijverheidsweg 18

2031 CP Haarlem

info@id.nl

Telefoon: 023-5430000