Zustand der Sonosplayer vor Ausschaltung einfrieren und wiederherstellen

Begonnen von FunkOdyssey, 14 September 2017, 18:08:27

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Hallo, ich bräuchte mal euren Tipp, ob das überhaupt funktioniert, was ich vorhabe.
Ich hatte noch ein paar Zwischenstecker über und möchte meine Sonosplayer bei Abwesenheit (&Co.) ausschalten. Mir ist bekannt, dass das wirtschaftlich keinen Sinn macht, 2x5 Watt einzusparen. :-)

Nun bin ich gestern über die Bookmark-Funktionalität gestolpert und schöpfte Hoffnung. Aber leider verlieren die Sonosplayer ihre Gruppe und auch alle anderen Infos (Playlist, Track, etc.). Okay, es wird in FHEM zwar angezeigt, aber die Sonos-App ist nach dem Wiedereinschalten komplett leer.

DOIF
(
[rgr_Residents] eq "absent"
)
(
set Sonos SaveBookmarks
)
(
set zw_sw_sonos_kueche off,
set zw_sw_sonos_wohnen off,
attr Sonos disable 1,
save
)
DOELSE
(
set zw_sw_sonos_kueche on,
set zw_sw_sonos_wohnen on,
attr Sonos disable 0,
save
)
(
set Sonos_Wohnzimmer AddMember Sonos_Kueche
## ((set Sonos Groups [Sonos_Kueche,Sonos_Wohnzimmer]))
)
(
set Sonos LoadBookmarks
)



Was ich auch nicht verstehe: Die Sonos-Gruppen werden jedesmal getrennt. Und obwohl ich krampfhaft versuche, die Gruppen wieder zu vereinen, bleibt das Ergebnis negativ.

Kann mir jemand helfen?




bookmarkPlaylistDefinition: SonosGruppe:(Sonos_Wohnzimmer|Sonos_Kueche)
bookmarkSaveDir: /opt/fhem/SonosBookmarks
bookmarkTitleDefinition: SonosGruppe:(Sonos_Wohnzimmer|Sonos_Kueche)

Reinerlein

Hi FunkOdyssey,

dafür sind Bookmarks nicht ganz das richtige Mittel, bzw. bilden deine gewünschte Forderung nicht ganz ab.

Was Bookmarks tun:
- Die "bookmarkPlaylistDefinition" sichern den aktuell abgespielten Titel einer aktuellen Abspielliste. Immer wenn du die aktuelle Abspielliste veränderst (z.B. ein neues Album öffnest) wird geprüft, ob eine Information darüber vorliegt, bei welchem Titel du das letzte mal gewesen bist. Gibt es diese Info, wird der Titel angesprungen.
- Die "bookmarkTitleDefinition" sichern die Positionen innerhalb eines Titels. Immer wenn du einen neuen Titel anspringst, wird die Position innerhalb des alten Titels gesichert (es sei denn er gilt als vollständig abgespielt). Beim Aufrufen eines Titels wird geschaut, ob es einen gespeicherten Bookmark dazu gibt, und wenn ja, wird die entsprechende Position im Titel angesprungen.

Bei den Bookmarks werden also keinerlei Zustände über die Player gesichert, die du per Knopfdruck wiederherstellen könntest...
Was genau gesichert wird, kannst du auch in der Bookmarkdatei nachlesen. Es ist die Stringdarstellung eines Hashs, und somit einigermaßen lesbar :).

Da man bei Sonos nicht mehr herausbekommen kann, wie die aktuelle Abspielliste zustande gekommen ist (du könntest als erstes ja eine Favoritenliste geladen haben, dann einige Einzeltitel hinzugefügt und dann noch ein ganzes Album hinzugefügt haben), kann man diese Situation auch nicht automatisiert wiederherstellen. Du könntest dir selber die Abspielliste als Sonos-Playliste ablegen, und diese dann beim Einschalten wiederherstellen (das sind dann aber nur die Titel, die Information, wie diese dahingekommen sind, geht verloren)...
Dann greifen auch die Bookmarks, und springen zum zuletzt abgespielten Titel und innerhalb des Titels an die letzte Abspielposition (sofern passend konfiguriert :) ).

Unter https://wiki.fhem.de/wiki/SONOS#Zusammenfassung_der_Bookmarkeinrichtung ist das alles kurz zusammengefasst...

Grüße
Reinerlein

FunkOdyssey

Wow, Reinerlein. Du hast dir aber Mühe gegeben. Ich habe das Wiki rauf und runtergelesen. So richtig verstanden habe ich es jetzt durch deine Beschreibung. Ich habe mir schon so etwas gedacht und hoffte darauf, dass mir ein Profi bei der Auflösung helfen kann. Vielen Dank.

Hast du auch zufälligerweise eine Erklärung warum die Gruppen nicht wiederhergestellt werden?

Reinerlein

Hi FunkOdyssey,

das kann ich mir nur damit erklären, dass es einige Zeit braucht, bis nach dem Einschalten der Stromversorgung der Player auch steuerbar ist. Und nicht alle Player sind gleich schnell (soll heißen, wenn einer da ist, heißt das nicht, dass du auch den anderen schon verfügbar hast).

