Sonos -Steckdose nach x Minuten Inaktivität ausschalten

Begonnen von Kai-Alfonso, 28 Mai 2015, 08:02:52

Vorheriges Thema - Nächstes Thema

Kai-Alfonso

Hi,

ich habe meine Sonos an schaltbare Steckdosen angeschlossen - aber immer dran zu denken, diese bei nichtgebrauch auszuschalten ist ein wenig mühselig.

Hat es schon jemand realisiert, den Status der Sonos-Boxen (oder Gruppeb) abzufragen und wenn der Status stopped für x Minuten anhält, die entsprechende Steckdose zu schalten.
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Reinerlein

Hi Kai-Alfonso,

im Wiki gibt es ein passendes Beispiel dafür: http://www.fhemwiki.de/wiki/SONOS#Beispiel_f.C3.BCr_eine_Verst.C3.A4rkerschaltung_auf_Basis_des_Player-Zustands

Ich schalte damit zwar meinen dahinterhängenden Verstärker (und kann ihn dementsprechend auch beim Starten der Musik wieder anschalten), aber das kannst du ja anpassen.

Wenn du da eine Variante mit Überprüfung des Gruppenmasters haben möchtest, dann kannst du mit der Prozedur "SONOSPLAYER_GetMasterPlayerName($name)" (beschrieben unter http://www.fhemwiki.de/wiki/SONOS#N.C3.BCtzliche_Hilfs-Prozeduren_aus_den_Modulen) diesen herausfinden und daran eine Prüfung in deinem Notify festmachen.

Grüße
Reinerlein

Kai-Alfonso

Hallo Reinerlein,

jetzt habe ich auch - da jetzt die Erkennung funktioniert, ob ein Sonos Gerät da ist oder nicht, endlich Zeit, mich um die anderen "Baustellen" zu kümmern ;-)

Das sich die Sonos nach dem Einschalten eine Gruppe bilden, habe ich schon hinbekommen und wie man die Player ausschaltet, hab ich denke ich auch verstanden (notify auf den Status stopped oder pause und dann nach timer ablauf halt die Schaltung der Steckdosen.)

Jetzt ist es so, das ich die Hilfs-Prozedur SONOSPLAYER_GetMasterPlayerName gerne nutzen möchte, weil die Slaves einer Gruppe immer den Status Playing haben (jedenfalls bei mir ist das so)  - dann wäre es logisch, den Gruppenmaster zu ermitteln, um den tatsächlichen Playstatus der Gruppe zu bestimmen. Nur mit ist nicht genau klar, wie ich und wo ich die Hilfsprozedur nutze. Ich muss ja den Rückgabewert in die Variable schreiben und diese dann beim notify nutzen, oder?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Reinerlein

Hallo Kai,

am einfachsten ist es wohl, wenn du es andersherum aufbaust:
Wenn ein Player den Zustand zu stopped oder pause wechselt, dann alle seine Slaves (und ihn selber natürlich) nach einer Weile abschalten.
Die Liste dazu bekommst du mit "SONOSPLAYER_GetSlavePlayerNames($name)" heraus...

Grüße
Reiner

Kai-Alfonso

wie nutze ich denn die Hilfsprozeduren? Jetzt unabhängig, ob ich das so oder andersherum mache?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Reinerlein

Hallo Kai,

Perl-Code wie immer in geschweiften Klammern, wie im Beispiel: http://www.fhemwiki.de/wiki/SONOS#Beispiel_f.C3.BCr_eine_Verst.C3.A4rkerschaltung_auf_Basis_des_Player-Zustands

Also ungefähr folgendes:

define Sonos_Wohnzimmer_GoNotPlaying_Notify notify Sonos_Wohnzimmer:transportState.*(STOPPED|PAUSED_PLAYBACK) {
  my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer');
  foreach my $player (@member) {
    fhem("set steckdose_$player off");
  }

  fhem("set steckdose_Sonos_Wohnzimmer off");
}

Natürlich musst du dir das anpassen, besonders die Steckdosenschalternamen :)

Eine weitere Sache ist, dass du da einen Timer zwischenschalten solltest. Ein Sonos-Player geht beim Wechsel zwischen Radio und Bibliothek kurz auf Stopped, bei dir wären die dann gleich mal weg :)

Grüße
Reiner

Kai-Alfonso

Ah, super - so ein Beispiel hat mir gefehlt. So verstehe ich auch die Anbindung  und kann sie für meine Bedürfnisse verändern.

Vielen Dank
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Kai-Alfonso

Hallo Reiner,

ich hab dummerweise doch noch ne Frage ;-)

Zitat von: Reinerlein am 01 Juni 2015, 20:36:07


Also ungefähr folgendes:

define Sonos_Wohnzimmer_GoNotPlaying_Notify notify Sonos_Wohnzimmer:transportState.*(STOPPED|PAUSED_PLAYBACK) {
  my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer');
  foreach my $player (@member) {
    fhem("set steckdose_$player off");
  }

  fhem("set steckdose_Sonos_Wohnzimmer off");
}


Wenn ich das richtig verstehe, entsteht ein Array mit den Sonos Playern als Inhalt. Du machst für jeden Sonosplayer($player), der in der Gruppe Sonos_Wohnzimmer ist, die Steckdose mit dem namen steckdose_$player  aus. Also heißt mein Sonosplayer Wohnzimmer_Play3 und Wohnzimmer_Play5 so schaltet er steckdose_Wohnzimmer_Play3 und steckdose_Wohnzimmer_Play5 off.

