Hauptmenü

DOIF Rollade

Begonnen von Spartacus, 26 November 2015, 11:28:42

Vorheriges Thema - Nächstes Thema

Spartacus

Hallo,
ich habe mir ein kleines DOIF gebaut, welches den Rolladen 2min zeitverzögert schließt, wenn im Garten die Gartenbeleuchtung abgeschaltet wird.

Internals:
   CFGFN      Config/01-Wohnzimmer.cfg
   DEF        ([?21:30-03:00] and [GA.ss.SA.Licht] eq "off") (set EG.wz.RO.links closes)
   NAME       di.01.EG.wz.RO.links
   NR         832
   NTFY_ORDER 50-di.01.EG.wz.RO.links
   STATE      initialized
   TYPE       DOIF
   Readings:
     2015-11-26 11:20:13   state           initialized
     2015-11-26 11:20:13   timer_1_c1      26.11.2015 21:30:00
     2015-11-26 11:20:13   timer_2_c1      27.11.2015 03:00:00
     2015-11-26 11:20:23   wait_timer      no timer
   Condition:
     0          DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and InternalDoIf('GA.ss.SA.Licht','STATE','') eq "off"
   Days:
   Devices:
     0           GA.ss.SA.Licht
     all         GA.ss.SA.Licht
   Do:
     0:
       0          set EG.wz.RO.links closes
   Helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   Internals:
     0           GA.ss.SA.Licht:STATE
     all         GA.ss.SA.Licht:STATE
   Itimer:
   Realtime:
     0          21:30:00
     1          03:00:00
   State:
   Time:
     0          21:30:00
     1          03:00:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timerfunc:
Attributes:
   alias      autom. Rolladen schließen
   cmdState   auto on
   comment    schließe Rolladen zeitverzögert nach Abschaltung des Gartenlichte,
nur zwischen 21:30 und 03:00
   group      Scripte
   room       01-Wohnzimmer
   wait       120

Das funktioniert soweit.
Jetzt habe ich ein Blockade. Ich möchte jetzt, das der cmdState sich so ändert, dass er mir zwischen 21:30 und 03:00 "auto on" und in der restlichen Zeit "auto off" anzeigt. Da ich nur ein Kommandozweig im DOIF habe, funktioniert das nicht. Kann mir jemand mal einen Tipp geben?
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

kumue

..würde ein leeres DOELSE am Ende setzen...

aus commandref DOIF
Zitat+ Es können beliebig viele DOELSEIF-Angaben gemacht werden, sie sind, wie DOELSE am Ende der Kette, optional

DOLESEIF muss dementsprechend nicht gesetzt werden, es kann ein leerer DOELSE sein.

([?21:30-03:00] and [GA.ss.SA.Licht] eq "off") (set EG.wz.RO.links closes) DOELSE

Spartacus

Hallo kumue,
super danke! Das war´s

Gruß,
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 26 November 2015, 11:52:42
Hallo kumue,
super danke! Das war´s

Gruß,
Spartacus

Wundert mich aber, da ohne do always bei einer einzigen Bedingung der DOELSE-Fall (cmd_2) bei nicht Erfüllung der Bedingung immer gesetzt wird.

DOIF (...) (set bla on)
ist das Gleiche, wie
DOIF (...) (set bla on) DOELSE

wenn kein do always gesetzt wird.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

Hallo Damian,
Das heißt dann, dass man cmdState und devStateIcon auch bei nur einer Bedingung zwei Zustände zuordnen kann.
Das habe ich nicht probiert!

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 26 November 2015, 22:29:09
Hallo Damian,
Das heißt dann, dass man cmdState und devStateIcon auch bei nur einer Bedingung zwei Zustände zuordnen kann.
Das habe ich nicht probiert!

Christian

ja, aber nur wenn das Attribut do always nicht gesetzt ist.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

#6
Hallo,
ich kriege das irgendwie nicht so hin, wie ich will. Es scheitert an der Visualisierung des DOIFs

Ziel soll es sein, dass der "autom.Shutdown" nur dann aktiviert wird(cmdState="on"), wenn die "autom. Gartenbeleuchtung" (Auto) aktiv ist.
Der Rolladen soll dann zeitverzögert (120s) schließen, wenn die GartenBeleuchtung (GartenLicht) abschaltet. Gleichzeitig wird der "autom. Shutdown" wieder deaktiviert(cmdState="off"). Damit soll sichergestellt sein, dass Rolladen und GartenLicht unabhängig gefahren/geschaltet werden können. "Auto" sich quasi der trigger für Shutdown-Automatik.

DEF:
([?Auto] eq "on" and [GartenLicht] eq "off")
(set Rollo close, set Auto off)
DOELSEIF ([Auto] eq "on")
DOELSEiF ([Auto] eq "off")

