(gelöst)DOIF lässt sich nicht vollständig triggern

Begonnen von laxmann, 14 Oktober 2017, 19:57:34

Vorheriges Thema - Nächstes Thema

laxmann

Hallo zusammen,
ich habe einige DOIF's eingerichtet - einige funktionieren, andere lassen sich nicht triggern.
Hier kurz mein Vorhaben:
Ich möchte über verschiedene Dummys die Dienstzeiten von meiner Frau und von mir dem System anzeigen und über DOIF die Kaffeemaschine, Heizung und die Abwesenheit aus der Wohnung steuern. Nach diversen Versuchen lassen sich die einzelnen cmd_1 -bis cmd_4 einzeln auslösen. Einige "cmd" lassen sich auch triggern.
Dann habe ich unter Fhem DOIF einen Hinweis gefunden.
attr di_lamp intialize initialized
Ausprobiert - und es hat bei einem Neustart auch alles funktioniert. Dies würde bedeuten, dass das DOIF-Modul nur im Status "initialize" vollständig sich triggern lässt.

Bei mir  treten bei folgenden Situationen immer Probleme auf:
Übertragung der TempList auf meine HM-Thermostate
Aktivieren/deaktivieren der unterschiedlichen "at"-Zeitsteuerungen für die Kaffeemaschine
Diese beiden Aufgabenstellungen im DOIF sollen immer erledigt werden, wenn die entsprechenden Dummy's entsprechen eingestellt sind.
Hier ein Beispiel einer DOIF-Def:

([UFrueh:state] eq "an" and [SSpaet:state] eq "an" and [Heizung:state] eq "an") (set HM_Info tempList restore tempListFruehSpaet.cfg) DOELSEIF ([SSpaet:state] eq "an" and [UFrueh:state] eq "an" and [([13:50])]) (set WS on, set Jalousien_Alle off) DOELSEIF ([UFrueh:state] eq "an" and [SSpaet:state] eq "an") (set K_off 5_10)



Was immer funktioniert sind die Zeitgesteuerten-Aktivitäten in den unterschiedlichen DOIF-Anwendungen.

Schönes Wochenende

Gruss
laxmann





Ellert

Wolltest Du uns das nur mitteilen oder hast Du eine konkrete Frage?

amenomade

ZitatDies würde bedeuten, dass das DOIF-Modul nur im Status "initialize" vollständig sich triggern lässt.
Natürlich falsch. Du musst nur verstehen, wie DOIF funktioniert.
M.M.n fehlt dir noch entweder ein leeres DOELSE, oder ein attr do always.

CommandRef lesen.
ZitatDas DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Zustandswechsel stattgefunden hat
(...)
Soll bei Nicht-Erfüllung aller Bedingungen ein Zustandswechsel erfolgen, so muss man ein DOELSE am Ende der Definition anhängen. Ausnahme ist eine einzige Bedingung ohne do always, wie im obigen Beispiel, hierbei wird intern ein virtuelles DOELSE angenommen, um bei Nicht-Erfüllung der Bedingung einen Zustandswechsel in cmd_2 zu provozieren, da sonst nur ein einziges Mal geschaltet werden könnte, da das Modul aus dem cmd_1-Zustand nicht mehr herauskäme.
(...)
Wünscht man eine Ausführung des gleichen Befehls mehrfach nacheinander bei jedem Trigger, unabhängig davon welchen Zustand das DOIF-Modul hat, weil z. B. Garage nicht nur über die Fernbedienung geschaltet wird, dann muss man das per "do always"-Attribut angeben:
attr di_garage do always
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

laxmann

Hallo amenomade und Ellert,
ZitatWolltest Du uns das nur mitteilen oder hast Du eine konkrete Frage?
Zur Klarstellung meiner Probleme hier meine Frage:
Wieso kann ich über meine drei notwendigen Dummy's, ob die Heizung aktiv ist, um die Dienstzeiten meiner Frau und von mir, nur ein Teil des DOIF steuern?

ZitatM.M.n fehlt dir noch entweder ein leeres DOELSE, oder ein attr do always.
Ich habe diese beiden Methoden ausprobiert - keine Veränderung.

