HowTo: FHEM – MQTT-apparaten maken

In het artikel RaspberryPi - Installeer MQTT-server op de RaspberryPi Ik heb wat geschreven over MQTT en uitgelegd hoe je je eigen MQTT-server op de RaspberryPi kunt installeren.

Om een MQTT server van FHEM te kunnen gebruiken, moet je een paar FHEM modules installeren. In het volgende artikel heb ik beschreven hoe je dit doet en waar je op moet letten.


Veiligheidsinstructies

Ik weet dat de volgende opmerkingen altijd een beetje vervelend zijn en onnodig lijken. Helaas hebben veel mensen die "beter" wisten door onvoorzichtigheid ogen, vingers of andere dingen verloren of zichzelf verwond. Gegevensverlies is in vergelijking bijna te verwaarlozen, maar zelfs dit kan erg vervelend zijn. Neem daarom vijf minuten de tijd om de veiligheidsinstructies te lezen. Omdat zelfs het coolste project geen blessure of andere problemen waard is.
https://www.nerdiy.de/sicherheitshinweise/

Affiliate links / reclame links

De hier vermelde links naar online winkels zijn zogenaamde affiliate-links. Als u op zo'n affiliate-link klikt en via deze link een aankoop doet, ontvangt Nerdiy.de een commissie van de betreffende onlineshop of aanbieder. De prijs verandert voor jou niet. Als u via deze links uw aankopen doet, steunt u Nerdiy.de om in de toekomst andere nuttige projecten aan te kunnen bieden. 🙂 


Eisen

Voordat je aan dit artikel begint, moet je de RaspberryPi zo hebben voorbereid dat deze via het netwerk bereikbaar en via SSH te bedienen is.

In de volgende drie artikelen wordt beschreven wat er moet gebeuren om de RaspberryPi voor te bereiden:
RaspberryPi – setup voor nerds!
RaspberryPi – De eerste configuratie!
RaspberryPi – Bedien de RaspberryPi via SSH
Je eigen slimme huis - installatie en aan de slag met FHEM
Mosquitto op de Raspberry - Installeer MQTT-server op de RaspberryPi

Gereedschap nodig:
-Nee-

Benodigde materialen:

In de volgende lijst vindt u alle onderdelen die u nodig heeft om dit artikel te implementeren.


Log in op de RaspberryPi via SSH

Om te beginnen moet je eerst inloggen op de Rasp Pi met Putty via SSH. Hoe je dit doet staat in het artikel RaspberryPi - Bedien de RaspberryPi via SSH beschreven.

Na het invoeren van uw gebruikersnaam en wachtwoord kunt u de eerste opdrachten invoeren.

Pakketbeheer updaten

Het pakketbeheer in Linux is een "centrale plek" van waaruit verschillende softwarepakketten kunnen worden geïnstalleerd. Om dit betrouwbaar te laten werken, moeten de lijsten en bronnen van het pakketbeheer worden bijgewerkt voor elke installatie van nieuwe pakketten.

Om de update van het pakketbeheer te starten, moet u de volgende opdracht invoeren.
sudo apt-get update && sudo apt-get upgrade
Afhankelijk van hoe lang geleden uw laatste update van het pakketbeheer was, kan dit proces nu even duren. De lijsten die naar de afzonderlijke pakketbronnen verwijzen, worden eerst bijgewerkt.
Daarna worden de pakketten zelf bijgewerkt. Aangezien extra geheugen bezet is, wordt u opnieuw om uw toestemming gevraagd. Je moet dit bevestigen met een "J" en "Enter".
Zodra de update is voltooid, ziet u een korte samenvatting van de duur en omvang van de update.

Installeer Perl MQTT-pakketten

Om FHEM te laten communiceren met de MQTT server moeten er twee Perl pakketten geïnstalleerd worden.

Log hiervoor in op de RasPi met Putty en voer het volgende commando in.
sudo apt-get install libmodule-pluggable-perl && sudo cpan install Net::MQTT:Simple && sudo cpan install Net::MQTT:Constants
Die Warnung, dass dadurch zusätzlicher Speicherplatz belegt wird quittiert Ihr mit einem “J” und “Enter”.

Die Nachfrage “Would you like to configure as much as possible automatically? [yes]” bestaetigt ihr mit “yes” und Enter.
De installatie van de twee pakketten kostte me ongeveer vijf minuten. Dat is genoeg tijd om een nieuwe koffie te halen 🙂 .


