JSON Datensatz in FHEM zusammenstellen und in Datei schreiben?

Begonnen von TubeHead, 03 Juli 2026, 15:56:08

Vorheriges Thema - Nächstes Thema

TubeHead

Ach so! Du meintest im Link selber? Ich bin davon ausgegangen, das Du meine FHEM-Instanz meinst  :))

Und ja: Wenn ich das in Deine Instanz packe, erhalte ich selbiges Ergebnis

TomLee

Weil die Mühe die ich mir in der Demoinstallation gemacht habe morgen weg sein wird, halt ich meinen weiteren, erratenen Ansatz hier mal fest:

defmod Tele2JSON at +*00:01:00 {DevToJson("/opt/fhem/fhemdevstates.json","TMP:state","HUM:state","wetter:wind","wetter:pressure")}
sub DevToJson {
  my ($file, @specs) = @_;                        # 1. Argument = Dateiname, alle weiteren = "Device:Reading"-Angaben
  my (@out, %idx);                                # @out = spätere JSON-Liste, %idx = Merkhilfe "Device -> zugehörige Hashref"

  for (@specs) {                                  # über jede Spec-Angabe iterieren, aktueller Wert steht in $_
    my ($d,$r) = split(':',$_,2);                 # Spec am ersten Doppelpunkt trennen: $d = Device, $r = Reading (2 = max. 2 Teile)

    push @out, ($idx{$d} = {device=>$d})          # neue Hashref anlegen, in %idx merken UND (da Zuweisung die Ref zurückgibt) an @out anhängen
      if !$idx{$d};                               #   ... aber nur, wenn dieses Device noch kein Objekt hat

    $idx{$d}{$r} = ReadingsVal($d,$r,'error');         # Reading auslesen (Default: error) und im Device-Objekt unter dem Reading-Namen ablegen
  }

  my $json = toJSON(\@out);                       # Array-Referenz von FHEM serialisieren lassen -> JSON-String (quotet alles als String)
  $json =~ s/:"(-?\d+(?:\.\d+)?)"/:$1/g;          # nachträglich die Quotes um reine Zahlenwerte entfernen; führender ":" trifft nur Werte, nie Schlüssel

  FileWrite({FileName=>$file}, $json);            # JSON-String in die Datei schreiben (überschreibt den bisherigen Inhalt)
}