Sonos steuern

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

Vorheriges Thema - Nächstes Thema

Reinerlein

Hi Loredo,

das Reading wird vom Player so geliefert. In einer Gruppe ist nur der Gruppenmaster mit vollständigen Informationen versorgt. Die restlichen Informationen werden von Sonos nicht geliefert.
Das sieht man z.B. wenn man eine LineIn-Wiedergabe von einem anderen Player hat. Da wechselt nämlich nach eine Weile des Nichtspielens am Eingang der Transportstate auf Stopped...

Ich habe noch eingebaut, dass man sieht, dass es eine Gruppenwiedergabe ist, wollte aber jetzt nicht eine Fremdaktualisierung einbauen (das hieße ja, dass bei Events an Player1, dem Master, auch alle Titel-/Playreadings als Event an PlayerN derselben Gruppe erzeugt werden müssten).
Das hätte nur einen Haufen Events zur Folge, die dann ja alle denselben Inhalt haben.

Bei dem Sonos-Controller ist das geschickt gelöst, da es die gruppierten anderen Player einfach nicht mehr auf der Oberfläche zu sehen gibt.
Das könnte man sich natürlich auch durch eine Readingsgroup nachbauen, die immer die Informationen des Gruppenmasters anzeigt (auch ein einzelner Player ist sein eigener Master).
Ist aber natürlich auch wieder sehr individuell :) Wäre aber auf jeden Fall was für die Beispiele im Wiki, wenn das jemand hätte...

Grüße
Reinerlein

Loredo

Zitat von: Reinerlein am 26 Januar 2015, 11:56:11
das Reading wird vom Player so geliefert. In einer Gruppe ist nur der Gruppenmaster mit vollständigen Informationen versorgt. Die restlichen Informationen werden von Sonos nicht geliefert.


Das habe ich mir schon gedacht. Hast du mal drüber nachgedacht, nur das FHEM Reading dann trotzdem zu synchronisieren? Letztlich befinden sich die Geräte ja alle im gleichen Zustand (von außen betrachtet).
Hintergrund: Ich versuche Sonos gerade in mein Media Structure-Device einzubinden und da gibt es jede Menge Hürden den Status korrekt hoch zu aggregieren.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Reinerlein

Hi Loredo,

du meinst jetzt den "transportState"?
Naja, korrekterweise müsste man dann ziemlich viele Readings übertragen (diejenigen, die für die Darstellung des Inhalts und Abspielzustands da sind)...

Ich denke, wenn man sein Fhem zu einem solchen Mediasteuerungssystem (so mit Oberfläche und so) aufbauen möchte, sollte man eher eine Zwischenschicht einbauen.
Man könnte also für jeden notwendigen SonosPlayer eine neue readingsGroup erzeugen, deren Inhalt vom jeweiligen Master kommt...

Du kannst dir z.B. mit dem Befehl:

SONOSPLAYER_GetRealTargetPlayerHash($hash);
den Hash-Eintrag des eigentlichen Masters geben lassen.

Damit ermittele ich auch intern, wo ich meine Steuerbefehle hinsenden muss (die müssen schließlich auch immer an den Master gehen).

Damit könnte man doch jetzt aber sowas wie eine readingsGroup und auch eine RemoteControl dynamisch mit Inhalten vom jeweiligen Master versorgen...
Wenn der Player alleine eine "Gruppe" ist, gibt die Prozedur den übergebenen Hash wieder. Du kannst das also einfach immer verwenden...

Grüße
Reinerlein

Reinerlein

Hi Loredo,

ich habe mich kurz mit der Masterplayer-Thematik beschäftigt, und habe dazu eine vereinfachte Prozedur gebaut: "SONOSPLAYER_GetMasterPlayerName()"
Diese benötigt den Devicenamen des Players, zu dem du den Masterplayerdevicenamen haben möchtest.

Also z.B.:

