Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

Otto123

Hallo Thomas,

ich habe auch einen mit (Beschreibung) - der funktioniert. Kannst mal den Code im setter austauschen, der schreibt eine Datei. Da sieht man vielleicht was los ist?
{use JSON;use HTML::Entities;use Encode qw(encode decode);my $enc = 'utf-8';my $uri='';my @out;my $search = (split(' ', $EVENT,2))[1];my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];my $read = 'Favorites';my $decoded = decode_json(ReadingsVal($dev,$read,''));my @arr  = @{$decoded->{'Result'}};foreach (@arr) {my $tit=encode($enc, decode_entities($_->{'Title'}));if ($tit =~ /$search/i){$uri = $_->{'TrackUri'} }push @out, $tit.' - '.$search};FileWrite('test2.txt', @out);fhem("set $NAME playUri $uri") if ($uri ne '')}
Oder Du schickst mir mal das Reading Favorites :) ob ich da was sehen kann?

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

Das steht in der Datei:

011.FM-NonStop60s - die.neue.welle.101.8.(Rock)
1A Deutsche Hits - die.neue.welle.101.8.(Rock)
1LIVE diggi (Top 40/Pop) - die.neue.welle.101.8.(Rock)
Antenne Thüringen 80er (80er) - die.neue.welle.101.8.(Rock)
COSMO Chillout - die.neue.welle.101.8.(Rock)
DASDING 92.5 (Euro-Hits) - die.neue.welle.101.8.(Rock)
die neue welle 101.8 (Rock) - die.neue.welle.101.8.(Rock)
FM نجوم 100.6 (Arabisch) - die.neue.welle.101.8.(Rock)
Hitradio Ö3 99.9 (Österreichisch) - die.neue.welle.101.8.(Rock)
Hörbücher - die.neue.welle.101.8.(Rock)
NDR 2 - die.neue.welle.101.8.(Rock)
PsyRadioChillout - die.neue.welle.101.8.(Rock)
SWR4 Baden-Württemberg - die.neue.welle.101.8.(Rock)
SWR4 Rheinland-Pfalz - die.neue.welle.101.8.(Rock)


Das ist das JSON-Reading :

{"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:*:*:*"},{"Title":"1LIVE diggi (Top 40/Pop)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/49","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s104196/images/logoq.png?t=153253","Title":"Antenne Thüringen 80er (80er)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/42","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s104196?sid=254&flags=8224&sn=0","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-profiles.tunein.com/s228737/images/logoq.png?t=154228","Title":"NDR 2","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/43","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"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:*:*:*"},{"Title":"SWR4 Baden-Württemberg","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/48","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Rheinland-Pfalz","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/47","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}],"NumberReturned":14,"TotalMatches":14,"UpdateID":9}

Otto123

Moin,

das Problem sind die / und ev. auch die (

Im setter hinter my $search ... das hier ergänzen $search=~s/[\/\(\)]/./g;

Damit bleibt die Liste etwas hübscher, man könnte ja alles schon beim Erstellen der Auswahlliste durch Punkte ersetzen.

Das mit den uri (Hörbücher) ist offenbar ein Problem von setAVTUri. Ich habe es gestern Abend noch mit dem adv command probiert aber ohne Erfolg. Naja muss ja nicht gleich alles gehen :)
Es gibt offenbar eine erhebliche uri Vielfalt die das Sonos System dann speziell behandelt.

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

Bis auf Hörbücher (das liegt an der uri) klappt alles jetzt.

FM نجوم 100.6 (Arabisch) erst nicht, dann hab ich aber festgestellt das es auch an der uri liegt, testweise hab ich sie im Json ersetzt mit dem Ressource-Wert aus dem Radios Reading im Sonos-Modul, dann klappts auch.


Otto123

Ja das ist bei mir auch so: den FM 100.6 arabisch bekomme ich bei mir gar nicht gestartet, auch nicht mit dem Sonos Modul von Reinerlein. Auch nicht mit Sonos selbst  :o - Er setzt die uri, zeigt das Radio Icon und beendet aber sofort das play wieder.

Bei meiner Playlist aus der Soundcloud wird die uri irgendwie gar nicht sichtbar gesetzt. Wenn ich da die uri nehme die nach dem Sonos Start im Reading steht funktioniert das auch.

Ich bin immer noch unsicher, ob ich das mit der Zeichencodierung final wirklich verstanden habe  :-\
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

ZitatJa das ist bei mir auch so: den FM 100.6 arabisch bekomme ich bei mir gar nicht gestartet, auch nicht mit dem Sonos Modul von Reinerlein. Auch nicht mit Sonos selbst  :o - Er setzt die uri, zeigt das Radio Icon und beendet aber sofort das play wieder.

wie gesagt, nimm mal den Ressource-Wert (uri) aus dem Radios Reading (Sonos-Modul), dann klappts.

Nutze mit meiner FB noch das Sonos-Modul, da werden alle Sender mit Each abgespielt.

Die Sender stehen in RadiosList:

