Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

Begonnen von Otto123, 31 Mai 2020, 18:30:55

Vorheriges Thema - Nächstes Thema

Otto123

Doch Du - ich habe es mir schon angeschaut :) aber mir geht es wie Dir
ZitatVerstanden hab ich schon etwas, aber begriffen ehrlich gesagt nur einen Bruchteil, sonst wär ich schon weiter.
;D

Aber in #443 hast Du zwei Schleifen gezeigt, die Du in einer unterbringen wolltest. Ich wollte Dich fragen wozu? Du musst doch nur die Titel sortieren?

Mal sehen ob ich den Unterschied zwischen beiden Versionen (mit und ohne use) noch verstehe :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ich weiß nicht wie ich es erklären soll, wenn ich aber Beispiele zeige denke ich das du schneller verstehst wie ich:

Eine Zeile hier deaktiviert und Bindestrich ergänzt:

Zitat{my $read = 'Favorites';;\
my $werte = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,''));;\
my @ar;;\
while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key-$value")}};;\
my @s = sort @ar;;\
my $g =join (',',@s);;\
$g =~ s/ /./g;;\
#$g =~ s/Result_._Title.//g;;\
$g;;}


ergibt:
Result_1_Title-011.FM-NonStop60s,Result_2_Title-1A.Deutsche.Hits,Result_3_Title-COSMO.Chillout,Result_4_Title-DASDING.92.5.(Euro-Hits),Result_5_Title-die.neue.welle.101.8.(Rock),Result_6_Title-FM.نجوم.100.6.(Arabisch),Result_7_Title-Hitradio.Ö3.99.9.(Österreichisch),Result_8_Title-Hörbücher,Result_9_Title-PsyRadioChillout

Hier:

Zitat{my $read = 'Favorites';;\
my $werte = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,''));;\
my @ar;;\
while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._TrackUri,g){push (@ar, "$key-$value")}};;\
my @s = sort @ar;;\
my $g =join (',',@s);;\
$g =~ s/ /./g;;\
#$g =~ s/Result_._TrackUri.//g;;\
$g;;}

Result_1_TrackUri-x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0,Result_2_TrackUri-x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4,Result_3_TrackUri-x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4,Result_4_TrackUri-x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0,Result_5_TrackUri-x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0,Result_6_TrackUri-x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0,Result_7_TrackUri-x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0,Result_8_TrackUri-x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher,Result_9_TrackUri-x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0

Diese zwei Schleifen bin ich der Meinung kann man auch in einer umsetzen.

Und wozu ? Na nur die Namen bringen ja nichts mit denen kann man ja keinen Radiosender abspielen, mit den zwei Schleifen hab ich erreicht das ich zwei gleich sortierte Arrays (nicht Alphabetisch, nach dem key) erhalte, über deren Index kann dann die TrackUri ermittelt werden.

Aber auch das ist der falsche Weg (Umweg), mein ich, man kann auch schon direkt über den key ermitteln was zu wem gehört.


Otto123

#452
ZitatNa nur die Namen bringen ja nichts mit denen kann man ja keinen Radiosender abspielen,
Doch, genau das habe ich verstanden und meine ich: Du brauchst Du nur die Liste und im JSON Array steht doch alles drin.
Ok meine Variante mit USE :)
Da du jetzt die gleichen Namen hast (?) sollte das als setList gehen, probier es aus :) Beispiel mit 3 Sendern aus Deiner Liste
playFav:select,011.FM-NonStop60s,1A.Deutsche.Hits,COSMO.Chillout {use JSON;my $uri='';my $search = (split(' ', $EVENT,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,'');my $decoded = decode_json($jlist);my @arr=@{$decoded->{'Result'}};foreach (@arr) {if ($_->{'Title'} =~ /$search/i){$uri = $_->{'TrackUri'} }};fhem("set $NAME playUri $uri") if ($uri ne '')}
Allerdings musst Du aus Deiner Liste Result_1_Title- rausnehmen - wozu ist das? Wegen der Readings?
Result_1_Title-011.FM-NonStop60s,Result_2_Title-1A.Deutsche.Hits,Result_3_Title-COSMO.Chillout,Result_4_Title-DASDING.92.5.(Euro-Hits),Result_5_Title-die.neue.welle.101.8.(Rock),Result_6_Title-FM.نجوم.100.6.(Arabisch),Result_7_Title-Hitradio.Ö3.99.9.(Österreichisch),Result_8_Title-Hörbücher,Result_9_Title-PsyRadioChillout
Bzw. Du musst die Liste einfach mit deinem Code aus #449 erzeugen :)

Ich habe mal Q&D meine beiden Scripts hintereinander kopiert, ausgeführt und es funktioniert so wie Du es wolltest? Sortierte Favoritenliste als Klappliste zum auswählen, alles nur mit dem Original JSON Reading:

Edit: hat noch einen Haken: Meine "Suche" funktioniert nicht bei allen Titeln, da muss ich nochmal ran um die Titel besser zu matchen. Ich habe Favoriten da sind " drin - sowas stört natürlich. Irgendwie muss man das "normieren": auf der einen Seite (select widget) gehen keine Leerzeichen, auf der anderen Seite muss man die Titel finden

{use JSON;;\
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;\
my $read = 'Favorites';;\
my $decoded = decode_json(ReadingsVal($dev,$read,''));;\
my @arr  = @{$decoded->{'Result'}};;\
my @out;;\
foreach (@arr) {\
  my $temp=$_->{'Title'};;\
  $temp =~ s/ /./g;;\
  push @out,$temp}\
my $favliste= join ',', sort @out;;\
my @devlist = devspec2array('MQTT2_RINCON_.*');;\
my $attr = 'setList';;\
my $search = 'playFav:';;\
my $item = ' playFav:'.$favliste.q( {use JSON;;my $uri='';;my $search = (split(' ', $EVENT,2))[1];;my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');;my $decoded = decode_json($jlist);;my @arr=@{$decoded->{'Result'}};;foreach (@arr) {if ($_->{'Title'} =~ /$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')});;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $search} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen ergänzt"\
}


