Sonos steuern

Begonnen von Will, 05 Januar 2013, 15:51:12

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo,

bin gerade an einem Punkt, wo ich nicht mehr weiter wei?:

Lese die Liste der Radiovavoriten aus und baue mir damit ein (verkürztes) Menü auf. Wenn ich einen Eintrag selektiere, soll der Radiosender abgespielt werden.

Das sieht dann im log so aus:
2015.08.16 15:28:12 3: set Sonos_G_stezimmer StartRadio deutschlandfunk
2015.08.16 15:28:13 2: LastActionResult: cmd loadradio res radio "deutschlandfunk" not found. choose one of: "antenne bayern 103.0 (pop)","b5 aktuell 90.0 (nachrichten)","bayern 2 88.4 (nachrichten)","bayern 3 97.3 (top 40-pop)","deutschlandfunk","nrj energy münchen 93.3 (top 40 popmusik)","radio gong 96.3 (local music)","top fm 106.4 (top 40-pop)","Österreich 1","Радио Шансон 103.0 (russisch)"
2015.08.16 15:28:13 2: LastActionResult: cmd play res success!

Der Player spielt die letzte mp3 - Datei ab, statt des Rasiossenders.

Wie man sieht, habe ich entsprechend der Commandref die Sendernamen mit uriencode umgesetzt:

Notify auf das Menü:
2015.08.16 15:30:02 3: set: rd Sender val nrj-energy-münchen master Sonos_G_stezimmer
Der Menüname wird über ein hash in den korekten Favoriten zurückgewandelt
2015.08.16 15:30:02 3: set Sonos_G_stezimmer StartRadio nrj%20energy%20m%C3%BCnchen%2093.3%20%28top%2040%20popmusik%29
2015.08.16 15:30:02 2: LastActionResult: cmd loadradio res radio "nrj energy münchen 93.3 (top 40 popmusik)" not found. choose one of: "antenne bayern 103.0 (pop)","b5 aktuell 90.0 (nachrichten)","bayern 2 88.4 (nachrichten)","bayern 3 97.3 (top 40-pop)","deutschlandfunk","nrj energy münchen 93.3 (top 40 popmusik)","radio gong 96.3 (local music)","top fm 106.4 (top 40-pop)","Österreich 1","Радио Шансон 103.0 (russisch)"
2015.08.16 15:30:02 2: LastActionResult: cmd play res success!
2015.08.16 15:30:10 3: set: rd Sender val radio-gong master Sonos_G_stezimmer
2015.08.16 15:30:10 3: set Sonos_G_stezimmer StartRadio radio%20gong%2096.3%20%28local%20music%29
2015.08.16 15:30:11 2: LastActionResult: cmd loadradio res radio "radio gong 96.3 (local music)" not found. choose one of: "antenne bayern 103.0 (pop)","b5 aktuell 90.0 (nachrichten)","bayern 2 88.4 (nachrichten)","bayern 3 97.3 (top 40-pop)","deutschlandfunk","nrj energy münchen 93.3 (top 40 popmusik)","radio gong 96.3 (local music)","top fm 106.4 (top 40-pop)","Österreich 1","Радио Шансон 103.0 (russisch)"
2015.08.16 15:30:11 2: LastActionResult: cmd play res success!


Hier auch das Codestückchen:

my $sender = $hash->{Sender}{$val};
# Menüliste aktualisieren
readingsSingleUpdate($hash,'Sender',$val,1);
$sender = uri_escape($sender);
my $cmd = "set $master StartRadio $sender";
Log3($name,3,"$cmd");
fhem($cmd);
return undef;


Was mache ich da falsch?

Elektrolurch

configDB und Windows befreite Zone!

Reinerlein

Hi Elektrolurch,

irgendwie sind die Logausgaben komisch. Wieso sind die bei dir alle in Kleinbuchstaben?
Außerdem erscheinen mir die Meldungen für LastActionResult beim Setzen des Radiosenders fehlerhaft...

Bleiben wir mal z.B. bei dem Eintrag mit dem Zeitstempel "15:28:13":
Dort erscheint eine Ausgabe dazu, dass der Sender "deutschlandfunk" nicht gefunden werden konnte, und man einen aus der Liste auswählen solle. Abgesehen davon, dass auch das alles in Kleinbuchstaben ausgegeben wird, sollte die Zeile mit den Worten 'LoadRadio: Radio "Sendername" not found. Choose one of' beginnen.
Bei dir steht da was von 'cmd loadradio res radio "deutschlandfunk"'...

