FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: Medel am 22 September 2023, 22:12:37

Titel: (gelöst) Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 22 September 2023, 22:12:37
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
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: frober am 23 September 2023, 08:21:44
Doppelte Post werden nicht gerne gesehen.
Verlinke sie wenigstens gegenseitig.
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 08:47:03
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
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: frober am 23 September 2023, 08:59:53
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.
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 09:13:56
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
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: frober am 23 September 2023, 09:17:46
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)
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 10:13:16
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.
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: rudolfkoenig am 23 September 2023, 11:58:50
ZitatWie bekomme ich die 0xFF41 als Rückgabewert?
Wie ist das zu verstehen?
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 12:44:47
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} }
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: CoolTux am 23 September 2023, 13:04:45
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
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 13:27:39
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.
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: rudolfkoenig am 23 September 2023, 13:46:34
ZitatKlingt ja recht kompliziert.
Man koennte vmtl. zielgerichteter helfen, wenn man wuesste, was die _eigentliche_ Aufgabe ist.
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: CoolTux am 23 September 2023, 13:50:44
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";
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: TomLee am 23 September 2023, 14:30:41
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 }
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 15:25:26
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:

Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: CoolTux am 23 September 2023, 15:28:21
Wird denn Dein Hash überhaupt gefüllt?
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 15:36:45
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";
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: betateilchen am 23 September 2023, 15:45:57
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...
Titel: Aw: Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 16:06:50
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";
Titel: Aw: (gelöst) Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 16:31:23
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
Titel: Aw: (gelöst) Wie bekomme ich das Device aus dem JSON
Beitrag von: TomLee am 23 September 2023, 16:43:38
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 ?
Titel: Aw: (gelöst) Wie bekomme ich das Device aus dem JSON
Beitrag von: Medel am 23 September 2023, 19:45:17
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.