Reihenfolge der Abarbeitung

Begonnen von ujaudio, 27 März 2016, 17:35:46

Vorheriges Thema - Nächstes Thema

ujaudio

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.
Einen lieben Gruß
Jürgen

dev0

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.

CoolTux


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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ujaudio

@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!?
Einen lieben Gruß
Jürgen

CoolTux

Das sollte aber laut Code nicht so sein. Es wird der erste Befehl ausgeführt und dank des sleeps der zweite verzögert.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dev0

Entweder weitere fhem sleeps oder auf die Events der vorhergehenden Befehle reagieren, falls es welche gibt.

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ujaudio

Ok, das wird meine Ostermontagsbeschäftigung.
Einen lieben Gruß
Jürgen