FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: kampi am 24 August 2020, 18:13:21

Titel: Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: kampi am 24 August 2020, 18:13:21
Hallo zusammen,

ich bin recht neu in der Materie rund um FHEM und daher weiß ich nicht ob dieser Bereich die richtige Anlaufstelle für diese Frage ist. Falls nicht bitte verschieben.

Zur Frage:
Ich habe eine FHEM-Instanz, die über verschiedene Sensoren Daten übermittelt bekommt. Diese Daten möchte ich nun per MQTT an eine ThingsBoard-Instanz versenden. Aktuell bin ich noch auf der Suche nach einer geeigneten Lösung um dies zu bewerkstelligen und habe mir als erstes diesen Link https://www.loxwiki.eu/display/LOXBERRY/MQTT+Gateway+-+Alle+FHEM-Readings+weitergeben (https://www.loxwiki.eu/display/LOXBERRY/MQTT+Gateway+-+Alle+FHEM-Readings+weitergeben) angeschaut um die Readings eines Raumes per MQTT zu verschicken. Das Problem an dieser Lösung ist, dass die Werte als einfache Textstrings versendet werden und ThingsBoard aber per Default ein JSON-String erwartet.
Gibt es eine Möglichkeit die erzeugte MQTT-Nachricht anzupassen und so ggf. einen JSON-String daraus zu machen oder kennt jemand ggf. eine andere Lösung um FHEM mit ThingsBoard zu verknüpfen?

Vielen Dank für die Hilfe.
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: rudolfkoenig am 24 August 2020, 21:19:22
Ich wuerde statt MQTT das neuere MQTT2_CLIENT Modul verwenden.

Um damit eine Nachricht an dem MQTT-Server zu senden, kann man "set mqtt2_client publish topic message" verwenden.
Beispiel:
defmod n notify n:temp.* { fhem "set mqtt2_client publish v1/devices/me/telemetry {\"temp\":\"$EVTPART1\"}" }

Wenn man mit "trigger n temp 17" einen passenden Event generiert, dann landet beim MQTT-Server unter Topic v1/devices/me/telemetry die Nachricht {"temp":"17"}

Je nach Geschmack (und Aufgabendetails, die hier nicht erwaehnt wurden) gibt es noch weitere Varianten, um das Problem mit FHEM zu loesen.
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: kampi am 24 August 2020, 21:31:33
Hallo Rudolf,

das hört sich doch schon echt brauchbar an (ich bin aktuell auch noch komplett flexibel was die Umsetzung angeht). Im Endeffekt geht es darum, dass eine beliebige Anzahl von enOcean-Geräte an eine FHEM-Instanz angeschlossen werden sollen (die landen dann auch alle in einem Raum) und dann sollen die Daten aller Sensoren in diesem Raum als JSON-String gepackt und versendet werden. Alternativ könnte ich mir auch vorstellen für jeden der Sensoren in dem Raum eine einzelne Nachricht abzusetzen, sprich bei 10 Sensoren werden in bestimmten Intervallen für jeden Sensor eine Nachricht geschickt, wobei z. B. der Sensorname und der Messwert übertragen werden soll.

Kann man das in FHEM auch automatisieren, also das jedes Gerät, welches einem Raum hinzugefügt wird, automatisch diese Konfiguration bekommt?
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: rudolfkoenig am 24 August 2020, 22:44:54
ZitatKann man das in FHEM auch automatisieren, also das jedes Gerät, welches einem Raum hinzugefügt wird, automatisch diese Konfiguration bekommt?

"Kann man" ist die falsche Frage (perl ist funktional vollstaendig), die bessere Frage ist, wie einfach und effizient eine Loesung ist.

Eine Moeglichkeit waere ein notify mit .* Regexp, was im Command-Teil mit AttrVal($NAME,"room","") eq "ThingsBoard"  prueft, ob fhem "set ... publish ... " losschickt.
Eine Andere geht ueber "defmod tbAt at 00:05 { thingsBoardSender() }", wobei thingsBoardSender eine Funktion in 99_myUtils.pm ist, und mit devspec2array("room=ThingsBoard") eine Schleife ueber alle passenden Geraete macht, eine weitere ueber alle Readings und hier "set ... publish ..." ausloest.

