Autor Thema: Erklärung zu json2nameValue / MQTT readingList Json - bestimmte Elemente filtern  (Gelesen 3922 mal)

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16301
Nachdem Rudi das mit dem filter repariert hat, solltest du eigentlich hier anknüpfen können:
Ok, jetzt habe ich das selber zusammengefrickelt; da war noch ein kleiner Typo drin, der ist auch im anderen Beitrag korrigiert.

Hier mal ein RAW von dem, was man da bekommt, wenn man erst die Abmeldung unter den Master macht
sonos/RINCON_7828CAF4289001400 {"uuid":"RINCON_7828CAF4289001400","name":"Küche","groupName":"Wohnzimmer + 1","coordinatorUuid":"RINCON_7828CAF427B201400","transportState":"PLAYING","playmode":"NORMAL","ts":1595596556496,"volume":{"Master":14,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false}}und dann sowas hinterherschickt:
sonos/RINCON_7828CAF427B201400 {"uuid":"RINCON_7828CAF427B201400","name":"Wohnzimmer","groupName":"Wohnzimmer + 1","coordinatorUuid":"RINCON_7828CAF427B201400","volume":{"Master":11,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false},"ts":1595596701688,"currentTrack":{"Artist":"1LIVE mit Larissa Rieß und Philipp Isterewicz","AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"stream.mp3?ar-distributor=f0e2&_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE","UpnpClass":"object.item","ItemId":"-1","ParentId":"-1","TrackUri":"x-rincon-mp3radio://https://wdr-edge-2020-fra-lg-cdn.cast.addradio.de/wdr/1live/live/mp3/128/stream.mp3?ar-distributor=f0e2&_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},"enqueuedMetadata":{"AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"1LIVE","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"transportState":"PLAYING","playmode":"NORMAL"}
defmod MQTT2_RINCON_7828CAF4289001400 MQTT2_DEVICE RINCON_7828CAF4289001400
attr MQTT2_RINCON_7828CAF4289001400 IODev MQTT2_FHEM_Server
attr MQTT2_RINCON_7828CAF4289001400 readingList sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/RINCON_(?!7828CAF4289001400)[A-Z0-9]+:.* { my $master = ReadingsVal($NAME,"coordinatorUuid","7828CAF4289001400");; $EVENT =~ m,coordinatorUuid.:.$master, ? json2nameValue($EVENT,'M_',$JSONMAP) : undef }

setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_coordinatorUuid RINCON_7828CAF427B201400
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_AlbumArtUri https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_Artist 1LIVE mit Larissa Rieß und Philipp Isterewicz
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_ItemId -1
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_ParentId -1
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_Title stream.mp3?ar-distributor=f0e2&;_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_TrackUri x-rincon-mp3radio://https://wdr-edge-2020-fra-lg-cdn.cast.addradio.de/wdr/1live/live/mp3/128/stream.mp3?ar-distributor=f0e2&_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_currentTrack_UpnpClass object.item
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_enqueuedMetadata_AlbumArtUri https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_enqueuedMetadata_ItemId -1
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_enqueuedMetadata_ParentId -1
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_enqueuedMetadata_Title 1LIVE
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_groupName Wohnzimmer + 1
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_mute_LF false
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_mute_Master false
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_mute_RF false
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_name Wohnzimmer
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_playmode NORMAL
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_transportState PLAYING
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_ts 1595596701688
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_uuid RINCON_7828CAF427B201400
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_volume_LF 100
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_volume_Master 11
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:50:36 M_volume_RF 100
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 coordinatorUuid RINCON_7828CAF427B201400
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 groupName Wohnzimmer + 1
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 mute_LF false
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 mute_Master false
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 mute_RF false
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 name Küche
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 playmode NORMAL
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 transportState PLAYING
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 ts 1595596556496
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 uuid RINCON_7828CAF4289001400
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 volume_LF 100
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 volume_Master 14
setstate MQTT2_RINCON_7828CAF4289001400 2020-07-24 16:49:19 volume_RF 100

Ergo sollte sich da jetzt mit filter und jsonMap was basteln lassen.

Bessere Erkenntnisse habe ich nicht, und den Überblick über die diversen Varianten des devStateIcon habe ich schon lange nicht mehr...
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3652
  • ... wer sät, der erntet ...
Hab auch mal eine Frage zu json2nameValue.

Gegeben ist folgender JSON:

{"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadioChillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"}],"NumberReturned":9,"TotalMatches":9,"UpdateID":3}

