Autor Thema: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen  (Gelesen 88262 mal)

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 21090
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #450 am: 05 August 2020, 16:40:44 »
Doch Du - ich habe es mir schon angeschaut :) aber mir geht es wie Dir
Zitat
Verstanden 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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4255
  • ... wer sät, der erntet ...
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #451 am: 05 August 2020, 17:17:28 »
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.


Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 21090
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #452 am: 05 August 2020, 17:32:29 »
Zitat
Na 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-PsyRadioChilloutBzw. 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!
« Letzte Änderung: 05 August 2020, 18:26:36 von Otto123 »
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4255
  • ... wer sät, der erntet ...
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #453 am: 05 August 2020, 18:23:59 »
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.

« Letzte Änderung: 05 August 2020, 18:27:01 von TomLee »

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 21090
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #454 am: 05 August 2020, 18:28:35 »
dann habe ich es nicht verstanden. Wozu ist dann #451 ?
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4255
  • ... wer sät, der erntet ...
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #455 am: 05 August 2020, 18:35:46 »
nur zum nachvollziehen, wie ich es schon in #438 erwähnt habe:

Zitat
Zum 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.
« Letzte Änderung: 05 August 2020, 18:39:39 von TomLee »

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 21090
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #456 am: 05 August 2020, 23:36:01 »
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
« Letzte Änderung: 05 August 2020, 23:49:09 von Otto123 »
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4255
  • ... wer sät, der erntet ...
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #457 am: 05 August 2020, 23:58:01 »
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
« Letzte Änderung: 06 August 2020, 00:43:51 von TomLee »

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 21090
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #458 am: 06 August 2020, 17:56:26 »
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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 21090
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #459 am: 07 August 2020, 12:57:26 »
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
« Letzte Änderung: 07 August 2020, 13:00:19 von Otto123 »
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18970
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #460 am: 07 August 2020, 13:24:57 »
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.
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
Zitat
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.
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 11, 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

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 21090
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #461 am: 07 August 2020, 13:34:57 »
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.
« Letzte Änderung: 07 August 2020, 13:38:03 von Otto123 »
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18970
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #462 am: 07 August 2020, 13:44:16 »
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...
« Letzte Änderung: 07 August 2020, 13:48:05 von Beta-User »
Server: HP-T620@Debian 11, 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

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18970
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #463 am: 07 August 2020, 14:46:20 »
...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-T620@Debian 11, 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

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4255
  • ... wer sät, der erntet ...
Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
« Antwort #464 am: 09 August 2020, 13:07:58 »
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 ?

 

decade-submarginal