Du kannst auch MQTT_GENERIC_BRIDGE anschauen, evtl. passt Dir das besser.
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: kampi am 25 August 2020, 11:00:33
Zitat von: rudolfkoenig am 24 August 2020, 22:44:54
Eine Andere geht ueber "defmod tbAt at 00:05 { thingsBoardSender() }", wobei thingsBoardSender eine Funktion in 99_myUtils.pm ist, und mit devspec2array("room=ThingsBoard") eine Schleife ueber alle passenden Geraete macht, eine weitere ueber alle Readings und hier "set ... publish ..." ausloest.

Du kannst auch MQTT_GENERIC_BRIDGE anschauen, evtl. passt Dir das besser.

Das wäre eine Lösung, die mir sehr gut gefallen würde. Diesen Ansatz werde ich mal weiter verfolgen. Hast du ggf. ein paar weiterführende Informationen über die Funktionsweise, etc., sodass ich mich da mal etwas tiefer einlesen könnte?

Zitat von: rudolfkoenig am 24 August 2020, 22:44:54
Du kannst auch MQTT_GENERIC_BRIDGE anschauen, evtl. passt Dir das besser.

In wie fern? Was würde mir dieses Gerät für Vorteile bieten?
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: Beta-User am 26 August 2020, 07:07:26
Startpunkt zu myUtils-Code wäre der Artikel https://wiki.fhem.de/wiki/99_myUtils_anlegen. (Grundsätzlich stelle ich mir aber die Frage, ob es wirklich sinnvoll ist, alle x Sekunden ggf. dieselben Infos zu versenden?)

Mehr Infos und einen Link zu Anwendungsbeispielen zu MQTT_GENERIC_BRIDGE ist z.B. hier zu finden:
https://wiki.fhem.de/wiki/MQTT#MQTT_GENERIC_BRIDGE. Das arbeitet auch Event-basiert, d.h., es wird nur was gesendet, wenn ein Wert (in FHEM) aktualisiert wird.
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: kampi am 26 August 2020, 07:44:09
Danke für die Links.

Zitat von: Beta-User am 26 August 2020, 07:07:26
Startpunkt zu myUtils-Code wäre der Artikel https://wiki.fhem.de/wiki/99_myUtils_anlegen. (Grundsätzlich stelle ich mir aber die Frage, ob es wirklich sinnvoll ist, alle x Sekunden ggf. dieselben Infos zu versenden?)

Wie genau meinst du das? Am Ende habe ich Sensoren an der FHEM-Instanz und die sollen schon periodisch ausgelesen werden, sprich wenn der Messwert dann der gleiche Wert ist wie zum Zeitpunkt t - 1, dann wird er noch einmal versendet. Oder habe ich deine Frage ggf. falsch verstanden?
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: Thyraz am 26 August 2020, 07:49:09
Fhem ist Event-gesteuert und auf diese Events kann man reagieren.
Du musst also nicht in einem festen Zeitraster schicken, sondern kannst dies beim Auftreten eines entsprechenden Events tun.

Nur den eine neuen Wert zu schicken ist erstens effizienter als immer alle Werte,
und zweitens wird der neue Wert dann auch sofort übermittelt und nicht erst wenn dein nächster Intervall eintritt.
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: Beta-User am 26 August 2020, 08:11:59
Ergänzung zu dem, was Thyraz zutreffend ausgeführt hat: Schau einfach mal eine Zeitlang in den Event-Monitor (und dann in den gleichnamigen Wiki-Artikel), dann wird das ganze vermutlich etwas klarer.
Titel: Antw:Readings in einem eigenen Format per MQTT an ThingsBoard senden
Beitrag von: kampi am 26 August 2020, 09:01:46
Zitat von: Thyraz am 26 August 2020, 07:49:09
Fhem ist Event-gesteuert und auf diese Events kann man reagieren.
Du musst also nicht in einem festen Zeitraster schicken, sondern kannst dies beim Auftreten eines entsprechenden Events tun.

Nur den eine neuen Wert zu schicken ist erstens effizienter als immer alle Werte,
und zweitens wird der neue Wert dann auch sofort übermittelt und nicht erst wenn dein nächster Intervall eintritt.

Geschieht das Auslesen der enOcean-Geräte auch über ein Event (ich vermute ja)? Weil dann kann ich doch einfach auf das Event reagieren und sobald die Werte ausgelesen wurden diese Werte entsprechend formatiert weitersenden, oder?

Oder ich nehme direkt die MQTT_GENERIC_BRIDGE. Wenn ich das richtig verstanden habe, kann ich damit mein enOcean auf MQTT brücken. Besteht den bei dem Modul auch die Möglichkeit die MQTT-Nachricht anzupassen?