DOIF/do always Alternative am Beispiel einer Rollladenautomatik

Aus FHEMWiki
Wechseln zu: Navigation, Suche

DOIF führt die Anweisungen einer Bedingung nur 1x aus. Das kann durch Setzen des Attributes 'do' mit dem Wert 'always' geändert werden, doch manchmal ist eine Mix aus beiden Situationen interessant, wie dieses Beispiel zeigen soll.

Rollladensteuerung mittels Twilight

Die Rollläden sollen bei einstellbaren Twilight-Werten hoch, bzw. runter gefahren werden. Natürlich passt diese Automatik nicht immer und es wird manuell eingegriffen. Diese manuellen Eingriffe sollen natürlich erkannt werden und Vorrang genießen.

Beschreibung

Der Rollladen wird in diesem Beispiel durch das Dummy du_Labor_Rollladen ersetzt. Der Wert 0 entspricht einer kompletten Öffnung, 100 ist komplett zu.
Zur Prüfung eines manuellen Eingriffs wird die Rolladenposition im DOIF heran gezogen. Im echten Leben könnte gleichzeitig noch geprüft werden, ob z.B. die Terrassentür offen ist, denn wenn man auf der Terrasse ist und die Automatik zuschlägt ist das auch kontraproduktiv. Ebenso ist es schlecht, wenn das Fenster hinter dem geschlossenen Rollladen zum Lüften im Sommer auf ist und der Rollladen unbeaufsichtigt öffnet.
Wenn nun morgens der Rollladen geöffnet wird, dann geht das DOIF auf State=cmd1 und führt die morgendliche Anweisung erst wieder aus, wenn der State ungleich cmd1 ist. Werden Abends die Rollläden nun aber manuell vor der automatischen Zeit geschlossen, würde dieser Statuswechsel nicht erfolgen und am nächsten Morgen die Automatik auch nicht funktionieren.
Auf den ersten Blick erscheint das 'do always' hier ein gutes Mittel zu sein. Dies kann jedoch im umgekehrten Fall stören. Werden die automatisch geschlossenen Rollläden nochmals manuell geöffnet, dann würden sie beim nächsten Event vom Twilight erneut herunter fahren. Also muss der Status vom DOIF auf einem anderen Weg geändert werden. Dazu kann als letzte Bedingung einfach ein zeitlicher Trigger (Mittags und Nachts, wenn die Automatik sozusagen die Richtung umkehrt) ohne Kommando angegeben werden. Damit geht der Status im Beispiel auf cmd4 und das DOIF ist wieder 'scharf' für den nächsten Einsatz.

Definition

define di_Labor_Rollo_TL DOIF 
     ([TL_Labor_Berlin:twilight_weather] > [?du_Labor_Rollo_TL_auf:state]
   and 
     [?du_Labor_Rollladen:state] > 75 
   and 
     [?06:15-11:00|8]) 
  (set du_Labor_Rollladen 0)
 DOELSEIF
     ([TL_Labor_Berlin:twilight_weather] > [?du_Labor_Rollo_TL_WE_auf:state] 
   and 
     [?du_Labor_Rollladen:state] > 75 
   and 
     [?06:15-11:00|7]) 
  (set du_Labor_Rollladen 0)
 DOELSEIF
     ([TL_Labor_Berlin:twilight_weather] < [?du_Labor_Rollo_TL_zu:state] 
   and 
     [?du_Labor_Rollladen:state] < 10 and [?15:00-22:00])
  (set du_Labor_Rollladen 85)
 DOELSEIF
   ([00:15] or [12:00])

Laborgruppe zum Import mit Raw definition

define TL_Labor_Berlin Twilight 52.522297 13.413140 1 638242
attr TL_Labor_Berlin alias Twilight Wetter
attr TL_Labor_Berlin group Rollläden
attr TL_Labor_Berlin room DOIF_Labor
attr TL_Labor_Berlin sortby 4
attr TL_Labor_Berlin stateFormat twilight_weather%

define du_Labor_Rollo_TL_auf dummy
attr du_Labor_Rollo_TL_auf alias Rollläden nach %-Licht auf (Mo-Fr -> 100=aus)
attr du_Labor_Rollo_TL_auf group Rollläden
attr du_Labor_Rollo_TL_auf room DOIF_Labor
attr du_Labor_Rollo_TL_auf setList state:slider,0,1,100
attr du_Labor_Rollo_TL_auf webCmd state
setstate du_Labor_Rollo_TL_auf 40

define du_Labor_Rollo_TL_WE_auf dummy
attr du_Labor_Rollo_TL_WE_auf alias Rollläden nach %-Licht auf (Sa/So -> 100=aus)
attr du_Labor_Rollo_TL_WE_auf group Rollläden
attr du_Labor_Rollo_TL_WE_auf room DOIF_Labor
attr du_Labor_Rollo_TL_WE_auf setList state:slider,0,1,100
attr du_Labor_Rollo_TL_WE_auf webCmd state
setstate du_Labor_Rollo_TL_WE_auf 50

define du_Labor_Rollo_TL_zu dummy
attr du_Labor_Rollo_TL_zu alias Rollläden nach %-Licht zu (Mo.-So. -> 0=aus)
attr du_Labor_Rollo_TL_zu group Rollläden
attr du_Labor_Rollo_TL_zu room DOIF_Labor
attr du_Labor_Rollo_TL_zu setList state:slider,0,1,100
attr du_Labor_Rollo_TL_zu webCmd state
setstate du_Labor_Rollo_TL_zu 20

define du_Labor_Rollladen dummy
attr du_Labor_Rollladen alias Simmulation Rollladen
attr du_Labor_Rollladen group Rollläden
attr du_Labor_Rollladen room DOIF_Labor
attr du_Labor_Rollladen setList state:slider,0,1,100
attr du_Labor_Rollladen stateFormat state%
attr du_Labor_Rollladen webCmd state
setstate du_Labor_Rollladen 0

define di_Labor_Rollo_TL DOIF ([TL_Labor_Berlin:twilight_weather] > [?du_Labor_Rollo_TL_auf:state]\
    and\
     [?du_Labor_Rollladen:state] > 75\
    and\
     [?06:15-11:00|8])\
  (set du_Labor_Rollladen 0)\
 DOELSEIF\
     ([TL_Labor_Berlin:twilight_weather] > [?du_Labor_Rollo_TL_WE_auf:state]\
    and\
     [?du_Labor_Rollladen:state] > 75 and [?06:15-11:00|7])\
  (set du_Labor_Rollladen 0)\
 DOELSEIF\
     ([TL_Labor_Berlin:twilight_weather] < [?du_Labor_Rollo_TL_zu:state]\
    and\
     [?du_Labor_Rollladen:state] < 10\
    and\
     [?15:00-22:00])\
  (set du_Labor_Rollladen 100)\
 DOELSEIF\
     ([00:15] or [12:00])

attr di_Labor_Rollo_TL alias DOIF Rollläden Twilight
attr di_Labor_Rollo_TL group Rollläden
attr di_Labor_Rollo_TL room DOIF_Labor

save