MQTT-clients maken

Om in de volgende stap een verbinding op te zetten met een MQTT-apparaat, moet eerst een MQTT-client worden aangemaakt. Deze zal later de nodige gegevens opslaan voor de verbinding met de MQTT-server.

Voer hiervoor de volgende opdracht in de opdrachtprompt van uw FHEM-instantie in.
definieer mqttClient MQTT 192.168.0.1:1883

Der Befehl zum erstellen eines MQTT-Clienten entspricht dabei der folgenden “define Name-des-mqtt-clienten MQTT host-oder-ip-des-mqtt-servers:port-des-servers”. Hat Euer MQTT-Server also die IP-Adresse “192.168.0.1”, den Port 1883 was dem Standardport für MQTT entspricht) so lautet der Befehl zum erstellen des MQTT-Clienten “define mqttClient MQTT 192.168.0.1:1883”. Dabei kann für “mqttClient” natürlich auch jeder andere beliebige Name verwendet werden.

Klickt nun oben links auf “Save config” und startet Euren FHEM-Server mithilfe des folgenden Befehls neu.
afsluiten opnieuw opstarten

Nadat de server opnieuw is opgestart, bent u klaar om nieuwe MQTT-bridges en -apparaten te maken.

Weergave van de nieuw aangemaakte MQTT-client. Hier kun je zien of er een verbinding met de MQTT-server tot stand kon worden gebracht. Daarnaast wordt verdere informatie over de verbinding met de MQTT-server weergegeven.
Damit die gemachten Änderungen übernommen und dauerhaft gespeichert bleiben müsst Ihr unbedingt daran denken auf “Save config” zu klicken. Dadurch werden die geänderten Einstellungen dauerhaft in der Konfigurationsdatei gespeichert.

Instellen van de MQTT-bridge met als voorbeeld een MAX!-verwarmingsthermostaat

In dit voorbeeld maken we een MQTT bridge. Zoals de naam al zegt, verbindt de MQTT bridge iets met elkaar. In dit geval de MAX! verwarmingsthermostaat met de MQTT wereld. In principe werkt deze koppeling volgens hetzelfde schema met alle sensoren of actuatoren die al geïnstalleerd zijn. In het geval van de MAX! verwarmingsthermostaat werkt dit met het volgende commando.

Die Struktur des Befehls ist dabei wie folgt aufgebaut “define Name-der-mqtt-bridge MQTT_BRIDGE Name-des-sensors-bzw-aktors”. Im Fall des MAX! Heizungsthermostats mit dem Namen “MAX_15504f” lautet der Befehl also folgendermaßen.
defineHeatingWorkroomMqtt MQTT_BRIDGE MAX_15504f

Dadurch wird das Modul “HeizungArbeitszimmerMqtt” vom Typ “MQTT_BRIDGE” angelegt und mit dem bereits vorhandenen Modul “MAX_15504f” verknüpft.

Die erstellte MQTT_BRIDGE befindet sich nun im Raum “Unsorted”. Wechselt in diesen Raum und öffnet die Detailansicht der erstellten MQTT-Bridge.
U kunt nu alle informatie over de aangemaakte MQTT bridge zien in de gedetailleerde weergave. Echter, voordat de MQTT bridge gegevens van de MAX! verwarmingsthermostaat kan verbinden met de MQTT wereld, moet het eerst weten welke uitlezing van de verwarmingsthermostaat gekoppeld moet worden met welk MQTT topic.

Dazu gibt es das Attribut “publishReading_XYZ”. Dieses bewirkt, dass die MQTT-Bridge alle Aktualisierungen auf dem Reading “XYZ” automatisch an das angegebene Topic weitergeleitet wird.

Gebt also folgenden Befehl in die Befehlseingabe Eurer FHEM-Instanz ein um automatisch jede aktualisierung des Readings “temperature” an das Topic “heizung/Arbeitszimmer/temperature” weiterleiten zu lassen.
attr HeizArbeitszimmerMqtt publishReading_temperature heizung/Arbeitszimmer/temperature