Jetzt gehe ich nachher mal ran und spiele mit deiner Codevariante :)

Ich brauche das an andere Stelle als konfigurierbare Klappliste. Schöner wäre, man hätte es wirklich dynamisch, ohne Konfigänderung!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#453
Ich weiß nicht was du jetzt von mir willst, der setter aus #442 ganz unten macht was er soll es funzt alles.
(kopier den so wie er ist und trag ihn in der setList ein nicht über Raw, edit :OK der Bridge-Name ist noch statisch)

Er holt sich alles aus dem JSON in der Bridge.

Alles so wie du es jetzt gerade oben beschreibst.

Womit ich mich noch nicht beschäftigt habe ist das ersetzen des setList-Eintrag, aber das sollte so klappen wie du vorgeschlagen hast (zumindest war das gestern nachvollziehbar).

Und nochmal, das ersetzen des setList-Eintrag stell ich mir vor das das bei einem get in der Bridge gemacht wird.


Otto123

dann habe ich es nicht verstanden. Wozu ist dann #451 ?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#455
nur zum nachvollziehen, wie ich es schon in #438 erwähnt habe:

ZitatZum einfachen nachvollziehen empfiehlt sich erstmal in dem push {push (@a, "$value")}} $key mit reinzunehmen, zu schauen was passiert und dann das my @s = sort @a; rauszunehmen um zu sehen was es bedeutet eine unsortierte Liste zu haben.

Mit dem sortieren lag ich da aber noch falsch, hab ich dann aber korrigiert (sicher geht das auch anders) und lösche Result_._Title (key) später raus.

Otto123

#456
Hallo Thomas,
jetzt wo ich mir mal angeschaut habe was bei json2namevalue rauskommt, wird mir Dein Lösungsansatz glaube ich klarer :)

Du wolltest so eine Liste erzeugen?
Result_10_Title:Radio Leipzig RP
Result_10_TrackUri:x-sonosapi-stream:rpde_svc_107?sid=232&flags=32&sn=7
Result_11_Title:Radio PSR 102.9 (Pop)
Result_11_TrackUri:x-sonosapi-stream:s6649?sid=254&flags=32
Result_12_Title:RAM FM
Result_12_TrackUri:x-sonosapi-stream:s120965?sid=254&flags=32
Result_13_Title:Titel
Result_13_TrackUri:x-rincon-cpcontainer:0006206cuser-tracks:7212085
Result_14_Title:Titel
Result_14_TrackUri:x-rincon-cpcontainer:0006206cuser-tracks:57284250
Result_15_Title:Zufallsmix des Interpreten
Result_15_TrackUri:x-sonosapi-radio:OdM7gv9gU7QSjkti5U4B53bui4xNDbh3BxkL39Nnfgn4dhJPhcxisA?sid=151&flags=8300&sn=4
Result_1_Title:104.6 RTL
Result_1_TrackUri:x-sonosapi-stream:s25224?sid=254&flags=32
Result_2_Title:Deutschlandfunk Kultur
Result_2_TrackUri:x-sonosapi-stream:s6628?sid=254&flags=8224&sn=0
Result_3_Title:Deutschlandfunk Kultur RP
Result_3_TrackUri:x-sonosapi-stream:rpde_svc_387?sid=232&flags=32&sn=7
Result_4_Title:Maya Fadeeva – Zufallsmix des Interpreten
Result_4_TrackUri:x-sonosapi-radio:y_AW1p8NH9TDElPf9SG7VYRo71VB9SbLPWkPeQiCoCejxPDHnbsEeA?sid=151&flags=8300&sn=4
Result_5_Title:Melissa Etheridge – Zufallsmix des Interpreten
Result_5_TrackUri:x-sonosapi-radio:dzL_hF9h3rZ6XmNnLm6Fs-w0eN6Hn9qPPE5jBsBXWlmi6e0RJHl5NQ?sid=151&flags=8300&sn=4
Result_6_Title:Mephisto 97.6 | (Top 40/Pop)
Result_6_TrackUri:x-sonosapi-stream:s8670?sid=254&flags=8224&sn=0
Result_7_Title:Moya Brennan – Zufallsmix des Interpreten
Result_7_TrackUri:x-sonosapi-radio:5yQ8LX7xOr9WxZxhNrPsXXM8nmYHYxB3-PE85osDj8b977LYarYhZA?sid=151&flags=8300&sn=4
Result_8_Title:Philipp Dittberner – "Philipp Dittberner"-Radio
Result_8_TrackUri:x-sonosapi-radio:sYw20eeWca-D6A36z5FhiqT0RhjTmSFwOfpJpACYqg4k5lBk1h5IXw?sid=151&flags=108&sn=4
Result_9_Title:Radio Leipzig
Result_9_TrackUri:x-sonosapi-stream:s78666?sid=254&flags=8224&sn=0

