FHEM Forum

FHEM - Anwendungen => Multimedia => Thema gestartet von: Kai-Alfonso am 28 Mai 2015, 08:02:52

Titel: Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 28 Mai 2015, 08:02:52
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.
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 28 Mai 2015, 10:36:41
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 (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 (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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 01 Juni 2015, 19:06:58
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?
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 01 Juni 2015, 19:21:25
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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 01 Juni 2015, 19:44:28
wie nutze ich denn die Hilfsprozeduren? Jetzt unabhängig, ob ich das so oder andersherum mache?
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 01 Juni 2015, 20:36:07
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 (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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 02 Juni 2015, 08:13:17
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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 02 Juni 2015, 10:48:54
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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 02 Juni 2015, 10:58:43
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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 02 Juni 2015, 13:26:17
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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 02 Juni 2015, 13:34:35
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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 02 Juni 2015, 14:59:21
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.

Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 02 Juni 2015, 15:01:30
Hi Kai,

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

Grüße
Reiner
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 02 Juni 2015, 15:05:13
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?
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 02 Juni 2015, 15:32:04
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 (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
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: ph1959de am 02 Juni 2015, 15:40:26
Solche Aufgaben lassen sich eigentlich am besten mit DOIF erledigen. So schaltet z.B. ein DOIF (hier der DEF-Teil)
([pca02:power]<8.5) (set pca02 off) mit gesetztem Attribut
wait 600
einen PCA301-Zwischestecker aus, wenn die Leistungsaufnahme länger als 600 Sekunden unter 8,5 Watt liegt.

Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 02 Juni 2015, 19:32:52
Ich bräuchte leider nochmal deine Hilfe Reiner

gegeben ist folgende DEF

Sonos_Wohnzimmer_Play5:transportState.*(STOPPED|PAUSED_PLAYBACK) {
fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");
    fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @@member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');
foreach my $player (@@member) {
      fhem("set steckdose.$player off");
}
        fhem("set steckdose.Sonos_Wohnzimmer_Play5 off");
             ")

}



Logisch müsste es eigentlich richtig sein, nur syntaktisch bekomme ich da Fehler.

015.06.02 19:30:17 1: PERL WARNING: Possible unintended interpolation of @member in string at (eval 9300) line 3.
2015.06.02 19:30:17 3: eval: {
fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");;
    fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');;
foreach my $player (@member) {
      fhem("set steckdose.$player off");;
}
             ")

}
2015.06.02 19:30:17 1: PERL WARNING: Bareword found where operator expected at (eval 9300) line 6, near ""define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');;
foreach my $player (@member) {
      fhem("set"
  (Might be a runaway multi-line "" string starting on line 3)
2015.06.02 19:30:17 3: eval: {
fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");;
    fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');;
foreach my $player (@member) {
      fhem("set steckdose.$player off");;
}
             ")

}
2015.06.02 19:30:17 1: PERL WARNING: Bareword found where operator expected at (eval 9300) line 6, near "$player off"
2015.06.02 19:30:17 3: eval: {
fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");;
    fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');;
foreach my $player (@member) {
      fhem("set steckdose.$player off");;
}
             ")

}
2015.06.02 19:30:17 1: PERL WARNING: String found where operator expected at (eval 9300) line 8, near "off");;
}
             ""
  (Might be a runaway multi-line "" string starting on line 6)
2015.06.02 19:30:17 3: eval: {
fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");;
    fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');;
foreach my $player (@member) {
      fhem("set steckdose.$player off");;
}
             ")

}
2015.06.02 19:30:17 3: Sonos_Wohnzimmer_Idle_Notify return value: Global symbol "@member" requires explicit package name at (eval 9300) line 3.
Global symbol "$player" requires explicit package name at (eval 9300) line 3.
Global symbol "@member" requires explicit package name at (eval 9300) line 3.
syntax error at (eval 9300) line 6, near ""define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');;
foreach my $player (@member) {
      fhem("set steckdose"
Global symbol "$player" requires explicit package name at (eval 9300) line 6.




Zitat von: ph1959de am 02 Juni 2015, 15:40:26
Solche Aufgaben lassen sich eigentlich am besten mit DOIF erledigen. So schaltet z.B. ein DOIF (hier der DEF-Teil)
([pca02:power]<8.5) (set pca02 off) mit gesetztem Attribut
wait 600
einen PCA301-Zwischestecker aus, wenn die Leistungsaufnahme länger als 600 Sekunden unter 8,5 Watt liegt.




DOIF sieht auch ganz interessant aus - heiß das, das ich da weder ein notify noch at brauche? Also alles in der DOIF Anweisung schreiben kann, die dann von der TransportState Änderung getriggert wird?
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 03 Juni 2015, 07:59:53
Hi Kai,

für die DOIF-Lösung brauchst du keine eigenen Notify- und At-Anweisungen mehr, weil das intern durch eigene Timer realisiert ist. Ist auch meiner Meinung nach sehr übersichtlich, aber man muss sich zunächst mal in DOIF eindenken. Ich würde dir empfehlen, erstmal die jetzige Variante fertig zu machen (du stehst ja ganz kurz davor :) ), um danach die Sache zu optimieren. Das übt den Umgang mit Perl und Fhem...

Bei deiner Variante musst du darauf achten, innerhalb des define-Strings für das at-Statement keine doppelten Anführungszeichen mehr zu verwenden. Dort stehen aber bei den beiden fhem("set... Anweisungen noch doppelte Anführungszeichen...

Grüße
Reiner
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 03 Juni 2015, 09:22:39
Also ehrlich gesagt find ich es zwar schön, wenn es läuft, aber in erster Linie will ich das auch verstehen - logisch und auch dann syntaktisch. Beim letzteren hakt es grade noch ein wenig :D

Also, ich hab innerhalb der define für das at alle doppelten Hochkommata (also die für die set Befehle)  durch ein einfaches Hochkommata ' ersetzt - ging leider nicht, dann hab ich die mal weggelassen. Fehler ist jetzt folgender:

2015.06.03 09:22:07 3: Sonos_Wohnzimmer_Idle_Notify return value: Global symbol "@member" requires explicit package name at (eval 12854) line 3.
Global symbol "$player" requires explicit package name at (eval 12854) line 3.
Global symbol "@member" requires explicit package name at (eval 12854) line 3.
Global symbol "$player" requires explicit package name at (eval 12854) line 3.
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 03 Juni 2015, 10:41:46
Hallo Kai,

also weglassen der Anführungsstriche ist keine Option :)
Kannst du nochmal bitte den jetzigen Code (mit Anführungsstrichen) posten, und welche Fehlermeldungen mit diesem Code (mit Anführungsstrichen) auftreten?

Danke schon mal...

Grüße
Reiner
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 03 Juni 2015, 12:03:56
Hey,

also - das ist der aktuelle Code

Sonos_Wohnzimmer_Play5:transportState.*(STOPPED|PAUSED_PLAYBACK) {
fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");
    fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @@member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');
foreach my $player (@@member) {
      fhem('set steckdose.$player off');
}
        fhem('set steckdose.Sonos_Wohnzimmer_Play5 off');
             ")

}



der bringt folgende Meldung

2015.06.03 12:03:26 1: PERL WARNING: Possible unintended interpolation of @member in string at (eval 13486) line 3.
2015.06.03 12:03:26 3: eval: {
fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");
    fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');
foreach my $player (@member) {
      fhem('set steckdose.$player off');
}
        fhem('set steckdose.Sonos_Wohnzimmer_Play5 off');
             ")

}

2015.06.03 12:03:26 3: Sonos_Wohnzimmer_Idle_Notify return value: Global symbol "@member" requires explicit package name at (eval 13486) line 3.
Global symbol "$player" requires explicit package name at (eval 13486) line 3.
Global symbol "@member" requires explicit package name at (eval 13486) line 3.
Global symbol "$player" requires explicit package name at (eval 13486) line 3.
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 03 Juni 2015, 13:04:33
Hi Kai,

da fehlt (mindestens) die schließende geschweifte Klammer für die Definition des temporären at-Statements.

Also:

Sonos_Wohnzimmer_Play5:transportState.*(STOPPED|PAUSED_PLAYBACK) {
  fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");
  fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @@member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');
foreach my $player (@@member) {
        fhem('set steckdose.$player off');
}
        fhem('set steckdose.Sonos_Wohnzimmer_Play5 off'); }
  ");
}

Ob das jetzt alles war, müssen wir mal schauen :)

Grüße
Reiner
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 03 Juni 2015, 13:07:41
war es leider nicht  8)

Es kommt folgende Fehlermeldung

2015.06.03 13:05:39 1: PERL WARNING: Possible unintended interpolation of @member in string at (eval 13754) line 3.
2015.06.03 13:05:39 3: eval: {
  fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");
  fhem ("define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @member = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer_Play5');
foreach my $player (@member) {
        fhem('set steckdose.$player off');
}
        fhem('set steckdose.Sonos_Wohnzimmer_Play5 off'); }
  ");
}
2015.06.03 13:05:39 3: Sonos_Wohnzimmer_Idle_Notify return value: Global symbol "@member" requires explicit package name at (eval 13754) line 3.
Global symbol "$player" requires explicit package name at (eval 13754) line 3.
Global symbol "@member" requires explicit package name at (eval 13754) line 3.
Global symbol "$player" requires explicit package name at (eval 13754) line 3.
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 03 Juni 2015, 13:28:44
Hi Kai,

Ok, das mit dem Interpolation klingt nach falscher Richtung der Anführungsstriche.

Fang mal das fhem-Define für das at-Statement nicht mit doppelten Anführungsstrichen an, sondern mit einfachen, und dreh dementsprechend innerhalb des String die einfachen zu doppelten um.


Sonos_Wohnzimmer_Play5:transportState.*(STOPPED|PAUSED_PLAYBACK) {
  fhem ("delete wohnzimmer_Sonos_Idle_Off_Timer");
  fhem ('define wohnzimmer_Sonos_Idle_Off_Timer at +00:05:00 {
    my @@member = SONOSPLAYER_GetSlavePlayerNames("Sonos_Wohnzimmer_Play5");
foreach my $player (@@member) {
        fhem("set steckdose.$player off");
}
        fhem("set steckdose.Sonos_Wohnzimmer_Play5 off"); }
  ');
}


Grüße
Reiner
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 03 Juni 2015, 13:34:07
Hi Reiner,

da kam auch ne Fehlermeldung


    my @member = SONOSPLAYER_GetSlavePlayerNames("Sonos_Wohnzimmer_Play5");
foreach my $player (@member) {
        fhem("set steckdose.$player off");
}
        fhem("set steckdose.Sonos_Wohnzimmer_Play5 off"); }
   : Unknown command foreach, try help.
Unknown command }
, try help.
Unknown command }
, try help.
2015.06.03 13:30:07 3: Sonos_Wohnzimmer_Idle_Notify return value: Unknown command foreach, try help.
Unknown command }
, try help.
Unknown command }
, try help.


