Hauptmenü

jsonlist2 und LogFile

Begonnen von AlexSchei, 31 Oktober 2015, 13:29:33

Vorheriges Thema - Nächstes Thema

AlexSchei

Hallo,

ich bin grad dabei eine Funktion zu programmieren mit der ich aus einer Liste von Geräten (Temperatursensoren) die durchschnittliche Temperatur berechne. Funktioniert auch soweit. Aber...


sub
AvgRegExDevices($$$$)
{
# Mittelwert bilden über mehrere Geräte anhand von Regular Expression auf den Namen
    # regex, dateiname, eigenschaft(z.B. temperature), gerätename ( welcher Name soll im Logfile verwendet werden? )
my ($regex,$file,$eigenschaft,$device) = @_;
    my $alles = fhem("list ".$regex);
    my @zeilen = split("\n",$alles);
    my $temp = 0.0;
    my $i = 0;
    my $summe = 0.0;
    foreach(@zeilen)
    {
    $temp = ReadingsVal($_,$eigenschaft,"-"  );
    if ( $temp ne "-" )
        {
        $i++;
            $summe += $temp;
        }
    }
    $i = ( $i == 0 )? 1 : $i ;
    WriteLogFile($file,$device,sprintf("%-6.2f",($summe/$i)));
    return 0;
}


Ich frage mit fhem("list ".$regex); die Gerätenamen ab. Die dann mit ReadingsVal nach der Temperatur gefragt werden. Jetzt hab ich gesehen das mit jsonlist2 die werte gleich komplett abgefragt werden können. Da war ich grad am probieren.

Hier meine Fragen:
1. Beim Aufruf von fhem("list..."); oder fhem("jsonlist2..."); wird jedesmal ein Logfile-Eintrag mit dem Ergebnis des Befehls erstellt. Wie kann ich das unterbinden?
2. Gibt es eine Möglichkeit die beiden Befehle (list, jsonlist und vllt. auch andere) direkt im PERL aufzurufen (ohne fhem(); )? Wobei mir hier ein Hinweis auf die Dokumentation der Funktionen/API hinreichen würde. <-- Habe noch nicht ausführliches darüber gefunden, trotz Google.

Vielen Dank für Eure Hinweise!
Gruß as BS
AlexSchei
Intel Nuc mit Proxmox — KNX

justme1968

in eigenem perl code sollte man devspec2array verwenden um devices zu filtern. nicht über fhem(...) ein list aufrufen.

auch fur jsonlist gilt das es ein umweg ist aus perl code fhem(...) aufzurufen um dann per jsonlist einen json string zu bekommen den du erst wieder parsen (lassen) musst. zumal json kein natives perl format ist. jsonlist und xmllist sind zur kommunikation nach aussen gedacht. sie intern zu verwenden erzeugt nur unnötigen overhead.

mit list kann man übrigens auch ein reading auslesen: list .* temperature.

im prinzip kannst du alle eingebauten kommandos über eine CommandXXX routine aufrufen. siehe fhem.pl. das funktioniert aber nur bei den fest eingebauten kommandos. manche anderen wie z.b. auch JsonList werden dynamisch erst dann nach geladen wenn sie gebraucht werden und stehen beim direkten aufruf eventuell noch nicht zur verfügung.


devspev2array und eine schleife über ReadingsVal ist der richtige weg. mit devspec2array ist übrigens nicht nur das filtern nach namen sondern auch nach allen möglichen anderen kriterien möglich (siehe commandref zu devspec).

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

AlexSchei

Hallo andre,

der Hinweis auf devspec2array ist genau das was ich gesucht habe. Vielen Dank! Die fhem.pl werd ich mir dann auch mal anschauen müssen... ;) Wird bestimmt spannend!  :D
Intel Nuc mit Proxmox — KNX