Hier nochmal ein Beispiel-DOIF
([UFrueh:state] eq "an" and [SSpaet:state] eq "an" and [Heizung:state] eq "an") (set HM_Info tempList restore tempListFruehSpaet.cfg) DOELSEIF ([SSpaet:state] eq "an" and [UFrueh:state] eq "an" and [([13:50])]) (set WS on, set Jalousien_Alle off) DOELSEIF ([UFrueh:state] eq "an" and [SSpaet:state] eq "an") (set K_off 5_10)

Mit diesem DOIF sollen über die Dummy's "UFrueh", "SSpaet" und "Heizung" die TempList geladen werden und ohne dem Dummy Heizung einen entsprechenden "at"-Zeitpunkt für die Kaffemaschine einstellen. Der Trigger soll der Wechsel zwischen an und aus der Dummy's ausgelöst werden.

Wo ist mein Fehler?

Gruss
laxmann





Ellert

Das ist keine DOIF Syntax für eine Zeitangabe
[([13:50])]

Morgennebel

Eine komplette Temperaturliste neu zu schreiben ist auch keine gute Idee.

Da Du Homematic verwendest, nimm lieber sowas:


set TYPE=CUL_HM:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 regSet weekPrgSel prog1
set TYPE=CUL_HM:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 regSet weekPrgSel prog2
set TYPE=CUL_HM:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 regSet weekPrgSel prog3


Ciao, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Morgennebel

Außerdem ist der Ansatz... verwirrend...

Du schaltest vier verschiedene Dinge mit einem DOIF in verschiedenen Zweigen:


  • Eine Temperaturliste
  • WS-Device
  • Jalousien
  • _Off

das ist nicht... sinnvoll.

Lies Dich doch mal in das RESIDENTS- oder GEOFENCE-Modul ein...

Ciao, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

laxmann

Hallo zusammen,
ich habe die Lösung gefunden.
Die DOIF nur in einem cmd sein kann, konnte DOIF die Kaffeemaschine nicht einschalten, da diese Anweisung erst in cmd_2 kam.
Habe das Einschalten der Kaffeemaschine auch in cmd_1 eingeschrieben.

Ich habe mich
Lies Dich doch mal in das RESIDENTS- oder GEOFENCE-Modul ein...

beschäftigt, hat mir aber nicht zugesagt.  Deshalb möchte ich meine Tagessteuerung von Heizung, Fenster, Kaffeemaschine u. a. über DOIF erledigen.

und
ZitatEine komplette Temperaturliste neu zu schreiben ist auch keine gute Idee.

Da Du Homematic verwendest, nimm lieber sowas:

Code: [Auswählen]
set TYPE=CUL_HM:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 regSet weekPrgSel prog1
set TYPE=CUL_HM:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 regSet weekPrgSel prog2
set TYPE=CUL_HM:FILTER=model=HM-TC-IT-WM-W-EU:FILTER=chanNo=02 regSet weekPrgSel prog3

Ciao, -MN

werde ich mir anschauen.

ZitatDas ist keine DOIF Syntax für eine Zeitangabe
Code: [Auswählen]
[([13:50])]
habe ich aus einer früheren schreibweise übernommen.
Habe sie jetzt überall geändert.

Danke an alle

Gruss
laxmann

Per

Zitat von: laxmann am 15 Oktober 2017, 16:14:07Die DOIF nur in einem cmd sein kann, konnte DOIF die Kaffeemaschine nicht einschalten, da diese Anweisung erst in cmd_2 kam.
Wenn um 13:30 die Heizung an ist, wird Cmd 2 nicht ausgeführt, weil vorher abgefangen.

Wäre dir vllt. eher aufgefallen, wenn du ein paar <Enter> in deinen Quelltext eingefügt hättest ;).
([UFrueh:state] eq "an" and [SSpaet:state] eq "an" and [Heizung:state] eq "an")
(set HM_Info tempList restore tempListFruehSpaet.cfg)
DOELSEIF ([SSpaet:state] eq "an" and [UFrueh:state] eq "an" and [13:50])
(set WS on, set Jalousien_Alle off)
DOELSEIF ([UFrueh:state] eq "an" and [SSpaet:state] eq "an")
(set K_off 5_10)