my $master = SONOSPLAYER_GetMasterPlayerName("Sonos_Wohnzimmer");


Dann habe ich mit Unterstützung von justme1969 vom readingsGroup-Modul eine ReadingsGroup zusammengebaut, die die Anzeige vom Master holt:

define Sonos_WohnzimmerRG2 ReadingsGroup Sonos_Wohnzimmer:infoSummarize2@{SONOSPLAYER_GetMasterPlayerName($DEVICE)}
attr Sonos_WohnzimmerRG2 valueFormat {" "}
attr Sonos_WohnzimmerRG2 valuePrefix {SONOS_getCoverTitleRG(SONOSPLAYER_GetMasterPlayerName($DEVICE))}
attr Sonos_WohnzimmerRG2 noheading 1
attr Sonos_WohnzimmerRG2 nonames 1
attr Sonos_WohnzimmerRG2 notime 1

Hier besteht noch das Manko, dass man bei einem Gruppenumbau diese ReadingsGroup einmal anticken muss. Siehe dazu auch http://forum.fhem.de/index.php/topic,14425.msg252626.html#msg252626.
Aber longpoll (solange die Gruppe nicht umgebaut wurde) geht.

Damit kannst du dir jetzt eine Oberfläche zusammenbauen, die zu einem Player immer die korrekten Informationen anzeigt, ohne diese in die eigentlichen Playerdevices duplizieren zu müssen...

Grüße
Reinerlein

Loredo

Hi Rainer,


mir geht es gar nicht um eine Oberflächen-Spielerei. Ich möchte vielmehr beim Verlassen des Hauses über eine structure gesteuert alle Geräte mittels eines einzigen "off" Befehls ausschalten. Auch soll der Befehl nur abgesetzt werden, wenn ein Device tatsächlich noch in Gebrauch ist. Dafür muss der Status "on" oder "off" aber korrekt über die Structure hochaggregiert werden.


Ich habe es jetzt auch soweit hingefummelt. Allerdings hätte ich gedacht, dass es schicker wäre, im SONOS Device einen Gesamtstatus zu haben statt ihn sich über eine Structure bauen zu müssen. Über die Structure steuere ich aktuell auch, dass alle Geräte (ganz gleich ob in einer Gruppe oder nicht) gemutet werden, wenn beispielsweise das Telefon klingelt o.ä. Auch da wäre ein Global-Mute (analog zu Pause/Stop) ggf. sinnvoll. Korrekterweise müsste das SONOS Device dann aber auch die Status von den SONOSPLAYER Devices logisch hochaggregieren (ggf. mit variabler Einstellung was höhere Prio hat, mute oder unmute). Beim state "on" oder "off" wäre es einfach, denn sobald ein SONOSPLAYER Device im transferState PLAYING ist, ist das Sonos System in gebrauch und somit "on".
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

Hier nochmals zur Verdeutlichung, wie ich jetzt die Structure umgesetzt habe. Ob es mir von den Funktionen her so genügt, muss ich noch schauen. Ich habe das Gefühl man könnte da sicherlich einiges besser/schlanker machen, wenn man es im Modul verfügbar hätte.




define Sonos_Bedroom SONOSPLAYER RINCON_B8E93722EB1001400_MR
attr Sonos_Bedroom userattr g_audio g_audio_map g_media g_media_map structexclude
attr Sonos_Bedroom alias Sonos Bedroom
attr Sonos_Bedroom devStateIcon on:rc_PLAY.svg:off off:rc_PAUSE.svg:on initialized:rc_POWER.svg
attr Sonos_Bedroom eventMap Play:on Pause:off STOPPED:off PAUSED_PLAYBACK:off PLAYING:on
attr Sonos_Bedroom g_audio g_APT_Audio
attr Sonos_Bedroom g_audio_map transportState:PLAYING:on transportState:STOPPED:off transportState:PAUSED_PLAYBACK:off Mute:1:mute
attr Sonos_Bedroom group Media
attr Sonos_Bedroom stateFormat transportState
attr Sonos_Bedroom room Sonos,Bedroom
attr Sonos_Bedroom webCmd Volume:Mute