Kannst du nochmal den kompletten Code posten, und auch deine eigene Logausgabe des zusammengebauten Kommandos besser markieren, sodass man diese eindeutig im Log wiederfindet?

Grüße
Reinerlein

Elektrolurch

Hallo Reinerlein,

Fehler gefunden: Ich hatte an einer übergeordneten Routine, wo ich die Events auswerte, ein lc eingefügt....
(SonosCC_NotifyFN, den Code für das Gerüst hatte ich aus einem meiner anderen Module kopiert und dabei das lc() für die readingsnamen völlig vergessen und das hat dann die Radioliste klein gemacht. :-)
ic
Jetzt gehts.


configDB und Windows befreite Zone!

Christoph

Hi Reinerlein,

gibt es im Modul die Möglichkeit auf den SPDIF Eingang der Playbar zu schalten ?
Wenn man händisch z.b. Radio abspielen lässt und dann wieder die Musikquelle TV auswählen möchte...


Hab mal den Wireshark angeworfen und die 2 zusätzlichen Funktionen der Playbar gesnifft.
Die Funktionen lassen sich in der Sonos Software über die 2 Buttons im Titelfeld an/ausschalten.


Nachtsound ein:

POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
ACCEPT-ENCODING: gzip

USER-AGENT: Linux UPnP/1.0 Sonos/29.5-90191 (MDCR_x86_64_MacBookPro8,1)
CONTENT-LENGTH: 313
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetEQ"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetEQ xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><EQType>NightMode</EQType><DesiredValue>1</DesiredValue></u:SetEQ></s:Body></s:Envelope>HTTP/1.1 200 OK
CONTENT-LENGTH: 247
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:
Server: Linux UPnP/1.0 Sonos/29.5-91030 (ZPS9)
Connection: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetEQResponse xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"></u:SetEQResponse></s:Body></s:Envelope>



Sprachverbesserung ein:

POST /MediaRenderer/RenderingControl/Control HTTP/1.1
CONNECTION: close
ACCEPT-ENCODING: gzip

USER-AGENT: Linux UPnP/1.0 Sonos/29.5-90191 (MDCR_x86_64_MacBookPro8,1)
CONTENT-LENGTH: 315
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetEQ"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetEQ xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><EQType>DialogLevel</EQType><DesiredValue>1</DesiredValue></u:SetEQ></s:Body></s:Envelope>HTTP/1.1 200 OK
CONTENT-LENGTH: 247
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:
Server: Linux UPnP/1.0 Sonos/29.5-91030 (ZPS9)
Connection: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetEQResponse xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"></u:SetEQResponse></s:Body></s:Envelope>





Gruß Christoph



Reinerlein

Hi Christoph,

du kannst einfach das Playbar-Device als Quelle angeben. Dann wird bei einer Playbar automatisch der TV-Eingang gewählt.

Die beiden Setter baue ich ein...

Grüße
Reiner

Ralli

Hallo Reiner,

wenn Du gerade dabei bist ;):

Es besteht ja die Möglichkeit, mittels set Sonos Groups ... bestimmte Gruppen zu definieren. Möchtest Du vielleicht auch die einfache Möglichkeit des Zurücksetzens auf Defaultwerte einbauen?

Momentan lösche ich bei mir um 04 Uhr alle bestehenden Gruppen und setze sie zurück mittels


define Sonos_Init DOIF
([04:00])
(set Sonos_.*:FILTER=TYPE=SONOSPLAYER Stop)
(set Sonos_.*:FILTER=TYPE=SONOSPLAYER RemoveMember Sonos_Bad)
(set Sonos_.*:FILTER=TYPE=SONOSPLAYER RemoveMember Sonos_Esszimmer)
(set Sonos_.*:FILTER=TYPE=SONOSPLAYER RemoveMember Sonos_HWR)
(set Sonos_.*:FILTER=TYPE=SONOSPLAYER RemoveMember Sonos_Schlafzimmer)
(set Sonos_.*:FILTER=TYPE=SONOSPLAYER Volume 10)
(set Sonos_.*:FILTER=TYPE=SONOSPLAYER LoadRadio SWR3)


Denkbar wäre, in den Attributen vom Sonos-Device mittels "attr DefaultGroups ..." die Defaults anzugeben und dann mittels "set Sonos DefaultGroups" alles zurückzusetzen (und wenn das Attribut DefaultGroups leer, dann werden eben bei "set Sonos DefaultGroups" einfach nur alle Gruppen gelöscht).
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Reinerlein