Damit habe ich es gemacht.
{ my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"));; join("\n", sort map { "$_:$r->{$_}" } grep /.*Title|.*TrackUri/,keys %{$r}) }

Ich weiß nicht ob bei mir da in dem "json2namevalue Buch" jetzt schon eins von 7 Siegeln aufgegangen. Das decode_json und ff erschien mir da noch halbwegs logisch.  ::)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#457
Und jetzt schau dir mal die Readings von dem Device in #435 an die von

attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'TrackUri')}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'Title')}\


erstellt wurden, ist doch nix anderes oder ?

das was du jetzt gemacht hast geht vielleicht auch schon mit dem optionalen 4 Parameter Filter in json2nameValue, weiß aber nicht ob man da zwei Filter angeben kann ?
Und wie gesagt ich versteh immer noch nur Bruchteile.

edit;
ich glaub Filter greift nur iVm. mit dem dritten Parameter

Otto123

Zitat von: TomLee am 05 August 2020, 23:58:01
das was du jetzt gemacht hast geht vielleicht auch schon mit dem optionalen 4 Parameter Filter in json2nameValue, weiß aber nicht ob man da zwei Filter angeben kann ?
Kann man
{ my $r = json2nameValue(ReadingsVal("SonosBridge","Favorites","unknown"),'','lustig','7_Title|7_TrackUri');; join("\n", map { "$_:$r->{$_}" } keys %{$r}) }
Wenn es irgendwo eine Beschreibung geben würde, die ich verstehe.  :'(

Vielleicht hilft Grillwurst und Bier  ;D
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

#459
Hallo Thomas,

So jetzt ohne das teuflische "use JSON" und mit dem geliebten? json2namevalue (Was ich immer noch nur in Bruchteilen erahne).
Der Code für playFav ob mit playFav:textField oder playFav:radio1,radio2,radio3 ist von der Sache her egal
{my $uri='';my $search = (split(' ', $EVENT,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}
Zum Spielen in der Kommandozeile:

  • Suchtext ist ein exakter Teil des Titels
  • Was ich bei json2namevalue(1,2,3,4) reinschreiben muss, ist mir für 2 und 3 nicht klar: 2 kann leer sein, in 3 muss was stehen. In 4 steht der Filter der die Liste verkürzt.
  • Ich habe verstanden, dass j2nv eine unsortierte Liste mit keys und values produziert. Die Keys heißen Result_lfdNr_NameDesFeldes.
  • Hat man im Value vom Key "Result_7_Titel" den Titel gefunden kann man mit dem Key "Result_7_TrackUri" das dazu passende TrackUri auslesen.
  • genau das passiert in der while Schleife (die mir hier nicht gefällt - war halt ein Beispiel aus PerlDoc)
{ my $search="Suchtext";;
my $uri;;
my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"),'','lustig','_Title|_TrackUri');;
while (my ($key,$value) = each %{$r}) {
    if ($value =~/$search/) {
        $key=~s/Title/TrackUri/;;
        $uri=$r->{$key}
        }
    }
return $uri}

Ob das jetzt irgendwelche Vorteile gegenüber dem JSON Array in meiner ursprünglichen Variante hat?
Ob das effektiver ist oder viel einfacher gemacht werden kann?
Mir erscheint das JSON Array immer noch logischer. 8)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Zitat von: Otto123 am 07 August 2020, 12:57:26Was ich bei json2namevalue(1,2,3,4) reinschreiben muss, ist mir für 2 und 3 nicht klar: 2 kann leer sein, in 3 muss was stehen. In 4 steht der Filter der die Liste verkürzt.
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...
Zitat
Ich habe verstanden, dass j2nv eine unsortierte Liste mit keys und values produziert. Die Keys heißen Result_lfdNr_NameDesFeldes.
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
ZitatHat man im Value vom Key "Result_7_Titel" den Titel gefunden kann man mit dem Key "Result_7_TrackUri" das dazu passende TrackUri auslesen.
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-elitedesk@Debian 12, 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: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

#461
Und was wenn man $JSONMAP nicht hat ? Weil  -> Global symbol "$JSONMAP" requires explicit package name at (eval 1931) line 1. man es außerhalb von MQTT2 readingList anwendet? :o
Weglassen geht nicht, leerer String geht nicht, der Nachnahme von Willi wird akzeptiert und stört offenbar nicht :)