Wenn json2nameValue eine Referenz auf einen Hash zurückgibt, dann verstehe ich es bisher so das mit dem JSON oben eine Referenz auf einen Hash von Hashes zurückgegeben wird.

Mir gibt

{ use Data::Dumper qw(Dumper);;my $h = json2nameValue(ReadingsVal("SonosBridge","Favorites","unknown"),'','lustig','Title|TrackUri');;Dumper $h}
$VAR1 = {};
zurück.


Hätte erwartet das mit j2nv so was in der Art zurückgeben wird :

$VAR1 = {
    Result_1 => {
        Title => 'NonStop60s',
        TrackUri => 'x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0',
    },
    Result_2  => {
        Title => '1A Deutsche Hits',
        TrackUri => 'x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4',
    },
    ...
};

Lieg ich damit so falsch ?

Kann bitte irgendwer in verständlichen Worten zeigen oder erklären wie das Ergebnis, welches j2nv liefert, wirklich aussieht ?

Gruß

Thomas

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19680
  • schon mal restore trainiert?
    • Otto's Technik Blog
... und was man anstatt 'lustig' wirklich hinschreiben sollte.  ;D
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266
Zustimmung Zustimmung x 1 Liste anzeigen

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16301
... und was man anstatt 'lustig' wirklich hinschreiben sollte.  ;D
Sorry, habe das hier zu spät gesehen. Meine (ggf. verbesserungsfähige) Antwort ist hier zu finden:
2 ist der "prefix". Der kann (meistens) leer bleiben. Da was reinzuschreiben macht nur dann Sinn, wenn man z.B. JSON aus unterschiedlichen Quellen/Topics hat, die aber intern dieselben Strukturen aufweisen und daher dieselben Namen ergeben würden (Rudi hat das "wegen" Ebus entwickelt und dabei dann gleich auch das 3. Argument eingeführt, weil die "eigentlichen" Readingnamen dann ziemlich unleserlich und unhandlich wurden). Das 3. Argument ist eigentlich (?) ein Hash, in der Regel macht es keinen Sinn, da was anderes reinzuschreiben als das "simple" $JSONMAP, das intern dann vor dem Ausführen der Funktion mit dem Hash aus dem Internal ersetzt wird, der wiederum aus dem Attribut jsonMap gebildet wird (in der attr-Funktion von MQTT2_DEVICE). Das 3. Argument/$JSONMAP dient also dazu, leserliche (oder besser passende oder standardkonforme) Readingnamen zu erzeugen, indem die "technischen Readingnamen" durch beliebige ersetzt werden können...
[...]
Jein; Rudi hat dazu mal ausgeführt, dass j2nv "eine Referenz auf einen Hash" zurückliefert. Das macht einen Unterschied beim Zugriff auf die Daten, Details rund um diesen Beitrag: https://forum.fhem.de/index.php/topic,111429.msg1059608.html#msg1059608[...]Eventuell ist die "grep"-Variante dann auch ein Weg, die Schleife einzusparen (die dann aber wegen Filter eh' nicht mehr viele Datenfelder durchgehen muß, oder? Man könnte aber direkt nach einem match auch das return einbauen, oder?). Muß aber zugeben, dass ich mir das Problem jetzt nicht im Detail angesehen habe und das ganze insgesamt auch recht abstrakt ist. Kann also auch ein gut gemeinter Hinweis in die falsche Richtung sein...
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 24686
Zitat
Lieg ich damit so falsch ?
Ich meine ja: json2nameValue liefert eine Referenz auf ein "flaches" Hash zurueck, was aus "Name"=>"Wert" Paaren besteht.
Es dient nicht dazu, JSON in Perl Datenstrukturen zu verwandeln, sondern um JSON Daten nach FHEM Readings bzw. Events zu konvertieren.

Parameter 1 ist das Input, Parameter 2 wird als Prefix angestellt (um zwei JSONs mit gleichen Inhalt unterscheiden zu koennen), Parameter 3 ist eine Referenz auf ein Hash, um die Namen aendern zu koennen, und Parameter 4 ist ein Regexp, um nur bestimmte Namen zu akzeptieren. Filtern geht zwar auch mit Parameter 3, kann aber umstaendlich sein. Nur der erste Parameter ist verpflichtend.

 

decade-submarginal