Achtet hierbei darauf, dass “publishReading” und “temperature”(das reading des Heizkörperthermostats(oder jedes anderen Sensors/Aktors)) mit einem Unterstrich verbunden sein müssen. So ergibt sich “publishReading_temperature”.
Für das Reading “Battery” würde das ganze dann folgendermaßen aussehen.

attr HeizArbeitszimmerMqtt publishReading_battery heizung/Arbeitszimmer/battery
Deze koppeling van uitlezing en MQTT topics werkt ook andersom. Om ervoor te zorgen dat waarden die naar een MQTT topic worden verzonden automatisch worden opgenomen in een uitlezing van de verwarmingsthermostaat, moet je het volgende attribuut instellen.
attr HeizArbeitszimmerMqtt subscribeSet_desiredTemperature heizung/Arbeitszimmer/desiredTemperature

Dies bewirkt, dass das Topic “heizung/Arbeitszimmer/desiredTemperature” aboniert wird und jeder darauf eingehender Wert automatisch in das Reading “desiredTemperature” eingetragen wird. Auf diesem Wege könnt Ihr die gewünschte Temperatur des Heizungsthermostats per MQTT-Nachricht steuern.

Die Detailansicht Eurer MQTT-Bridge sollte nun so aussehen. Ihr seht unter Attributes alle verknüpften Reading/MQTT-Topic Kombinationen. Denkt wieder daran diese Änderung der Konfiguration durch einen Klick auf “Save config” abzuspeichern.

De ingestelde MQTT-brug testen

Een manier om de zojuist aangemaakte MQTT bridge te testen wordt hier beschreven.

Hiervoor heb ik in NodeRed een mini MQTT-viewer gemaakt die je de waarden voor de ingestelde onderwerpen laat zien “heizung/Arbeitszimmer/temperature” en “heizung/Arbeitszimmer/battery” kan worden verzonden. Daarnaast heb je de mogelijkheid om naar het onderwerp “heizung/Arbeitszimmer/desiredTemperature” om de waarde 25 te versturen. Dit heeft tot gevolg dat - als alles correct werkt - de gekoppelde radiatorthermostaat wordt ingesteld op 25°C.

Zuerst prüfen wir nun ob der Empfang und die Übernahme von per MQTT empfangenen Werten funktioniert. Wechselt dazu in den Raum “MAX” und dann in die Detailansicht des jeweiligen Heizungsthermostats.
Scroll in de gedetailleerde weergave naar beneden totdat je de pagina Lezen ... ziet.

… “desiredTemperature” findet. Dies ist das Reading, dass wir in der Konfiguration der MQTT-Bridge mit dem MQTT-Topic “heizung/Arbeitszimmer/desiredTemperature” hebben gekoppeld. De huidige waarde van de meting en de tijd van de laatste update worden hier ook weergegeven.

Als je nu in de zelfgebouwde MQTT-viewer op de inject-node klikt, stuur je de waarde 25 naar de topic “heizung/Arbeitszimmer/desiredTemperature”. Hierdoor wordt ook de waarde van je verwarmingsthermostaat bijgewerkt naar de waarde 25. Bovendien wordt de tijd van de laatste update ingesteld op de huidige tijd.

Om de omgekeerde methode te testen - d.w.z. de publicatie van een gewijzigde uitlezing op een MQTT topic - is het voldoende om naar boven te scrollen in de detailweergave van de MAX! verwarmingsthermostaat. Wijzig daar de gewenste temperatuur van uw verwarmingsthermostaat zoals weergegeven.

Dies löst automatisch eine aktualisierung des Readings “battery” aus. Durch die Verknüpfung der MQTT-Bridge mit dem Topic “heizung/Arbeitszimmer/battery” de waarde ervan wordt dan naar wens gepubliceerd via het onderwerp en is dan zichtbaar via de geconfigureerde debug-node in je NodeRed-omgeving.

Een MQTT-apparaat maken met een temperatuursensor als voorbeeld

Een andere optie van de MQTT-module is het aanmaken van MQTT-apparaten. Dit omvat alle sensoren of apparaten die hun meetwaarden rechtstreeks via MQTT versturen. Je moet een MQTT-apparaat aanmaken zodat je deze waarden kunt opnemen en combineren in een virtuele sensor.

In diesem Beispiel haben wir in unserem Netzwerk einen Temperatursensor, der in regelmäßigen Abständen den gemessenen Temperaturwert per MQTT-Topic “Umgebungsdaten/keller/Temp” versendet. Um diesen nun zu erfassen wird zuerst mit folgendem Befehl ein MQTT-Device angelegt.