Also beim foreach ist er schon wieder ausserhalb der Prozedur - also hab ich innerhalb des at die ; zeichen escaped - also verdoppelt udn jetzt hat auch auch tatsächlich ein at eingetragen. Super  :D :D
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 03 Juni 2015, 15:31:09
Klapp übrigens wunderbar - vielen Dank für deine Geduld ;-)

Kleine Frage und wirklich nur aus Neugier: wie sähe sowas denn ungefähr als DOIF aus?
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Reinerlein am 03 Juni 2015, 15:56:06
Hi Kai,

da definierst du deine Bedingung und was er machen soll, und gibst eine Verzögerung an.

Also wie ph1959de geschrieben hat:

define transportDOIF DOIF ([Sonos_Wohnzimmer:transportState] ne "PLAYING") (<Hier muss der Code zum Abschalten der Playersteckdosen hin>)

attr transportDOIF wait 600


Da müsstest du aber nochmal schauen, wie du da den Perl-Code schreiben musst, und ob und wie da etwas maskiert werden muss. Das weiß ich jetzt nicht auswendig...
Die Verzögerung von 600 Sekunden unterbindet das Abschalten automatisch, wenn die Bedingung nicht mehr zutreffen sollte, und startet einen neuen Zähler, wenn sie wieder zutrifft...

Hier ist das sicherlich die elegantere Variante. Deine jetzige Variante ist eher als "Basiswissen" zu betrachten, was man für Fhem auf jeden Fall haben sollte :)

Grüße
Reiner
Titel: Antw:Sonos -Steckdose nach x Minuten Inaktivität ausschalten
Beitrag von: Kai-Alfonso am 03 Juni 2015, 15:57:47
Das sehe ich auch so - jedenfalls hat mir das Beispiel schon einiges näher gebracht :-)