JSON Datensatz in FHEM zusammenstellen und in Datei schreiben?

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

Vorheriges Thema - Nächstes Thema

TubeHead

Hallo in die Runde,

(ich habe es mal unter "Sonstiges" abgelegt, da ich nicht genau wusste, wohin ich es packen soll. Nötigenfalls bitte verschieben...)

Für das Lesen von JSON Daten aus Webseiten u.ä. gibt es ja das Modul "JsonMod".
Aber gibt es auch eine Möglichkeit die ganze Sache umgedreht zu gestalten?

Also z.B. ein DOIF mit Zeitsteuerung, welches periodisch die Daten verschiedenster Geräte einsammelt und dann "JSON-Key:value" zusammenbastelt und in eine physische Datei schreibt?


TomLee

Hallo,

so in etwa und das Ergebnis dann mit FileWrite in eine Datei schreiben:

my @devices = ("Devicename1", "Devicename2", "Devicename3");
my @result;

foreach my $name (@devices) {
    next unless defined($defs{$name});

    push @result, {
        device   => $name,
        status   => ReadingsVal($name, "state", "unknown"),
        occupied => ReadingsVal($name, "occupied", "0"),
        battery  => ReadingsVal($name, "battery", undef),
    };
}

my $json = encode_json(\@result);

Braucht man gar kein DOIF dazu, geht mit einem einfachen at.

Gruss Thomas

TubeHead


rudolfkoenig

encode_json benoetigt "use JSON", was zwar viele Module laden, aber bei weitem nicht alle.

Eine Alternative dazu ist toJSON, was im fhem.pl implementiert ist, z.Bsp. als toJSON($defs{WEB}), oder als toJSON(@result) aus dem obigen Beispiel.

TubeHead


betateilchen

Zitat von: TubeHead am 03 Juli 2026, 17:04:50ufff... jetzt bin ich überfordert  ::)

Warum? Einfach in der Zeile

my $json = encode_json(\@result);
den Funktionsaufruf ersetzen, wie von Rudi vorgeschlagen:

my $json = toJSON(@result);
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#6
Zitatufff... jetzt bin ich überfordert  ::)


Kann dann so aussehen:

##############################################
# $Id: myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;
use strict;
use warnings;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.


sub DevToJson {
    my @devices = @_;                      # Übergebene Devicenamen aus @_ in ein eigenes Array kopieren
    my @result;                            # Leeres Array anlegen, das später die Hashrefs enthält
    for my $name (@devices) {              # Über jeden übergebenen Devicenamen iterieren
        next if !defined($defs{$name}); # Überspringen, falls das Device in FHEM nicht existiert (kein Eintrag in %defs)
        push @result, {                    # Neue Hashref für dieses Device ans @result-Array anhängen
            device   => $name,             # Devicename ergänzen
            status   => ReadingsVal($name, 'status', 'error')  # Reading "status" auslesen, Default "error" falls nicht vorhanden
        };
    }
    FileWrite("/opt/fhem/fhemdevstates.json", toJSON(\@result));  # JSON direkt erzeugen und in die Datei schreiben (überschreibt den Inhalt)
}
;


define MeineAktion at +*02:02:00 {DevToJson("Devicename1","Devicename2","Devicename3")}
  • Freuen das alles copy/paste klappt...