Hallo Ralli,

ich kann mir das mal anschauen, aber am einfachsten ist es momentan mit folgender Anweisung:

set Sonos Groups [Sonos_Bad], [Sonos_Esszimmer], [Sonos_HWR], [Sonos_Schlafzimmer]

Wenn du deine Räume kennst, geht das so... nur wenn dir die Räume unbekannt wären, ginge das nicht...
Aber ich überlege mir mal was...

Grüße
Reiner

dantist

Hallo Reiner,

würde mich über Feedback zu meiner Frage etwas weiter oben freuen. Ein kurzes Ja oder Nein zu meiner Vermutung würde schon reichen  ;) Dann überlege ich mir einen Workaround.

Danke & Gruß
Daniel

Ralli

Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Reinerlein

Hallo Daniel,

sorry, das war bei mir untergegangen...
Der Speak Befehl versucht natürlich hinterher den alten Zustand wiederherzustellen. Momentan gibt es auch keine Möglichkeit, das zu unterbrechen...
Dasselbe gilt für PlayURITemp, welches von Speak intern dafür verwendet wird.

Grüße
Reiner

ujaudio

Hallo Reiner, darf ich meine Frage auch nochmals wiederholen?

Beim Versuch meine Sonos-Floorplanausgabe hinzubekommen komme ich in kleinen Schritten weiter, aber wenn ich die verschiedenen Attribute der readingsGroup verwenden möchte, muss ich die Bezeichner der einzelnen Readings kennen.

Die readingsGroup "mm_sonos_<Meinzimmer>_RG hat wohl 5 Elemente:
Die Grafik, sowie 4 Textfelder.

Wenn ich die 4 Bezeichner kennen würde, dann hoffe ich mit den diversen Attributen die Ausgabe in meinem Sinn formatieren zu können.

Oder wie sonst kann ich nur das Cover der ReadingsGroup ohne die texte bekommen?
Einen lieben Gruß
Jürgen

Reinerlein

Hi Jürgen,

diese ReadingsGroups baue ich mittels einer mitgelieferten Perl-Prozedur, die den HTML-Code für die Ausgabe liefert.
Dazu gibt es auch eine Beschreibung im Wiki, sowie eine Kopiervorlage für den HTML-Code-Generierer.
Da gibt es sicherlich mittlerweile auch elegantere Methoden, die ich persönlich aber bislang nicht vertieft habe.

Das Cover alleine kannst du im HTML-Code über das Reading "currentAlbumArtURL" (mit "L" am Ende) bekommen. Dieses ist auf einer Standard-Fhemweb-Oberfläche eine korrekte URL zum Cover, u.U. mit konfigurierten Proxy-Pfaden...

Grüße
Reiner

ujaudio

CurrentAlbumURL habe ich verwendet - aber dann habe ich die Radiosender nicht und auch nicht den passiven Zustand. Aktuell habeich zwar weiße Schrift auf weißen Untergrund, so dass der störende Text auf dem Floorplan nicht sichtbar ist - nur sobald ich diesen aufhübsche geht es mit dem einfachen Trick nicht mehr. Ich werde mir nochmals das Wiki vorknöpfen und ggf. am Code basteln...

Vorerst einmal vielen Dank.
Einen lieben Gruß
Jürgen

Reinerlein

Hi Jürgen,

aktiviere mal den Proxy am Sonos-Device, indem du "generateProxyAlbumArtURLs" auf "1" setzt.
Schau dir u.U. auch mal die Caching-Optionen dazu an.

Vielleicht geht das dann besser...

Grüße
Reiner

ujaudio

Ich nehme mal an, dass man die proxyCacheTime in Sekunden angibt.
Das Reading currentAlbumArtURL enthält nun immer einen "lokalen" Wert, z.B.
/fhem/sonos/proxy/aa?url=http%3A%2F%2F192.168.178.35%3A1400%2Fgetaa%3Fs%3D1%26u%3Dx-sonosapi-stream%253as104094%253fsid%253d254%2526flags%253d32
oder
/fhem/sonos/cover/empty.jpg
Da ich mit weblink image nicht dynamisch arbeiten kann, muss ich mal suchen, was fhem noch so alles kann - vermutlich muss ich wohl eine eigene Routine schreiben...
Einen lieben Gruß
Jürgen