definieer kellerSensor MQTT_DEVICE
Der Befehl setzt sich dabei wieder wie folgt zusammen “define Name-des-Mqtt-Devices MQTT_DEVICE”. Da wir in diesem Beispiel einen Temperatursensor einbinden der sich im Keller befindet nennen wir das MQTT_DEVICE “kellerSensor. Der komplette Befehl zum erstellen des MQTT_Devices lautet also “Umgebungsdaten/keller/Temp”.
Nach dem Ihr das MQTT_Device erstellt habt findet Ihr diesen im Raum “Unsorted”. Darüber könnt Ihr auch die abgebildete Detailansicht öffnen.

Bevor dieses MQTT_Device nun Werte anzeigen kann muss es natürlich zuerst mit dem gewünschten MQTT-Topic verknüpft werden. In diesem Beispiel wollen wir alle auf dem MQTT-Topic “Umgebungsdaten/keller/Temp” eingehenden Werte im erstellten MQTT-Device anzeigen lassen.

Om dit te doen, moet je het volgende attribuut instellen:

attr kellerSensor subscribeReading_Temp Omgevingsgegevens/keller/Temp

Dies bewirkt, dass im erstellten MQTT_Device “kellerSensor” das Reading “Temp” erstellt und mit dem abonierten Topic “Umgebungsdaten/keller/Temp” verknüpft wird.

In der Ansicht der Readings taucht nun also auch das Reading “Temp” mit dem aktuellen bzw. zuletzt empfangenen Wert und dem Datum der letzten Aktualisierung auf.

Um die Ansicht nun noch etwas aufzuhübschen könnt Ihr mit folgendem Attribut angeben, dass dem Wert des Readings Temp ein “°C” angehängt werden soll.

attr kellerSensor statusFormaat Temp °C
Gebt dazu den Befehl “attr kellerSensor stateFormat Temp °C” in die Befehlszeile Eurer FHEM-Instanz ein.
Dadurch wird die aktuelle Temperatur des “kellerSensors” nun auch mit einem “°C” versehen und es ist direkt ersichtlich, dass es sich dabei um einen Temperaturwert handelt.

Verdere informatie

https://wiki.fhem.de/wiki/MQTT_Einf%C3%BChrung


Veel plezier met het project

Ik hoop dat alles werkte zoals beschreven. Zo niet, of als je vragen of suggesties hebt, laat het me weten in de commentaren. Ik zal dit dan zo nodig aan het artikel toevoegen.
Ideeën voor nieuwe projecten zijn altijd welkom. 🙂

PS Veel van deze projecten - vooral de hardwareprojecten - kosten veel tijd en geld. Natuurlijk doe ik dit omdat ik het leuk vind, maar als je het cool vindt dat ik de informatie met je deel, dan zou ik blij zijn met een kleine donatie aan het koffiefonds. 🙂

Koop Me a Coffee op ko-fi.com       

Een reactie

  1. Hallo Fab
    Heel erg bedankt voor alle informatie die je hier beschikbaar hebt gesteld. Ik heb vele jaren bij de thuisassistent doorgebracht en helemaal geen tijd bij FHEM, die ik nu gebruik om te proberen mijn FHT-verwarmingsapparaten beter onder controle te krijgen. Als ik FHEM kan laten communiceren met een bestaande MQTT-server, zou dat mijn droom zijn.

    Ik heb FHEM draaiend op Raspian OS in een docker-container, de installatie verliep volgens uw advies zonder fouten - maar wanneer ik de commando's probeer in te voeren via de FHEM-webfrontend, krijg ik Kan module MQTT_BRIDGE niet laden of Kan module MQTT_CLIENT niet laden, waardoor ik denk je dat ik er een puinhoop van heb gemaakt door de perl/mqtt niet vanuit de docker-container te installeren of dat ik niet iets binnen FHEM heb gedaan om de nieuwe MQTT-mogelijkheid op te roepen?

    Met vriendelijke groeten

    Nick

Kommentar hinterlassen

Het e-mailadres wordt niet gepubliceerd. Erforderliche Felder sind mit * markiert


De verificatie periode van reCAPTCHA is verlopen. Laad de pagina opnieuw.