define Sonos_Bathroom SONOSPLAYER RINCON_B8E93783CA9801400_MR
attr Sonos_Bathroom userattr g_audio g_audio_map g_media g_media_map structexclude
attr Sonos_Bathroom alias Sonos Bathroom
attr Sonos_Bathroom devStateIcon on:rc_PLAY.svg:off off:rc_PAUSE.svg:on initialized:rc_POWER.svg
attr Sonos_Bathroom eventMap Play:on Pause:off STOPPED:off PAUSED_PLAYBACK:off PLAYING:on
attr Sonos_Bathroom g_audio g_APT_Audio
attr Sonos_Bathroom g_audio_map transportState:PLAYING:on transportState:STOPPED:off transportState:PAUSED_PLAYBACK:off Mute:1:mute
attr Sonos_Bathroom group Media
attr Sonos_Bathroom stateFormat transportState
attr Sonos_Bathroom room Sonos,Bathroom
attr Sonos_Bathroom webCmd Volume:Mute


define Sonos_Living_Room SONOSPLAYER RINCON_B8E93722EB5001400_MR
attr Sonos_Living_Room userattr g_audio g_audio_map g_media g_media_map structexclude
attr Sonos_Living_Room alias Sonos Living Room
attr Sonos_Living_Room devStateIcon on:rc_PLAY.svg:off off:rc_PAUSE.svg:on initialized:rc_POWER.svg
attr Sonos_Living_Room eventMap Play:on Stop:off STOPPED:off PLAYING:on
attr Sonos_Living_Room g_audio g_APT_Audio
attr Sonos_Living_Room g_audio_map transportState:PLAYING:on transportState:STOPPED:off transportState:PAUSED_PLAYBACK:off Mute:1:mute
attr Sonos_Living_Room group Media
attr Sonos_Living_Room stateFormat transportState
attr Sonos_Living_Room room Sonos,Living
attr Sonos_Living_Room webCmd Volume:Mute


define Sonos_Kitchen SONOSPLAYER RINCON_B8E93732EB5401400_MR
attr Sonos_Kitchen userattr g_audio g_audio_map g_media g_media_map structexclude
attr Sonos_Kitchen alias Sonos Kitchen
attr Sonos_Kitchen devStateIcon on:rc_PLAY.svg:off off:rc_PAUSE.svg:on initialized:rc_POWER.svg
attr Sonos_Kitchen eventMap Play:on Pause:off STOPPED:off PAUSED_PLAYBACK:off PLAYING:on
attr Sonos_Kitchen g_audio g_APT_Audio
attr Sonos_Kitchen g_audio_map transportState:PLAYING:on transportState:STOPPED:off transportState:PAUSED_PLAYBACK:off Mute:1:mute
attr Sonos_Kitchen group Media
attr Sonos_Kitchen stateFormat transportState
attr Sonos_Kitchen room Sonos,Kitchen
attr Sonos_Kitchen webCmd Volume:Mute


define g_APT_Audio structure g_audio Sonos_Bedroom Sonos_Bathroom Sonos_Kitchen Sonos_Living_Room
attr g_APT_Audio userattr g_media g_media_map structexclude
attr g_APT_Audio alias Sonos System
attr g_APT_Audio clientstate_behavior relative
attr g_APT_Audio clientstate_priority mute on off
attr g_APT_Audio devStateIcon on:rc_PLAY.svg:off off:rc_PAUSE.svg mute:rc_PLAY.svg:mute 0
attr g_APT_Audio g_media g_APT_Media
attr g_APT_Audio g_media_map on:on off:off mute:on
attr g_APT_Audio group Media
attr g_APT_Audio icon audio_volume_mid
attr g_APT_Audio room Sonos
attr g_APT_Audio webCmd :