Ich habe mein Steckdosen aber nicht den Geräten zugeordnet, sondern ich hab ein Namensschema steckdose.$RAUM.$NUM - also steckdose.wohnzimmer.1 usw.  Muss ich dann wohl die Steckdosen umbenennen, weil ich habe ja im define von Sonosplayer keinen abfragbaren Bezug zur schaltbaren Steckdose, wenn die sich nicht im Namenskontext des Sonosplayers befindet.

Wäre für mir kein Problem, aber evtl geht es ja doch?

Als und wollte ich fragen, was der zweite set Befehl schaltet, der außerhalb der for each Schleife ist.

Danke und Gruß

KAi
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Reinerlein

Hallo Kai,

genau, irgendwie musst du von den Sonosplayer-Devicenamen auf deine Steckdosen-Devicenamen kommen. Entweder über ein passendes Namensschema wie in meinem Beispiel, oder über eine eigene myUtils-Prozedur (oder auch direkt dort im Notify bzw. at), wo du mittels If-Abfragen die Verbindung vornimmst.

Du kannst dir auch ein userAttr schaffen, wo du dann bei den Playerdevices den Namen der dazugehörigen Steckdose einträgst, und in deinem Abschaltmechanismus dieses Attribut dann abfragst.

Der zweite Set-Befehl ist für den meldenden Player selbst. Falls er der Master sein sollte, kommt er in der Slaveliste nicht vor, und muss doch trotzdem ausgeschaltet werden. Sonst hast du alle Mitglieder der Gruppe abgeschaltet, aber der Hauptplayer läuft immer noch :)

Grüße
Reiner

Kai-Alfonso

Hi Reiner,

ich bekomme irgendwie beim Schaltbefehl noch einen Fehler.


2015.06.02 13:17:29 3: Sonos_Wohnzimmer_Idle_Off return value: No such class Sonos_Wohnzimmer_Play5member at (eval 6755) line 2, near "{
  my Sonos_Wohnzimmer_Play5member"
syntax error at (eval 6755) line 2, near "my Sonos_Wohnzimmer_Play5member ="
Bareword "Sonos_Wohnzimmer_Play5member" not allowed while "strict subs" in use at (eval 6755) line 3.


und so sieht meine DEF aus

{
  my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');
  foreach my $player (@member) {
    fhem("set steckdose.$player off");
  }

  fhem("set steckdose.Sonos_Wohnzimmer_Play5 off");
}


Unsichtbare Steuerzeichen usw kann ich eigentlich ausschließen
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Reinerlein

Hi Kai,

hast du das über die Fhemweb-Oberfläche eingegeben? Sonst musst du noch die Zeilenumbrüche maskieren

Ansonsten musst du vielleicht noch das @-Zeichen maskieren (also verdoppeln), wenn du dich im notify befindest (das musst du dann wieder ändern, wenn du das in ein at packen solltest)...

Grüße
Reiner

Kai-Alfonso

Eingegeben hab ich das über FHEMWEB (Def-Editor) - wenn ich das richtig verstanden habe, werden da ja die Zeilenumbrüche escaped?

Ansonsten habe ich jetzt statt @member@@membergenommen und es kommt eine andere Fehlermeldung

2015.06.02 14:54:20 3: Sonos_Wohnzimmer_Idle_Off return value: No such class Sonos_Wohnzimmer_Play5member at (eval 7262) line 2, near "{
  my Sonos_Wohnzimmer_Play5member"
syntax error at (eval 7262) line 2, near "my Sonos_Wohnzimmer_Play5member ="
Global symbol "@member" requires explicit package name at (eval 7262) line 3.

Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Reinerlein

Hi Kai,

du hast jetzt nur das zweite @-Zeichen maskiert. Du musst auch das erste Vorkommen hinter der my-Klausel maskieren...

Grüße
Reiner

Kai-Alfonso

Argh - ganz übersehen - wie peinlich :-( :o :o :o :o

Gute Nachricht ist aber, das es wunderbar jetzt geht - muss ich jetzt nur noch nen sleep reinsetzen.

Noch ne Frage.  Ich will die Boxen 30 Minuten nach einem Pause oder Stop ausschalten - aber das Ausschalten (oder den Timer unterbrechen) verhindern, wenn die Boxen in der Zeit wieder was spielen, also der Status auf Playing wieder geht. Was passiert denn, wenn innerhalb der Sleep Zeit der State sich ändert?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Reinerlein

Hi Kai,

du kannst das nicht über ein Sleep machen.
Du musst in dem Notify ein at definieren, welches mit 30 Minuten Verzögerung (also einer Angabe von +00:30:00) den jetzt von dir geschriebenen Code ausführt.
Dann brauchst du ein weiteres Notify, welches auf den TransportState "PLAYING" reagiert, wo genau dieses at (sprich: Du musst einen bekannten aber für diesen Zweck eindeutigen Namen verwenden) wieder gelöscht wird.

Deswegen gibt es in meinem Beispiel (unter http://www.fhemwiki.de/wiki/SONOS#Beispiel_f.C3.BCr_eine_Verst.C3.A4rkerschaltung_auf_Basis_des_Player-Zustands) zwei getrennte Notify-Anweisungen...

Grüße
Reiner