Sonos -Steckdose nach x Minuten Inaktivität ausschalten

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

Vorheriges Thema - Nächstes Thema

ph1959de

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.

Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

Kai-Alfonso

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?
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,

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

Kai-Alfonso

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.
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,

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

Kai-Alfonso

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.
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,

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

Kai-Alfonso

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.
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,

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

Kai-Alfonso

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
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

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?
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,

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

Kai-Alfonso

Das sehe ich auch so - jedenfalls hat mir das Beispiel schon einiges näher gebracht :-)
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)