cmdState:
devStateIcon:
.*on:general_an@lightgreen .*off:general_aus@red

Hat jemand einen Tipp?
Christian
on|on|off

Spartacus.

P.S. AUTO ist ein dummy, welches in dem DOIF der Gartenbeleuchtung gesetzt wird.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 28 November 2015, 15:14:53
Hallo,
ich kriege das irgendwie nicht so hin, wie ich will. Es scheitert an der Visualisierung des DOIFs

Ziel soll es sein, dass der "autom.Shutdown" nur dann aktiviert wird(cmdState="on"), wenn die "autom. Gartenbeleuchtung" (Auto) aktiv ist.
Der Rolladen soll dann zeitverzögert (120s) schließen, wenn die GartenBeleuchtung (GartenLicht) abschaltet. Gleichzeitig wird der "autom. Shutdown" wieder deaktiviert(cmdState="off"). Damit soll sichergestellt sein, dass Rolladen und GartenLicht unabhängig gefahren/geschaltet werden können. "Auto" sich quasi der trigger für Shutdown-Automatik.

DEF:
([?Auto] eq "on" and [GartenLicht] eq "off")
(set Rollo close, set Auto off)
DOELSEIF ([Auto] eq "on")
DOELSEiF ([Auto] eq "off")

cmdState:
devStateIcon:
.*on:general_an@lightgreen .*off:general_aus@red

Hat jemand einen Tipp?
Christian
on|on|off

Spartacus.

P.S. AUTO ist ein dummy, welches in dem DOIF der Gartenbeleuchtung gesetzt wird.

Rekursionen werden mit dem aktuellen DOIF-Modul unterbunden. set Auto off triggert nicht das gleiche Modul, somit bleibt das Modul im ersten Zustand.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

Hallo Damian,
ne,ich glaube wir reden aneinander vorbei. Auto ist nur ein dummy der in einem anderen DOIF gesetzt wird.
Deshalb hier mal ein List:

Internals:
   CFGFN      Config/01-Wohnzimmer.cfg
   DEF        ([Auto] eq "on")
DOELSEIF
([Auto] eq "off")
DOELSEIF
([?Auto] eq "on" and [GA.ss.SA.Licht] eq "off")
(set EG.wz.RO.links position 100 0, set Auto off)

   NAME       di.01.EG.wz.RO.links
   NR         839
   NTFY_ORDER 50-di.01.EG.wz.RO.links
   STATE      on
   TYPE       DOIF
   Readings:
     2015-11-30 20:43:49   Device          Auto
     2015-11-30 20:43:49   cmd_event       Auto
     2015-11-30 20:43:49   cmd_nr          1
     2015-11-30 20:43:49   e_Auto_STATE    on
     2015-11-30 20:43:49   state           on
   Condition:
     0          InternalDoIf('Auto','STATE','') eq "on"
     1          InternalDoIf('Auto','STATE','') eq "off"
     2          InternalDoIf('Auto','STATE','') eq "on" and InternalDoIf('GA.ss.SA.Licht','STATE','') eq "off"
   Devices:
     0           Auto
     1           Auto
     2           GA.ss.SA.Licht
     all         Auto GA.ss.SA.Licht
   Do:
     0:
       0
     1:
       0
     2:
       0          set EG.wz.RO.links position 100 0, set Auto off
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Internals:
     0           Auto:STATE
     1           Auto:STATE
     2           GA.ss.SA.Licht:STATE
     all         Auto:STATE GA.ss.SA.Licht:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   alias      autom. Rolladen schließen
   cmdState   on|off|off
   comment    schließe Rolladen zeitverzögert nach Abschaltung des Gartenlichte,
nur zwischen 21:30 und 02:30
   devStateIcon .*on:general_an@lightgreen .*off:general_aus@red
   group      Scripte
   icon       fts_shutter_down
   room       01-Wohnzimmer
   wait       0:0:120


Im Prinzip funktioniert es ja wie es soll, und der Zustand des Moduls wird auch richtig angezeigt, allerdings mit einem Schönheitsfehler:

Wenn "GA.ss.SA.Licht" während des Wait-Timers wieder auf "on" geht, soll der Wait-Timer abgebrochen werden und die Aktionen " (set EG.wz.RO.links position 100 0, set Auto off)" abgebrochen werden.
Ich habe gedacht, dies mit "do resetwait" zu realisieren, aber das klappt nicht. In der Commandref steht: "Im Gegensatz zu do always wird ein Waittimer mit dem Attribut do resetwait auch dann zurückgesetzt, wenn die gleiche Bedingung wiederholt wahr wird." Aber offenbar verstehe ich den Sachverhalt falsch.
Bin ich hier auf dem falschen Dampfer?
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 30 November 2015, 21:02:15
Hallo Damian,
ne,ich glaube wir reden aneinander vorbei. Auto ist nur ein dummy der in einem anderen DOIF gesetzt wird.
Deshalb hier mal ein List:

Internals:
   CFGFN      Config/01-Wohnzimmer.cfg
   DEF        ([Auto] eq "on")
DOELSEIF
([Auto] eq "off")
DOELSEIF
([?Auto] eq "on" and [GA.ss.SA.Licht] eq "off")
(set EG.wz.RO.links position 100 0, set Auto off)

   NAME       di.01.EG.wz.RO.links
   NR         839
   NTFY_ORDER 50-di.01.EG.wz.RO.links
   STATE      on
   TYPE       DOIF
   Readings:
     2015-11-30 20:43:49   Device          Auto
     2015-11-30 20:43:49   cmd_event       Auto
     2015-11-30 20:43:49   cmd_nr          1
     2015-11-30 20:43:49   e_Auto_STATE    on
     2015-11-30 20:43:49   state           on
   Condition:
     0          InternalDoIf('Auto','STATE','') eq "on"
     1          InternalDoIf('Auto','STATE','') eq "off"
     2          InternalDoIf('Auto','STATE','') eq "on" and InternalDoIf('GA.ss.SA.Licht','STATE','') eq "off"
   Devices:
     0           Auto
     1           Auto
     2           GA.ss.SA.Licht
     all         Auto GA.ss.SA.Licht
   Do:
     0:
       0
     1:
       0
     2:
       0          set EG.wz.RO.links position 100 0, set Auto off
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Internals:
     0           Auto:STATE
     1           Auto:STATE
     2           GA.ss.SA.Licht:STATE
     all         Auto:STATE GA.ss.SA.Licht:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   alias      autom. Rolladen schließen
   cmdState   on|off|off
   comment    schließe Rolladen zeitverzögert nach Abschaltung des Gartenlichte,
nur zwischen 21:30 und 02:30
   devStateIcon .*on:general_an@lightgreen .*off:general_aus@red
   group      Scripte
   icon       fts_shutter_down
   room       01-Wohnzimmer
   wait       0:0:120


Im Prinzip funktioniert es ja wie es soll, und der Zustand des Moduls wird auch richtig angezeigt, allerdings mit einem Schönheitsfehler:

Wenn "GA.ss.SA.Licht" während des Wait-Timers wieder auf "on" geht, soll der Wait-Timer abgebrochen werden und die Aktionen " (set EG.wz.RO.links position 100 0, set Auto off)" abgebrochen werden.
Ich habe gedacht, dies mit "do resetwait" zu realisieren, aber das klappt nicht. In der Commandref steht: "Im Gegensatz zu do always wird ein Waittimer mit dem Attribut do resetwait auch dann zurückgesetzt, wenn die gleiche Bedingung wiederholt wahr wird." Aber offenbar verstehe ich den Sachverhalt falsch.
Bin ich hier auf dem falschen Dampfer?
Spartacus

Ein laufender Timer kann nur zurückgesetzt werden, wenn der Status des Moduls wechselt. Evtl. ein DOELSE hinten dranhängen für diesen Fall.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

Hallo Damian,
ZitatEin laufender Timer kann nur zurückgesetzt werden, wenn der Status des Moduls wechselt. Evtl. ein DOELSE hinten dranhängen für diesen Fall.

Gruß

Damian
yep, das scheint es gewesen zu sein. Hier noch einmal meine Teststruktur:
Internals:
   DEF        ([Auto1] eq "on")
DOELSEIF
([Auto1] eq "off")
DOELSEIF
([?Auto1] eq "on" and [GartenLicht] eq "off")
(set Auto1 off) (set Rollo close)
DOELSE
   NAME       diRollo
   NR         945
   NTFY_ORDER 50-diRollo
   STATE      off
   TYPE       DOIF
   Readings:
     2015-12-01 13:49:37   Device          GartenLicht
     2015-12-01 13:49:37   cmd_event       GartenLicht
     2015-12-01 13:49:37   cmd_nr          4
     2015-12-01 13:49:30   e_Auto1_STATE   off
     2015-12-01 13:49:37   e_GartenLicht_STATE on
     2015-12-01 13:49:37   state           off
     2015-12-01 13:49:37   wait_timer      no timer
   Condition:
     0          InternalDoIf('Auto1','STATE','') eq "on"
     1          InternalDoIf('Auto1','STATE','') eq "off"
     2          InternalDoIf('Auto1','STATE','') eq "on" and InternalDoIf('GartenLicht','STATE','') eq "off"
   Devices:
     0           Auto1
     1           Auto1
     2           GartenLicht
     all         Auto1 GartenLicht
   Do:
     0:
       0
     1:
       0
     2:
       0          set Auto1 off
       1          set Rollo close
     3:
       0
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice GartenLicht
     sleepsubtimer 1
     sleeptimer -1
   Internals:
     0           Auto1:STATE
     1           Auto1:STATE
     2           GartenLicht:STATE
     all         Auto1:STATE GartenLicht:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   alias      auto Rollo schließen
   cmdState   on|off|off|off
   devStateIcon .*on:general_an@lightgreen .*off:general_aus@red
   do         resetwait
   group      Scripte
   icon       fts_shutter_down
   wait       0:0:0,40