011.FM.-.Non.Stop.60s|1LIVE.diggi..Top.40.Pop.|DASDING.92.5..Euro-Hits.|Hitradio.Ö3.99.9..Österreichisch.|Nota.Masria..Gemeinden.|PsyRadio.Chillout|Radio.Regenbogen|SWR4.Baden-Württemberg|SWR4.Rheinland-Pfalz|die.neue.welle.101.8..Rock.

Die Uris werden aus dem Reading Radios genommen:

{'R:0/0/46' => {'Ressource' => 'x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s228737/images/logog.png?t=154228','Title' => 'NDR 2'},'R:0/0/27' => {'Ressource' => 'x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s296020g.png','Title' => '011.FM - Non Stop 60s'},'R:0/0/1' => {'Ressource' => 'x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s1563/images/logog.png?t=153242','Title' => 'SWR4 Rheinland-Pfalz'},'R:0/0/23' => {'Ressource' => 'x-sonosapi-stream:s290159?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s290159/images/logog.png?t=158880','Title' => 'Nota Masria (Gemeinden)'},'R:0/0/40' => {'Ressource' => 'x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s84548/images/logog.jpg','Title' => 'die neue welle 101.8 (Rock)'},'R:0/0/3' => {'Ressource' => 'x-sonosapi-stream:s272334?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s2485g.png','Title' => 'Radio Regenbogen'},'R:0/0/33' => {'Ressource' => 'x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s20295/images/logog.png','Title' => 'DASDING 92.5 (Euro-Hits)'},'R:0/0/5' => {'Ressource' => 'x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s20293/images/logog.png?t=1','Title' => 'SWR4 Baden-Württemberg'},'R:0/0/25' => {'Ressource' => 'x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s97066g.png','Title' => 'PsyRadio Chillout'},'R:0/0/35' => {'Ressource' => 'x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s45087/images/logog.png','Title' => '1LIVE diggi (Top 40/Pop)'},'R:0/0/36' => {'Ressource' => 'x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s8007g.png','Title' => 'Hitradio Ö3 99.9 (Österreichisch)'}}

TomLee

#501
Bei dem Code aus dem Wiki fehlt irgendwie die Variable $first:

{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my $attr = 'readingList';;\
my $item = q(  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} 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 modifiziert"\
}


edit:
OK, wenn man den Code vor der Schleife (mir hat vor kurzem jemand gesagt ich soll foreach vergessen for macht das gleiche) um

my $first=split(' ',$item,2);;\

ergänzt, wie aus dem Beispiel weiter oben mit dem playFav setter, dann klappts.

Der Code hat aber nach wie vor den Haken das er einen schon vorhandenen Eintrag nicht ersetzt, er wird einfach nur ergänzt.


Otto123

Ja da fehlt die Zeile
my ($first,$sec)=split(' ',$item,2);;\
Ich trage es gerade nach. Hatte ich gestern noch umgestellt und was vergessen  ::)
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


Otto123

#504
Zitat von: TomLee am 15 August 2020, 20:05:28
Der Code hat aber nach wie vor den Haken das er einen schon vorhandenen setter nicht ersetzt, er wird einfach nur ergänzt.
Wie meinst Du das? Hier geht es ja um die readingList?

Und der Code vom oben sollte doch einen vorhandene playFav setter ersetzen? Bei mir tut er es. Bei Dir schreibt er einen zweiten playFav setter?
Edit:
Ja ich verstehe, wenn sich die Liste ändert - ok ich überlege mir etwas.

Ok da muss man die Trennung eher machen, so (also nur beim playFav). Aber generell müssen noch die Leerzeichen aus $first raus.
my ($first,$sec)=split(':',$item,2);;$first=~s/ //g;;\
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

#505
Ich hab vor die getList zu ergänzen:

{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my $attr = 'getList';;\
my $item = q(Favorites:noArg Favorites sonos/RINCON_([0-9A-Z]+)/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
my $first=split(' ',$item,2);;\
for (@devlist) {\
   my @arr = grep {$_ !~ $first} 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 modifiziert"\
}


Warum greift bei mir der regex nicht bei dir schon ?

In getList steht dann :

Favorites:noArg Favorites sonos/RINCON_([0-9A-Z]+)/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}

Otto123

Ich versteh den Fehler noch nicht. Ich denke der Getter stimmt nicht. Muss da nicht ein Player rein? RINCON_([0-9A-Z]+
Oder meinst Du das regExp?
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

Ja, den regex mein ich, der getter stimmt schon.

Das funzt schon die ganze Zeit:
Favorite:noArg Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}

Otto123

Na bei "mir" steht diese regExp ja in der readingList :)

Du willst doch einen Player auswählen?

Wobei das auch noch nicht perfekt ist, die Readings kommen doch im Player an, das will ich ja nicht. Meine Ergänzung der readingList spült zwar die Favorites in das Reading der Bridge aber eben auch in den Player.
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 will das der regex greift mehr nicht, keinen Player auswählen.

Zitat
my $item = q(Favorites:noArg Favorites sonos/RINCON_([0-9A-Z]+)/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\

der getter aktualisiert dann das Reading Favorites im Bridge-Device welches von dem ReadingList-Eintrag
sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites
erstellt wird.

Das ist nichts anderes wie
set alias=Büro x_raw_payload {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}
nur im getter (im Bridge-Device).