Hallo
hier mein JSON String:
{"ZbReceived":{"0xFF41":{"Device":"0xFF41","CurrentPositionLiftPercentage":0,"Endpoint":1,"LinkQuality":139}}}
Wie bekomme ich die 0xFF41 als Rückgabewert?
Mich würden die Lösungen für beide Einträge interessieren also den Key und den Device Value
Doppelte Post werden nicht gerne gesehen.
Verlinke sie wenigstens gegenseitig.
Das eine ist das Thema mit der Jsonmap hier geht es um die grundsätzliche Frage wie das geht, habe gestern 2 Stunden versucht es hinzubekommen und nicht geschafft, weiß noch nicht wo das Problem liegt
Du hast aber bei JSONMAP schon nach einer Alternative gefragt.
Wenn dir hier jemand JSONMAP vorschlägt...
Normalerweise ein Problem ein Thread, außer jemand bittet dich das separat zu behandeln, dann ist aber der "Verweis" im alten Thema vorhanden.
In Jsonmap wollte ich keine Alternative sondern wissen was ich falsch mache, sollte doch so gehen wie ich es gemacht habe. Oder?
Hier der Post um den es geht:
https://forum.fhem.de/index.php?topic=135067.0
Mit JSONMAP sollte es funktionieren. Bei mir funktioniert es mir mehreren Zeilen, wie geschrieben.
...du merkst, dass wir gerade parallel schreiben...
https://forum.fhem.de/index.php?topic=135067 (https://forum.fhem.de/index.php?topic=135067)
Wir schreiben parallel weil wir gerade um die jsonmap diskutieren, hier sollte es aber darum gehen wie ich die Device ID heraus bekomme. Also anderes Thema.
ZitatWie bekomme ich die 0xFF41 als Rückgabewert?
Wie ist das zu verstehen?
Wollte ggf das json2nameValue ersetzen durch ein Perl Programm, scheitere aber schon den Readinglist Eintrag dafür hinzubekommen.
so geht es nicht:
tele/tasmota2zigbee/FF41/SENSOR:.* {my $decode=decode_json($EVENT); $decode->{ZbReceived}{$decode->{ZbReceived}->{Device} }
Wenn Du die Key Values als Reading setzen willst musst Du auch die Funktion dafür nehmen.
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Readings_/_Events
Klingt ja recht kompliziert.
Da ist es wahrscheinlich einfacher den Event an ein Perl Utility Programm zu übergeben und dort dann über setreading die Werte zu setzen. Aber auch bei Perl habe ich das Problem habe dann wie ich die einzelnen key - value Paare bekommen. Habe schon einige Stunden mit Google verbracht aber noch kein Ergebnis. Auch meine Versuche ein externes Perl Programm zu schreiben um aus einem vorgegeben Event die Werte herauszubekommen hatten bisher kein Erfolg, außer der Erste Key Eintrag "ZbReceived". Den brauche ich aber nicht. Ich bräuchte mal eine Hilfe wie ich gezielt einzelnen Werte bekomme. Alle Werte gehen mit einer Schleife dafür gibt es viele Beispiele, aber die Verschachtelten scheinen einzeln ein bisschen trickreich oder zu einfach.
ZitatKlingt ja recht kompliziert.
Man koennte vmtl. zielgerichteter helfen, wenn man wuesste, was die _eigentliche_ Aufgabe ist.
Zitat von: Medel am 23 September 2023, 13:27:39Klingt ja recht kompliziert.
Da ist es wahrscheinlich einfacher den Event an ein Perl Utility Programm zu übergeben und dort dann über setreading die Werte zu setzen. Aber auch bei Perl habe ich das Problem habe dann wie ich die einzelnen key - value Paare bekommen. Habe schon einige Stunden mit Google verbracht aber noch kein Ergebnis. Auch meine Versuche ein externes Perl Programm zu schreiben um aus einem vorgegeben Event die Werte herauszubekommen hatten bisher kein Erfolg, außer der Erste Key Eintrag "ZbReceived". Den brauche ich aber nicht. Ich bräuchte mal eine Hilfe wie ich gezielt einzelnen Werte bekomme. Alle Werte gehen mit einer Schleife dafür gibt es viele Beispiele, aber die Verschachtelten scheinen einzeln ein bisschen trickreich oder zu einfach.
Du musst den Hash ausgeben. Machst Du das. Am einfachsten mit print.
print 'DeviceId: ' . $decode->{ZbReceived}->{0xFF41}->{Device} . "\n";
print 'CurrentPositionLiftPercentage: ' . $decode->{ZbReceived}->{0xFF41}->{CurrentPositionLiftPercentage} . "\n";
ZitatIch bräuchte mal eine Hilfe wie ich gezielt einzelnen Werte bekomme.
tele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{Device...(0x[0-9a-fA-F]{4})\"} ? { bla=>$1 } : return }
tele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{CurrentPositionLiftPercentage..(\d+)} ? { CurrentPositionLiftPercentage=>$1 } : return }
tele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{Endpoint..(\d+)} ? { Endpoint=>$1 } : return }
tele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{LinkQuality..(\d+)} ? { LinkQuality=>$1 } : return }
Zitatprint 'DeviceId: ' . $decode->{ZbReceived}->{0xFF41}->{Device} . "\n";
print 'CurrentPositionLiftPercentage: ' . $decode->{ZbReceived}->{0xFF41}->{CurrentPositionLiftPercentage} . "\n";
Das hatte ich auch schon so ähnlich - geht nicht:
Use of uninitialized value in concatenation (.) or string at ./Perltest.pl line 10.
DeviceId:
Use of uninitialized value in concatenation (.) or string at ./Perltest.pl line 11.
CurrentPositionLiftPercentage:
Wird denn Dein Hash überhaupt gefüllt?
Habe gerade die Lösung entdeckt.
die ersten zwei Keys müssen in "" eingeschlossen werden.
print 'DeviceId: ' . $decode->{"ZbReceived"}->{"0xFF41"}->{Device} . "\n";
print 'CurrentPositionLiftPercentage: ' . $decode->{"ZbReceived"}->{"0xFF41"}->{CurrentPositionLiftPercentage} . "\n";
Zitat von: rudolfkoenig am 23 September 2023, 13:46:34Man koennte vmtl. zielgerichteter helfen, wenn man wuesste, was die _eigentliche_ Aufgabe ist.
Auf dem großen Sofa hier ist noch Platz, setz Dich gerne dazu.
Popcorn ist genug da...
Nur falls es jemand braucht wenn man auch das Device aus dem Event übernehmen will ging es bei mir so
Event:
{"ZbReceived":{"0xFF41":{"Device":"0xFF41","CurrentPositionLiftPercentage":0,"Endpoint":1,"LinkQuality":139}}}
Auswertung:
print 'CurrentPositionLiftPercentage: ' . $decode->{"ZbReceived"}->{(keys%{$decode->{ZbReceived}})[0]}->{CurrentPositionLiftPercentage} . "\n";
Zitattele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{Device...(0x[0-9a-fA-F]{4})\"} ? { bla=>$1 } : return }
tele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{CurrentPositionLiftPercentage..(\d+)} ? { CurrentPositionLiftPercentage=>$1 } : return }
tele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{Endpoint..(\d+)} ? { Endpoint=>$1 } : return }
tele/tasmota2zigbee/FF41/SENSOR:.* { $EVENT =~ m{LinkQuality..(\d+)} ? { LinkQuality=>$1 } : return }
Danke wäre die kürzere Lösung als Alternative zu json2nameValue siehe: https://forum.fhem.de/index.php?topic=135067.0
In #8 sah es für mich so aus das du das gleiche auch hier vor hattest.
Was machst du denn jetzt mit dem zurückgegebenen Wert ?
Wollte nach dem das mit der jsonmap, Link weiter oben, nicht funktioniert hat, eine Perl Funktion schreiben der ich dann nur den Event übergeben hätte und die dann die ensprechenden Readings in das Device eingetragen hätte. Aber die Variante von dir gefiel mir jetzt doch besser so dass ich in einem meiner zwei Test Devices diese eingetragen habe. Habe aber die andere Lösung noch nicht ganz verworfen. Wären weniger Einträge pro Device. Werde sie auf jeden Fall abspeichern falls ich das noch mal brauche, habe schließlich einige Stunden danach gesucht.
Nochmals Danke für die Lösung.