define g_APT_Media structure g_media g_APT_Audio LR_AVR LR_SAT
attr g_APT_Media alias Media
attr g_APT_Media clientstate_behavior relative
attr g_APT_Media clientstate_priority on off
attr g_APT_Media devStateIcon off:rc_STOP .*:rc_YELLOW:off
attr g_APT_Media group Home State
attr g_APT_Media icon audio_sound
attr g_APT_Media room Apartment
attr g_APT_Media webCmd :
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Reinerlein

Hi Loredo,

also mit der Aggregation von Werten der einzelnen Player würde ich mich im Modul schwer tun.
Das ist zu speziell: Der eine will alle Räume, der andere nur Teile davon und dann auch mehrere "Gruppen", usw...
Auch mit einem aggregierten "on" oder "off" wäre ich nicht glücklich, da es meinem Verständnis nach kein on oder off bei Sonos gibt.
Ich denke, mit einer Structure ist das schon am Besten gelöst

Was ich aber natürlich einbauen kann, ist ein "Mute" auf dem Sonos-Device. Ein Groupmute am Player gibt es ja schon.

Grüße
Reinerlein

Reinerlein

Hallo zusammen,

ich habe gerade eine Änderung eingecheckt:
Es gibt jetzt einen Setter "Mute" am Sonos-Device. Mit diesem kann bei allen Playern in einem Rutsch der Mute-Zustand gesetzt werden.

Ab jetzt im SVN, ab Morgen im Update...

Grüße
Reinerlein

Loredo

Zitat von: Reinerlein am 27 Januar 2015, 19:50:02
Was ich aber natürlich einbauen kann, ist ein "Mute" auf dem Sonos-Device. Ein Groupmute am Player gibt es ja schon.



Ja, danke dir :D

Trotzdem kann ich da ja nur auf Verdacht muten, aber nicht, weil ich genau aus dem Reading ersehen kann, dass gerade auf irgend einem Device etwas abgespielt wird und die Devices noch nicht gemutet sind. Dafür muss ich halt wieder selbst Code schreiben (if... then...else...fi). Bei der Structure kann ich jetzt wenigstens sehen "oh, da wird gerade tatsächlich etwas gespielt, jetzt macht es Sinn auch zu muten". Ich weiß, viele muten dann wohl einfach egal ob es nötig ist oder nicht und ich bin hier etwas pingelig... 8)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

#1509
Achso und bzgl on/off: Jedes Gerät hat zu dem tatsächlichen Zustand sicherlich eine eigene Definition. Was ich jedoch ja erreichen möchte ist, dass bei "set g_APT_Media off" alle Mediengeräte in den sagen wir mal betriebslosen Zustand geschaltet werden. Dafür muss eben auch ein Sonos Gerät den Befehl "off" kennen und halt eben das ausführen, was dem am nächsten kommt. Das ist ja einer der Gründe, weshalb bei den Media Geräten die Befehle möglichst überall gleich sein sollten, damit das nicht so kompliziert wird in einer Structure. Gleichzeitig sollte der Modulentwickler IMHO die Entscheidung abnehmen, was dem Zustand "off" am nächsten kommt, wenn es diesen sonst nicht unbedingt so in der Form gibt (ja Bevormundung, ich hab die Kritiker gehört...).
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Spartacus

Hallo Reiner,
ich weiß, es ist schon mehrfach angefragt worden, aber vielleicht gibt es inzwischen neue Erkenntnisse dazu:

Stichwort Gruppendurchsage!
Ist es möglich eine Durchsage an mehrere Sonos-Devices zeitgleich zu senden?