Ich habe eine neue Funktion des Wait-Timers verwendet (0,40). Allerdings habe ich es nicht hingekriegt, den cmdState für diesen Teil zu überschreiben. Ist das noch ein Fehler von mir, oder ist das so von Dir gewollt, dass er mir dann cmd_3_1 (oder ähnlich) anzeigt.

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

#11
Zitat von: Spartacus am 01 Dezember 2015, 14:31:02
Ich habe eine neue Funktion des Wait-Timers verwendet (0,40). Allerdings habe ich es nicht hingekriegt, den cmdState für diesen Teil zu überschreiben. Ist das noch ein Fehler von mir, oder ist das so von Dir gewollt, dass er mir dann cmd_3_1 (oder ähnlich) anzeigt.

Christian

Z. Zt. lassen sich nur die Endzustände cmd_1, cmd_2, ... mit dem Attribut cmdState überschreiben. Die Zwischenzustände cmd_1_1, cmd_1_2, usw. lassen sich noch nicht umdefinieren. Das wird aber nächstes Jahr kommen.

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

Damin,
alles klar! kein Thema!

@ all:
Ich habe immer noch ein Problem mit meiner Rolladenautomatik. Ich versuche mal den ganzen Sachverhalt vollständig zu beschreiben. Vielleicht hat ja jemand einen Tipp für mich:

Ich habe ein DOIF, welches die Gartenbeleuchtung schaltet (di.01.GA.ss.SA.Licht).

([16:30-[offtime.GA.ss.SA.Licht.dum]] and
[state.TW.Tageslicht.dum] eq "dunkel" and
[?state.TW.Tageslicht.dum:SU] lt {TimeOffset (OffTimeLicht(),'-30')})
(set GA.ss.SA.Licht on, set Auto on, set offtime.GA.ss.SA.Licht.dum {(OffTimeLicht())})
DOELSE
(set GA.ss.SA.Licht off)

Attribute:
cmdstate on|off

Die Offtime wird in einer Funktion berechnet und im Dummy offtime.GA.ss.SA.Licht.dum gespeichert.
Das funktioniert auch einwandfrei.

Jetzt arbeite ich daran, das in einem zweiten DOIF "diRollo" eine Rolladenautomatik aktiviert werden soll, wenn das erste DOIF in den cmdState "on"  wechselt.
([di.01.GA.ss.SA.Licht] eq "on")
DOELSEIF
([?Auto] eq "on" and [GA.ss.SA.Licht] eq "off")
(set Rollo close, set Auto off)
DOELSE

Attribute:
cmdState on|off|off
wait 0:30:0
do resetwait


Damit soll "diRollo" anzeigen, dass nun die Rolladenautomatik aktiviert wurde. Schaltet nun der Aktor GA.ss.SA.Licht ab, wird der Rolladen zeitverzögert heruntergefahen. Wird  "GA.ss.SA.Licht" innerhalb der zeitverzögerung wieder eingeschaltet, wird der Wait-Timer abgebrochen. Bleibt das Licht aus und läuft der Timer ab, fährt der Rolladen herunter. Gleichzeitig wird damit auch die Rolladenautomatik deaktiviert. Dafür benutze ich das Dummy-Device "Auto", welches im 1. DOIF zusammen mit dem Gartenlicht gesetzt wird.
Das zur Theorie:

Leider klappt das nicht so wie es soll. Ich habe erwartet, dass diRollo auf "on" geht, wenn "di.01.GA.ss.SA.Licht "den cmdState "on" annimmt. Das passiert aber nicht, das Reading cmd_nr von "diRollo" steht auf 3, obwohl "di.01.GA.ss.SA.Licht" auf "on" steht. Ein manuelles "trigger di.01.GA.ss.SA.Licht" schafft Abhilfe und diRollo steht auf "on"

Warum ist das so? Hat jemand ggf. eine bessere Idee, das o.a. Szenario abzubilden?
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

Hallo,
also, vom Prinzip her scheint die o.a  Logik zu funktionieren, aber wenn das 1. DOIF triggert, schaltet das 2te DOIF nicht auf "on" ! Wo ist der Fehler?
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

Hallo,
hat niemand einen Tipp für mich? Ich krieg das irgendwie nicht sauber gelöst!
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R