[gelöst] foreach-Schleife funktioniert nur halb

Begonnen von binford6000, 18 April 2020, 11:08:57

Vorheriges Thema - Nächstes Thema

binford6000

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

KölnSolar

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.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

KernSani

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


Gesendet von iPhone mit Tapatalk
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Otto123

#3
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

binford6000

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







binford6000

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