Hintergrund:
Ich möchte die Türklingel einbinden und auf eine zuvor definierte Gruppe von Geräten den BigBen als mp3 abspielen, wenn der Klingeltaster gedrückt wird. Wenn erst die Sonos-Gruppe gebildet wird, dann ist der DHL-Mann bereits weg, bevor BigBen erklingt. Das dauert einfach zu lange. Und dann muss die Gruppe danach auch wieder getrennt werden und der alte Playlistenzustand/Radio Stream wieder starten...
Wenn überhaupt, wird es wahrscheinlich recht aufwändig, richtig?

Danke,
Christian

Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hi Loredo,

meine Meinung dazu kennst du ja.
Was spricht denn dagegen, vorhandene Fhem-Features für diese individuellen Wünsche zu verwenden?

Es gibt das Attribut "eventMap" mit dem man "eigene" Befehle zurechtbauen kann.

In deinem Fall z.B.:

attr Sonos_Wohnzimmer eventMap Stop:off Play:on


Damit kannst du dann einen neuen Setter "off" bzw. "on" verwenden, und die tun genau das, was du möchtest...

Grüße
Reinerlein

Reinerlein

#1512
Hi Christian,

Das ist problematisch. Es gibt seitens Sonos keine schnellere Variante für die Gruppenbildung. Die tauschen untereinander beim Bilden der Gruppe eine Menge Informationen aus, und deswegen dauert das ein bißchen.
Sich den Zustand aller Gruppenmitglieder vor einer Gruppierung zu merken dürfte irgendwann ziemlich komplex werden. Eine der Fragen die sich dabei stellt, ist z.B., wielange diese Informationen gültig sein sollen und wiederhergestellt werden sollen... Was passiert, wenn nicht die gesamte Gruppe aufgelöst wird... was soll passieren, wenn die Player direkt in eine andere Gruppierung umgebaut werden... usw...

Das schnellste dürfte einfach eine Sammelwiedergabe sein, und natürlich eine Cachingvorgabe für die Durchsagedateien...

Also auf jeden Fall das Attribut "targetSpeakFileHashCache" auf "1" setzen, und das Attribut "targetSpeakFileTimestamp" nicht setzen (oder auf "0").
Damit werden gleiche Texte nicht doppelt angefragt und erzeugt.

Mit einem Sammelbefehl z.B. kannst du dann die Durchsage starten:

set Sonos_Wohnzimmer,Sonos_Flur Speak 10 de Dies ist ein Test.
Wenn dieser Text schon mal wiedergegeben wurde (vielleicht bei einem Test :) ), dann sollte die Wiedergabe auf dem ersten System praktisch gleich starten. Die weiteren Player sollten da eigentlich auch keine lange Verzögerung mehr aufweisen...

Edit:
Ich sehe gerade, dass du ja ein MP3 wiedergeben möchtest. Dann brauchst du den ganzen Durchsagequatsch natürlich nicht, und du machst das ja direkt:

set Sonos_Wohnzimmer,Sonos_Flur PlayURITemp \\pfad\zum\mp3
Dauert das schon zulange?
Aber natürlich hat die Wiedergabe dann eine kurze Verzögerung dazwischen... Das klingt bestimmt interessant. So wie bei Marty McFly im ersten Teil mit den Uhren beim Doc :)

Grüße
Reiner

John

Hallo Reiner,
ich bin mit folgender Meldung geplagt.
ZitatLoading device description failed with error: 500 Can't connect to 192.168.66.253:52881 (timeout) at ./FHEM/00_SONOS.pm line 3227 thread 4
Loading device description failed with error: 500 Can't connect to 192.168.66.253:80 (timeout) at ./FHEM/00_SONOS.pm line 3227 thread 4

Woher er die IP-Adresse nimmt ist mir ein Rätsel.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Reinerlein

Hi John,

das scheint ein Zoneplayer von dir zu sein (zumindest denkt das Modul das). Und aus irgendeinem Grund erreicht das Modul den nicht, um das Beschreibungsdokument zu laden.

Ist die Adresse denn von einem Player?

Grüße
Reiner