HowTo: Sensorik aus FHEM -> JSON -> WebDesk -> MeshCOM

Begonnen von TubeHead, 06 August 2026, 20:44:41

Vorheriges Thema - Nächstes Thema

TubeHead

Vorwort

Wer sich mal mit MeshCOM beschäftigt (lizensierten Amateurfunkern vorbehalten), wird vermutlich auch auf die Idee kommen, an die vorhandene Hardware, ob nun von LilyGo oder wem auch immer, Sensorik per I²C o.ä. anzuschließen und verwerten zu lassen; die Firmware ist dafür ausgelegt, um diese Sensordaten als Telemetrie, ähnlich einem Beacon, in das Mesh auszusenden.
Aber wenn man einen Node stationär als Repeater und/oder Gateway betreibt, wird sich die Hardware meist auf dem Dachboden direkt unter der Antenne befinden. Und ein daran angeschlossener Sensor für Temperatur, Luftfeuchte und Luftdruck, wie z.B. ein BME280, würde auf dem Dachboden, vom Luftdruck mal abgesehen, ziemlichen Quatsch ins Mesh senden...
Wer aber eine Hausautomation am Laufen hat, in meinem Fall FHEM, der hat meist alle korrekten Sensordaten bereits vorliegen von der an FHEM gebundenen Sensorik. Warum also nicht diese Daten nehmen und irgendwie der MeshCOM-FW überbügeln?
Die Sache geht sicherlich auch aus FHEM direkt in die Firmware. Aber wer zudem WebDesk als Dienst auf einem NAS am laufen hat, ist im Grunde fein raus. Denn WebDesk bietet bereits einen zeitgesteuerten Import von Telemetriedaten im JSON-Format (Einstellungen/Telemetrie). Und wenn man es hinbekommt, von der WebDesk-Instanz auf eine von FHEM generierte JSON-Datei zuzugreifen, hat man schon mal die halbe Miete beisammen (in meinem Fall trivial, da FHEM und WebDesk auf dem gleichen System laufen).

Problem

... ist nur, wie man aus FHEM eine passende JSON zusammenbauen kann, die WebDesk auch verdauen mag. Und da ist mir das FHEM-Forum und vor allem der User "TomLee" beigesprungen und hat letztlich eine Lösung in Perl zusammengebaut, die genau das tut.

HowTo

Benötigt werden eigentlich nur drei Dinge:
- FHEM verfügt über die benötigten Sensordaten
- Ein Codesegment in der 99_myUtils.pm
- Ein AT Kommando zur zyklischen Abfrage der Geräte mit den Sensordaten

Quelle und Danksagungen: https://forum.fhem.de/index.php?topic=145058


* 99_myUtils.pm

In der Datei ist folgendes Codesegment einzutragen:


.
.
.
# Enter you functions below _this_ line.

