Door Koen Vervloesem

Freelanceredacteur

Raspberry Pi als brein van je smarthome

Deel 3: zelf domoticasoftware koppelen

23-11-2021 • 06:00

55

Singlepage-opmaak

MQTT: diensten met elkaar laten communiceren

Naast een uniforme manier om smarthomediensten te draaien, heb je ook een uniforme manier nodig om ze met elkaar te laten communiceren. Een veelgebruikt protocol daarvoor is MQTT: Message Queuing Telemetry Transport, een Oasis-standaard. Centraal bij MQTT staat de broker, een server die alle communicatie regelt. De clients die met die broker zijn verbonden, hoeven elkaar niet te kennen. Ze communiceren via de broker.

Die communicatie verloopt via topics: hiërarchische namen die bestaan uit onderdelen gescheiden door een /, bijvoorbeeld: 'thuis/badkamer/temperatuur'. Een client zoals een temperatuursensor kan data publiceren op dit topic. Een andere client, zoals het dashboard van je domoticasysteem, kan zich inschrijven op dit topic en ontvangt dan telkens als een client op dit topic iets publiceert, van de broker de data.

Voorbeeld van MQTT-prototol zonder QoS

Clients communiceren met elkaar via de MQTT-broker. Bron: Simon A. Eugster, Wikimedia Commons, CC BY-SA 4.0

MQTT-topics kunnen ook wildcards hebben. Als een client bijvoorbeeld data van alle temperatuursensoren in huis wil ontvangen, schrijft die zich in op het topic 'thuis/+/temperatuur'. De + staat voor een willekeurige component in één niveau van het topic. Er is ook de wildcard # die voor een of meer niveaus staat. Wil je bijvoorbeeld alle data ontvangen van topics die met 'thuis' beginnen, dan schrijf je je in op het topic 'thuis/#'.

Er is geen algemeen geldende structuur van topics; ieder project kan zijn eigen structuur opleggen. Wel bestaan er conventies. Zo heeft Home Assistant zijn conventies die MQTT discovery mogelijk maken. Alle apparaten die deze conventies volgen, worden door Home Assistant automatisch ontdekt als ze met dezelfde MQTT-broker verbonden zijn. Een andere conventie is Homie, dat als structuur voor het topic 'homie/device/node/property' oplegt. Op de website van Homie vind je een lijst met apparaten en controllers die de Homie-conventie implementeren.

Mosquitto

De bekendste MQTT-broker is Mosquitto, een project van de Eclipse Foundation dat wordt gesponsord door Cedalo. Je kunt deze broker op diverse manieren installeren. Draai je al Home Assistant, dan is het eenvoudigste om daarin de add-on Mosquitto te installeren. Je kunt Mosquitto ook in Raspberry Pi OS installeren met de pakketbeheerder apt, maar een andere optie is via Docker. Het Docker Compose-bestand daarvoor zag je eerder al.

Dan hoef je alleen nog maar de broker te configureren met een bestand mosquitto.conf in de directory './containers/mosquitto/config'. Een eenvoudige configuratie zonder encryptie en zonder gebruikersbeheer ziet er als volgt uit:

listener 1883 persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log allow_anonymous true

De laatste regel is sinds Mosquitto 2.0 verplicht als je verbindingen zonder gebruikersnaam en wachtwoord wilt toelaten. Let dus op als je naar voorbeeldconfiguraties zoekt; de configuraties die in oudere bronnen van vóór Mosquitto 2.0 worden vermeld, bevatten deze regel doorgaans niet. Het gaat hier dus om een eenvoudige configuratie zonder authenticatie. Zoals gezegd gaan we in een volgend artikel dieper in op de beveiliging van je smarthome met de Raspberry Pi als centraal onderdeel.

MQTT-boodschappen bekijken

Om te testen of je MQTT-opstelling werkt, kun je diverse commandline- of grafische MQTT-clients gebruiken. Zo kun je op je Raspberry Pi zelf het pakket 'mosquitto-clients' installeren, waarna je de beschikking hebt tot de opdrachten 'mosquitto_sub' en 'mosquitto_pub'.

Met mosquitto_sub schrijf je je in op een topic, waarna de opdracht alle binnenkomende boodschappen op dat topic toont:

mosquitto_sub -t 'thuis/+/temperatuur' -v

Met de optie '-v' wordt vóór de boodschap ook het topic getoond. Je kunt deze opdracht ook op een andere Linux-computer uitvoeren, maar dan moet je met '-h HOSTNAME' verwijzen naar de hostname van de MQTT-broker.

Boodschappen publiceren op een topic doe je met 'mosquitto_pub':

mosquitto_pub -t 'thuis/slaapkamer/temperatuur' -m '21.5'

Uiteraard bestaan er ook grafische MQTT-clients, die je dan op je pc uitvoert. Twee populaire zijn MQTT.fx en MQTT Explorer. Beide bestaan voor Windows, macOS en Linux. Je kunt er ook zelf MQTT-boodschappen mee versturen.

MQTT Explorer

Met MQTT Explorer bekijk je eenvoudig alle boodschappen die je MQTT-broker verwerkt.

Bt-mqtt-gateway

Er bestaan heel wat apparaten die via bluetooth low energy aan te sturen of uit te lezen zijn. Bijna altijd worden deze producten geleverd met een mobiele app, maar met de juiste software kun je ze vaak ook met je Raspberry Pi koppelen. Een voorbeeld van dergelijke software is bt-mqtt-gateway, dat onder andere de slimme thermostaat eQ-3 ondersteunt, de Xiaomi Mi Scale, de Linak Desk, de plantensensor Xiaomi Mi Flora en tandenborstels van Oral-B. Het project biedt ook een Docker Compose-bestand aan. Merk op dat de container het hostnetwerk moet gebruiken en extra rechten 'NET_ADMIN' en 'NET_RAW' nodig heeft voor toegang tot de bluetoothadapter. Het configuratiebestand van bt-mqtt-gateway zelf moet je aanpassen aan de bluetoothapparaten die je gebruikt. De repository bevat een voorbeeldconfiguratiebestand waarin alle ondersteunde apparaten staan. Verwijder gewoon de apparaten die je niet hebt.

Als je daarna de container met bt-mqtt-gateway start, pikt die sensordata op via bluetooth en stuurt deze door naar je MQTT-broker, op topics als 'bt-mqtt-gateway/ruuvitag/slaapkamer/temperature'.