Da solltest du eher auf ein DOIF zurückgreifen, welche beide Player als appeared-Bedingung hat (und natürlich deine Anwesenheit). Dann kannst du sicher sein, dass auch beide verfügbar sind...

Grüße
Reinerlein

FunkOdyssey

Vielen Dank. Ich werde mein Glück mal versuchen.

Gibt es eigentlich eine Chance, dass du im Sonos-Masterdevice einen Setter einbaust, um das Gerät zu de/aktivieren bzw. die Child-Prozesse zu beenden?

set sonos enable
set sonos disable


Ich finde das arg unglücklich, dass ich das Device über das disable-Attribut deaktivieren muss UND danach die fhem.cfg speichern muss.

Reinerlein

Hi FunkOdyssey,

wenn du das "save" wegläßt hast du doch das gleiche wie bei einem Setter, oder?
Oder meinst du, dass dich das Fragezeichen auf der Oberfläche stört?

Im Normalfall ist das Deaktivieren des Moduls ja auch nicht notwendig. Vielleicht solltest du in die Richtung nochmal schauen...
Warum genau deaktivierst du das Modul denn?

Entdeckt er deine abwesenden Player nicht korrekt? Dann spiel mal mit dem Attribut "pingType" herum. Dieses wird für die Abwesenheitserkennung der Player verwendet.
Ansonsten poste mal das Problem dazu... Vielleicht finden wir ja eine Lösung...

Grüße
Reinerlein

FunkOdyssey

Ich dachte, dass ich das 'save' durchführen muss, damit der Child-Prozess beendet wird. So habe ich es aus dem Wiki (oder dem Forum).
Das Fragezeichen ist mir schnuppe.

Ich wollte das Modul deaktivieren, da die Sonosplayer temporär ausgeschaltet werden. Ich nahm an, dass es sonst zu Problemen kommt. Ich entnehme deinem Post, dass ich mir das scheinbar ersparen kann. Ist mir auch lieber. So kommt nichts aus dem Rhythmus.

Reinerlein

Hi FunkOdyssey,

also ein "save" ist auf jeden Fall nicht notwendig, damit der SubProzess beendet wird. In dem Augenblick, wo das Setzen des Attributs ausgeführt wird, wird auch der Prozess beendet. Ein folgendes Save sichert den Attribut-Zustand nur in der "fhem.cfg" und hat nichts mehr mit dem SubProzess zu tun.

Das Modul zu deaktivieren, ist bei einigen wenigen Anwendern ein Workaround für Probleme. Im Normalfall (wenn das Modul korrekt läuft) ist das aber nicht notwendig.

Grüße
Reinerlein

DeeSPe

Ich schalte teilweise meine Sonos auch per Steckdose beim Verlassen aus.
Standardmäßig sind alle meine Sonos gruppiert. Bei Bedarf werden die dann manuell aus der Gruppe genommen und anders bespielt.

Ich habe mir ein notify auf die Sonos Player appeared gemacht welches den jeweiligen Player direkt nach dem Wiedereinschalten wieder der Gruppe zuweist.
Somit wäre zumindest auch für Dich die Gruppierung wiederhergestellt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Elektrolurch

Zitat:
Hast du auch zufälligerweise eine Erklärung warum die Gruppen nicht wiederhergestellt werden?

Ich hatte mir da auch was manuelles programmiert, damit nach "appeared" eines Players automatisch eine Gruppierung statfinden kann.
Aber ich glaube, ich habe in der Sonos-App gesehen, dass man dort nun auch automatische Gruppierungen hinterlegen kann.... Ausprobiert hae ich es noch nicht.

Elektrolurch

configDB und Windows befreite Zone!

FunkOdyssey

#10
Was ich dir sagen kann, ist dass folgendes in einem DOIF nicht funktioniert. Und das egal wie viele Klammern ich darumherum packe:

((set Sonos Groups [Sonos_Kueche,Sonos_Wohnzimmer]))

Eckige Klammern sind bei einem DOIF halt Module/Geräte/etc.


Daher versuche ich es derzeit wie folgt:

set Sonos_Wohnzimmer AddMember Sonos_Kueche




Bei mir funktioniert das nun wie folgt:

DOIF
(
[rgr_Residents] eq "absent" ## hier steht noch mehr Code
)
(
set zw_sw_sonos_kueche off,
set zw_sw_sonos_wohnen off
)
DOELSEIF
(
[rgr_Residents] ne "absent" ## hier steht noch mehr Code
)
(
set zw_sw_sonos_kueche on,
set zw_sw_sonos_wohnen on
)
DOELSEIF
(
[Sonos_Wohnzimmer:presence] eq "appeared" and
[Sonos_Kueche:presence] eq "appeared" and
[?$SELF:cmd_nr,0] == 2 and
[?$SELF:cmd_nr,0] != 3
)
(
set Sonos_Wohnzimmer AddMember Sonos_Kueche
)
(
set Sonos_Wohnzimmer LoadRadio NameDesRadioSenders
)


Im wait-Attribut habe ich entsprechende Wartezeiten definiert.