FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: binford6000 am 18 April 2020, 11:08:57

Titel: [gelöst] foreach-Schleife funktioniert nur halb
Beitrag von: binford6000 am 18 April 2020, 11:08:57
Hallo Zusammen,
ich bräuchte mal etwas PERL-Nachhilfe! Folgender Code in myUtils:
sub fadeout($) {
my ($device) = @_;
if ($device =~ /alle/) {
my @player=devspec2array('TYPE=SONOSPLAYER:FILTER=STATE!=disappaered');
if (@player) {
foreach my $player (@player) {
fhem("msg push Player fadeout: $player");
fhem("set $player Volume 0 1");
}
}
}
else {
fhem("msg push Player fadeout: $device");
fhem("set $device Volume 0 1");
}
}


Der else-Teil funktioniert, aber beim foreach-Teil wird nur die Nachricht geschickt, der set-Befehl an die Player sieht so aus:
set openautomation/ios-on-blue.png Volume 0 1
Aus dem Log:
2020.04.18 10:50:08 5:  Cmd: >set openautomation/ios-on-blue.png Volume 0 1<
2020.04.18 10:50:08 3:  set openautomation/ios-on-blue.png Volume 0 1 : Please define openautomation/ios-on-blue.png first
2020.04.18 10:50:08 5:  Cmd: >msg push Player fadeout: play1_bu<
2020.04.18 10:50:08 5:  Cmd: >set fhembot message  Player fadeout: play1_bu<
2020.04.18 10:50:08 5:  Cmd: >set openautomation/ios-on-blue.png Volume 0 1<
2020.04.18 10:50:08 3:  set openautomation/ios-on-blue.png Volume 0 1 : Please define openautomation/ios-on-blue.png first
2020.04.18 10:50:08 5:  Cmd: >msg push Player fadeout: play1_bz<
2020.04.18 10:50:08 5:  Cmd: >set fhembot message  Player fadeout: play1_bz<
2020.04.18 10:50:08 5:  Cmd: >set openautomation/ios-on-blue.png Volume 0 1<
2020.04.18 10:50:08 3:  set openautomation/ios-on-blue.png Volume 0 1 : Please define openautomation/ios-on-blue.png first
2020.04.18 10:50:08 5:  Cmd: >msg push Player fadeout: play1_wz<
2020.04.18 10:50:08 5:  Cmd: >set fhembot message  Player fadeout: play1_wz<


Ich verstehe das nicht. Der msg-Befehl funktioniert, nicht aber der set-Befehl für die SONOSPLAYER...  :-\
VG Sebastian
Titel: Antw:foreach-Schleife funktioniert nur halb
Beitrag von: KölnSolar am 18 April 2020, 11:21:44
im else-Teil hast du eine variable, deren wert du bestimmst. Mit $_ eine Perl "special variable", die vermutlich im 1. fhem-Aufruf, anders als Du erwartest, verändert wird.
Titel: Antw:foreach-Schleife funktioniert nur halb
Beitrag von: KernSani am 18 April 2020, 11:25:18
Wie rufst du die Sub den auf? $device scheint aus irgend einem Grund den Iconnamen zu enthalten...


Gesendet von iPhone mit Tapatalk
Titel: Antw:foreach-Schleife funktioniert nur halb
Beitrag von: Otto123 am 18 April 2020, 11:51:37
Zitat von: KölnSolar am 18 April 2020, 11:21:44
im else-Teil hast du eine variable, deren wert du bestimmst. Mit $_ eine Perl "special variable", die vermutlich im 1. fhem-Aufruf, anders als Du erwartest, verändert wird.
Dann einen fhem() Aufruf machen?
fhem("msg push Player fadeout: $_;;set $_ Volume 0 1");

Aber ich habe noch die Idee: Mit Hochgeschwindigkeit Sonos befeuern (hier Volume ändern bei allen Playern) das will das Sonos System nicht. Ich mache zwischen Sonos Befehlen immer eine Pause. Je nach dem was man tut, z.B. bei Gruppenbildung bis zu 10 sec.
Aber mit Volume habe ich das nicht probiert.

Gruß Otto
Titel: Antw:foreach-Schleife funktioniert nur halb
Beitrag von: binford6000 am 18 April 2020, 13:32:40
Danke für die schnellen Antworten  :)

ZitatWie rufst du die Sub den auf? $device scheint aus irgend einem Grund den Iconnamen zu enthalten...

Einfach in Eingabefeld eingegeben. Sie funktionieren aber genauso im PERL-Code aus notify etc.
{fadeout('play1_wz')}
{fadeout('alle')}


Zitatim else-Teil hast du eine variable, deren wert du bestimmst. Mit $_ eine Perl "special variable", die vermutlich im 1. fhem-Aufruf, anders als Du erwartest, verändert wird.

Ich habe noch mehr subs die so arbeiten. Alle funktionieren (HUEDevice, LightScene, IT), bis auf diese hier mit dem SONOSPLAYER.

ZitatDann einen fhem() Aufruf machen?
Das ist nur ein Aufruf. Die msg push ist nur zum debuggen gewesen...

ZitatAber ich habe noch die Idee: Mit Hochgeschwindigkeit Sonos befeuern (hier Volume ändern bei allen Playern) das will das Sonos System nicht. Ich mache zwischen Sonos Befehlen immer eine Pause. Je nach dem was man tut, z.B. bei Gruppenbildung bis zu 10 sec.
Aber mit Volume habe ich das nicht probiert.

Denke auch dass es am SONOSPLAYER-Device liegt. Gruppierungen gehen problemlos mit den drei.
Ich probiers mal mit kleinen Pausen dazwischen.

VG Sebastian






Titel: Antw:foreach-Schleife funktioniert nur halb
Beitrag von: binford6000 am 18 April 2020, 13:37:41
Mitfhem("sleep 0.1; set $player Volume 0 1");
funktioniert der Code in der foreach-Schleife!

Danke an alle! Schönes Wochenende noch und bleibt gesund! :)
VG Sebastian