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 ein 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 wie ich 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 Datei im FHEM resp. auf dem System mit FHEM irgendwo abgelegt zuzugreifen, hat man schon die halbe Miete (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 Unser "Tester" 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 zyklichen Abfrage der Geräte mit den Sensordaten

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


* 99_myUtils.pm

In der Date ist folgendes Codesegment einzutragen:


# JSON für Telemetrie zusammenbauen
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
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, dann 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 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 gesetzen 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 Sc hluss 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