Ich versuche gerade einen Fehler in meiner Programmierung zu lokalisieren und verstehe nun vermutlich die Reihenfolge der Abarbeitung von Befehlen in FHEM nicht richtig:
Programmiert habe ich:
or_buttoncd:on {
fhem("set or_hifisonos on");
fhem("sleep 7;
set or_harmony activity CD.hören");
}
wobei "or_buttoncd" ein dummy ist, welches über die grafische Bedienoberfläche auf "on" und "off" gesetzt werden kann. Wenn ich die Events anschaue, dann bekomme ich:
2016-03-27 14:25:22 CUL_HM or_hifi CMDs_pending
2016-03-27 14:25:22 CUL_HM or_hifisonos set_on
2016-03-27 14:25:23 dummy or_buttoncd on
2016-03-27 14:25:24 CUL_HM or_hifi CMDs_done
2016-03-27 14:25:24 CUL_HM or_hifisonos deviceMsg: on (to xx_Zentrale)
2016-03-27 14:25:24 CUL_HM or_hifisonos level: 100
2016-03-27 14:25:24 CUL_HM or_hifisonos pct: 100
2016-03-27 14:25:24 CUL_HM or_hifisonos on
2016-03-27 14:25:30 harmony or_harmony activity CD.hören
Das dummy wird also erst nach dem HomeMatic-Schalter gesetzt, obwohl es eigentlich die Vaoraussetzung ist, sprich zeitlich zuerst kommen sollte.
Bei diesem kurzen Beispiel ist es letztendlich egal, aber in einem anderen Fall macht es mir Probleme. Das Program ist:
or_buttonoff:1 {
fhem("set hifivideo_AaronVolume mute");
fhem("sleep 40;
set or_harmony activity PowerOff");
fhem("sleep 7;
set or_buttonoff 0");
# Sonos, bzw. CD abschalten
if (Value("or_hifisonos") ne "off") {
fhem ("set or_hifisonos off")
}
}
Das letzte Kommando "set or_hifisonos off" darf erst rund 47 Sekunden nach dem ersten kommen - solange dauert es nämlich bis das Gerät langsam die Lautstärke herunter gefahren hat. Aber der HomeMatic-Schalter geht schon nach 2 Sekunden weg und außerdem kommt das auslösende dummy auch erst nach 2 Sekunden:
2016-03-27 14:26:11 dummy hifivideo_AaronVolume mute
2016-03-27 14:26:13 CUL_HM or_hifi CMDs_pending
2016-03-27 14:26:13 CUL_HM or_hifisonos set_off
2016-03-27 14:26:13 dummy or_buttonoff 1
2016-03-27 14:26:13 dummy or_buttoncd off
2016-03-27 14:26:13 CUL_HM or_hifi CMDs_done
2016-03-27 14:26:13 CUL_HM or_hifisonos deviceMsg: off (to xx_Zentrale)
2016-03-27 14:26:13 CUL_HM or_hifisonos level: 0
2016-03-27 14:26:13 CUL_HM or_hifisonos pct: 0
2016-03-27 14:26:13 CUL_HM or_hifisonos off
2016-03-27 14:26:19 dummy or_buttonoff 0
2016-03-27 14:26:52 harmony or_harmony activity PowerOff
Irgendwo habe ich wohl einen Knoten im Gehirn.
Fhem's sleep ist kein echtes sleep, sondern startet den folgenden Befehl über einen timer und wartet nicht mit der Ausführung, da das dann blockierend wäre. Die nächsten Zeilen in deinem Script werden nach starten des Timers direkt ausgeführt. Works as designed.
or_buttoncd:on {
fhem("set or_hifisonos on; sleep 7; set or_harmony activity CD.hören");
}
Versuche es mal so. Dann macht das sleep auch mehr Sinn
@CoolTux: ich habe den Code geändert, aber das Verhalten bleibt unverändert.
@dev0: deine Erklärung habe ich soweit kapiert - nur weiß ich jetzt nicht wie ich es programmieren soll. Ich müsste wohl für alle später folgenden Aktionen einen passenden Timer aufziehen!?
Das sollte aber laut Code nicht so sein. Es wird der erste Befehl ausgeführt und dank des sleeps der zweite verzögert.
Entweder weitere fhem sleeps oder auf die Events der vorhergehenden Befehle reagieren, falls es welche gibt.
Zitat von: dev0 am 27 März 2016, 19:44:56
... oder auf die Events der vorhergehenden Befehle reagieren, falls es welche gibt.
Das wäre eine saubere Lösung. Danke Dir für den richtigen Weg. So sollte man es machen.
Ok, das wird meine Ostermontagsbeschäftigung.