Eine  "eine Referenz auf einen Hash" ist für mich irgendwie nicht "lesbar" Wenn ich versuche es mit keys und values zu lesen dann kommt genau das raus was ich geschrieben habe :)
Eine Datenstruktur ist nicht mehr da.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

#462
Ah, ok, außerhalb MQTT2_DEVICE...

Falls "lustig" Fehler wirft: Versuch's mal mit einem beliebigen hash wie
{ my $search="Suchtext";;
my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"),'','{"lustig"=>"doch_nicht"}','_Title|_TrackUri');;
while (my ($key,$value) = each %{$r}) {
    if ($value =~/$search/) {
        $key=~s/Title/TrackUri/;;
        return=$r->{$key};;
        }
    }
return}


EDIT: Eigentlich müßte auch ein leerer Wert gehen, auch jsonMap ist ja nicht zwangsläufig gefüllt bei MQTT2_DEVICE...
Server: HP-elitedesk@Debian 12, 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: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

...Stochern im Nebel...

So langsam dämmert mir, dass du mit dem Versuch wohl über dasselbe Problem gestolpert bist wie ich; man muß die "Referenz auf einen Hash" irgendwie nochmal umpacken, wenn man damit weiterarbeiten will. Das ist das, was dann auch mit grep und dem neuen Hash passiert.

Kann das mangels Devices nicht wirklich testen, aber eigentlich müßte es gehen, dass man direkt auch den Suchbegriff für Filter verwendet und dann nur einen kürzeren Hash zurückbekommt:
{ my $search="Suchtext";;
my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"),'','{}','_Title.*$search|_TrackUri');;my %title = map { $_,$r->{$_} } grep { $r->{$_} =~ m,$search, } keys %{$r};;
while (my ($key,$value) = each %{$title}) {
    if ($value =~/$search/) {
        $key=~s/Title/TrackUri/;;
        return=$r->{$key};;
        }
    }
return }

Ob es Sinn machen würde, zwei Hashes zu bilden also einen für die (gefilterte) Title-Liste, einen für die TrackUri's, wäre eine andere Frage...
Server: HP-elitedesk@Debian 12, 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: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Wenn ich umstelle auf s2m brauch ich auch ne Lösung mit Each, dachte bisher das mach ich weiterhin im notify/myUtils.
Im MQTT2_DEVICE Kontext könnte man aber auch einen setter realisieren  :)

Bisher klappt das aber nicht:

togglefavRadios:noArg {my $l = AttrVal($NAME,"favRadios","none");my $lvwodot = Each($NAME, $l);{my $uri='';my $search = (split(' ', $lvwodot,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}}


Im Attribut favRadios steht:
attr SonosControl favRadios 011.FM-NonStop60s,Deutsche,Antenne Thüringen

Im Log:

2020.08.09 12:43:43 3: MQTT2_DEVICE set SonosControl togglefavRadios
2020.08.09 12:43:44 1: PERL WARNING: Use of uninitialized value $search in regexp compilation at (eval 4848) line 1.
2020.08.09 12:43:44 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};{my $l = AttrVal($NAME,"favRadios","none");my $lvwodot = Each($NAME, $l);{my $uri='';my $search = (split(' ', $lvwodot,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}}


Warum ist  $search uninitialized / nicht vorhanden ?

Aus der Kommandozeile

{my $l = AttrVal("SonosControl","favRadios","none");;my $lvwodot = Each("SonosControl", $l);;}

ausgeführt macht was es soll und gibt nach jedem Aufruf den nächsten Wert aus der Liste zurück.

Jemand eine Idee ?