# JSON für Telemetrie zusammenbauen
sub DevToJsonFlat {
  my ($file, @specs) = @_;                        # 1. Argument = Dateiname, alle weiteren = "Device:Reading[:JsonKey]"
  my %out;                                        # flaches Hash: JsonKey => Zahl

  for (@specs) {
    my ($d,$r,$n) = split(':',$_,3);              # Spec zerlegen: Device, Reading, optionaler JsonKey (3 = max. 3 Teile)
    my $v = ReadingsNum($d,$r,'');                # Zahl holen, Einheiten fallen weg; fehlendes Reading -> Leerstring
    next if $v !~ /^-?\d+(?:\.\d+)?$/;            # nichts Zaehlbares -> Schluessel gar nicht erst anlegen
    $out{$n // $d.'_'.$r} = $v;                  # ohne JsonKey als Fallback "Device_Reading"
  }

#  $out{timestamp} = POSIX::strftime("%Y-%m-%dT%H:%M:%S%z", localtime);
#  $out{timestamp} =~ s/(\d{2})(\d{2})$/$1:$2/;    # +0200 -> +02:00 (ISO 8601)

  my $json = toJSON(\%out);                      # Hashref serialisieren -> flaches JSON-Objekt (quotet alles als String)
  $json =~ s/:"(-?\d+(?:\.\d+)?)"/:$1/g;          # Quotes nur um reine Zahlen entfernen, Zeitstempel bleibt String

  FileWrite({FileName=>$file}, $json);            # schreiben (ueberschreibt den bisherigen Inhalt)
}
1;

Anmerkungen dazu:
1.: Sollte schon Code in der Datei vorhanden sein, am Ende anfügen.
2.: Den Timestamp habe ich auskommentiert, da der von der WebDesk-Importfunktion (noch) nicht ausgewertet werden kann.



* FHEM AT-Device anlegen

defmod Tele2JSON at +*01:00:00 {DevToJsonFlat("/opt/fhem/telemetry.json","TMP:state:tmp","HUM:state:hum","wetter:pressure:prs","wetter:wind:wds","wetter:windDir:wdr")}
attr Tele2JSON group MQTT
attr Tele2JSON room 980 - Umwelt

setstate Tele2JSON Next: 20:39:00
setstate Tele2JSON 2026-08-06 19:39:00 state Next: 20:39:00

Anmerkungen dazu:
1.: Der Name "Tele2JSON" kann natürlich den eigenen Gegebenheiten/Wünschen angepasst werden, ebenso wie Interval & Co.
2.: Zu beachten und korrekt zu setzen ist der Pfad und der gewünschte Dateiname im Funktionsaufruf. Bei mir halt direkt im FHEM-Root
3.: Die einzusammelnden Werte der verschiedenen Geräte sind kommagetrennt, wobei die Syntax "Device:Reading:JSON-Key" lautet. Mit anderen Worten: Der Wert aus "Reading" des Gerätes "Device" wird in der JSON-Datei dem Schlüssel mit dem Namen "JSON-Key" zugeordnet.


* Eintrag in WebDesk

WebGUI von WebDesk aufrufen, Einstellungen / Telemetrie aufrufen.
Dort ist im Feld "JSON-Datei" der Pfad und Dateiname anzugeben, in welchem WebDesk die von FHEM produzierte Datei finden kann.
Bei "Ziel" ist hier im meinem Fall die Gruppe #26299 vorgegeben. #[Landeskenner]99 ist allgemein für Telemetrie gedacht; zumindest in Europa. Deutschland ist sich da noch uneins und es wird kontrovers diskutiert. Näheres dazu im Netz oder in meinem Blog dj4xi.de
Bei Sendezeit ist eine entsprechende Uhrzeit(en) anzugeben, zu der die Telemetrie ins Mesh abgesetzt werden soll.
Native Telemetrie nicht aktivieren!
Unter "Messwert-Zuordnung" werden nun die in die JSON geschriebenen Werte mit dem in FHEM gesetzten Key unter "JSON-Key" eingetragen. der Bezeichner ist wahlfrei, sollte aber schon erkennen lassen, was gemeint ist. Aufgrund des geringen Payload des Mesh sind hier lange Worte eigentlich tabu...
Was in "Einheit" gehört, erklärt sich von selbst. Nun kann man noch die Anzahl der Dezimalstellen vorgeben, die ausgesendet werden sollen und, falls vorhanden, ein passendes Icon.
Nach einem Klick auf "Datei Lesen & Vorschau" sollte darunter alles grün und sauber dargestellt werden, was sich so in der JSON befindet. Ganz zum Schluss findet man dann noch die entsprechende LoRa Nachricht, wie sie mit dem Prefix TEL gesendet wird.

Nun noch aktivieren, ganz nach unten scrollen, speichern und freuen...


73 de Micha, DJ4XI

betateilchen

Zitat von: TubeHead am 06 August 2026, 20:16:47Die Verbindung Amateurfunk und FHEM ist ja doch schon doch etwas selten...

Hier im Forum ist das zumindest nichts außergewöhnliches, es gibt hier auch schon Anbindungen von FHEM an APRS, sowohl für Standortdaten als auch für Wetterstationen.

Zitat von: TubeHead am 06 August 2026, 20:44:41da ist mir das FHEM-Forum und vor allem der User "Tester" beigesprungen und hat letztlich eine Lösung in Perl zusammengebaut

Ehre, wem Ehre gebührt, aber der User, der Dir dabei geholfen hat, heißt nicht "Tester", sondern "TomLee"
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TubeHead

Zitates gibt hier auch schon Anbindungen von FHEM an APRS
Stimmt. Ist mir ohne explizite Suche danach nicht aufgefallen...

Zitataber der User, der Dir dabei geholfen hat, heißt nicht "Tester", sondern "TomLee"
:o  8)  Stimmt ebenso... Hatte ich wohl zu wenig Kaffee; korrigiere ich sogleich... (Notiz an mich: Keine langen Texte schreiben wenn müde...)
Danke für den Hinweis!