DOIF für Rolladen nach Helligkeit und Zeit schalten

Begonnen von ms_steini, 22 April 2017, 08:01:54

Vorheriges Thema - Nächstes Thema

ms_steini

Ich blicke wieder einmal nicht durch, dabei gibt es so viele Beispiele und Erklärungen. Vieleicht denke ich zu kompliziert.

Ich möchte meine Rolläden runterfahren wenn der Helligkeitswert vom "HM-Sen-LI-O" kleiner-gleich 0.5 ist und in der Zeit von 19:00 bis 22:00 Uhr.
wenn um oder nach 22:00 Uhr der Helligkeitswert <= 0.5 immer noch nicht erreicht ist sollen die Rollos aber um 22:00 Uhr trotzdem runterfahren.

Das habe ich bis jetzt gemacht:
ein Dummy mit meinen gewünschten Werten angelegt

Internals:
   CFGFN
   NAME       Rollo.grp_4.zu
   NR         10470
   STATE      Gruppe 4
   TYPE       dummy
   Readings:
     2017-04-22 07:22:55   Rollos          OG.Rollo.Henna.Fenster,OG.Rollo.Shirin.Fenster,OG.Rollo.Buero.Tuer
     2017-04-22 07:11:44   bis             22:00:00
     2017-04-22 07:11:44   brightness      0.5
     2017-04-21 10:50:35   state           Gruppe 4
     2017-04-22 07:11:44   von             19:00:00
Attributes:
   readingList von bis brightness Rollos
   room       test



dazu versuche ich jetzt ein DOIF zu erstellen:

define GRP_4_Rollos DOIF ([Brightness_Sensor:brightness] <= [Rollo.grp_4.zu:brightness] and time >= [Rollo.grp_4.zu:von] and time <= [Rollo.grp_4.zu:bis]) (set [Rollo.grp_4.zu:Rollos] zu)
DOELSEIF (time >= [Rollo.grp_4.Zeit.runter:bis]) (set set [Rollo.grp_4.zu:Rollos] zu)


Internals:
   CFGFN
   DEF        ([Brightness_Sensor:brightness] <= [Rollo.grp_4.zu:brightness] and time >= [Rollo.grp_4.zu:von] and time <= [Rollo.grp_4.zu:bis]) (set [Rollo.grp_4.zu:Rollos] zu)
DOELSEIF (time >= [Rollo.grp_4.Zeit.runter:bis]) (set [Rollo.grp_4.zu:Rollos] zu)
   NAME       GRP_4_Rollos
   NR         10925
   NTFY_ORDER 50-GRP_1_Rollos
   STATE      initialized
   TYPE       DOIF
   Readings:
     2017-04-22 07:57:06   cmd             0
     2017-04-22 07:57:06   state           initialized
   Condition:
     0          ReadingValDoIf($hash,'Brightness_Sensor','brightness') <= ReadingValDoIf($hash,'Rollo.grp_4.zu','brightness') and time >= ReadingValDoIf($hash,'Rollo.grp_4.zu','von') and time <= ReadingValDoIf($hash,'Rollo.grp_4.zu','bis')
     1          time >= ReadingValDoIf($hash,'Rollo.grp_4.Zeit.runter','bis')
   Devices:
     0           Brightness_Sensor Rollo.grp_4.zu
     1           Rollo.grp_4.Zeit.runter
     all         Brightness_Sensor Rollo.grp_4.zu Rollo.grp_4.Zeit.runter
   Do:
     0:
       0          set [Rollo.grp_4.zu:Rollos] zu
     1:
       0          set [Rollo.grp_4.zu:Rollos] zu
     2:
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Itimer:
   Readings:
     0           Brightness_Sensor:brightness Rollo.grp_4.zu:brightness Rollo.grp_4.zu:von Rollo.grp_4.zu:bis
     1           Rollo.grp_4.Zeit.runter:bis
     all         Brightness_Sensor:brightness Rollo.grp_4.zu:brightness Rollo.grp_4.zu:von Rollo.grp_4.zu:bis Rollo.grp_4.Zeit.runter:bis
   Regexp:
     All:
   State:
Attributes:
   room       test



Kann mir da bitte jemand auf die Sprünge helfen?

Besten Dank.


Jorge3711

Denn Sinn des Dummies habe ich nicht verstanden, OK Zeiten/Helligkeitswerte anpassen. Rollos zusammenfassen kannst Du per Strucure, oder über geschickte Benennung der Rollos und Regex. Zeiten/Helligkeitswerte kannst Du im DOIF auch direkt hinterlegen.

Im Bedingungsteil denke ich, wird


and time >= [Rollo.grp_4.zu:von] and time <= [Rollo.grp_4.zu:bis]


nicht funktionieren. Was ist "time", es ist kein Gerät o.ä. (es fehlen die [] um time)? Der Ausführungsteil sieht auch nicht ganz Regelkonform aus, hier kannst Du IIRC nicht auf eine Kombination Gerät:READING ([Rollo.grp_4.zu:Rollos]) zurückgreifen (-> Lösung Structure oder Regex).

Als Anregung mal mein Ansatz:


DOELSEIF
## 08 - Sichtschutz Kueche und Balkon Abends
  ([sensor.licht:brightness] < '50' and [sensor.licht:brightness] > '1.0')
  (set rollladen.og.wz.balkon 25, set rollladen.og.kueche.* 25)
DOELSEIF
## 09 - Alle Rolllaeden runter (Terrassentuer ist zu)
  ([?Buderus:OutdoorTemp] > "0.0" and [sensor.licht:brightness] <= '1.0' and [?tfk.og.terrasse] eq "closed")
  (set rollladen.* 25)
DOELSEIF
## 10 - Alle Rolllaeden runter, bis auf Terrassentür (Terrassentür ist offen)
  ([?Buderus:OutdoorTemp] > "0.0" and [sensor.licht:brightness] <= '1.0' and [?tfk.og.terrasse] eq "open")
  (set rollladen.eg.* 25, set rollladen.og.kueche.* 25, set rollladen.og.ez 25, set rollladen.og.wz.* 25)


Deine Zeitliche Bedingung müsste hier noch dazugebaut werden, in der Art


  [?19:00-22:00] and ... ## Rest des DOIF Bedingungszweiges, das Fragezeichen bedeutet, die Uhrzeit wird nur abgefragt, triggert aber nicht.


Deine Bedingung "um 22 Uhr in jedem Fall Rollläden runter" könnte durch einen weiteren DOESLEIF Zweig ([22:00])(set ROLLLADEN zu) festgelegt werden.

Soviel mal als Denkanstoß. Ansonsten lohnt ein Blick in die Commandref zu DOIF, damian hat hier echt viel dokumentiert und niedergeschrieben.

ms_steini

Vielen Dank ersteinmal für die Antwort.

ich möchte auf keinen fall feste Werte wie Uhrzeit etc. in der DOIF haben, ich möchte das später mal dynamisch im tablet ui einstellen bzw. ändern können.
Rollos mit Structure zusammenfassen ist klar, mache ich auch später vieleicht, aber mit (set [Rollo.grp_2:Rollos] zu) gehts ja auch....

mit "time" wollte ich eigendlich die aktuelle Uhrzeit haben.... so einfach ist es dann wohl doch nicht.
ich habe es jetzt ersteinmal mit $hour umgebaut, im dummy dann die Stunden eingetragen und nicht die ganze Uhrzeit mit Minuten und Sekunden.

So funktioniert es leider nur Teilweise, setze ich das Attribut "DO always" und mache die Rollos im angegeben Zeitraum manuell wieder auf, gehen sie wieder zu solbald der Helligkeitssensor triggert


DOIF
([Brightness_Sensor:brightness] <= [Rollo.grp_2:zu_brightness] and $hour >= [Rollo.grp_2:zu_von] and $hour <= [Rollo.grp_2:zu_bis]) (set [Rollo.grp_2:Rollos] zu) DOELSEIF ($hour >= [Rollo.grp_2:zu_bis]) (set [Rollo.grp_2:Rollos] zu)

DUMMY
Internals:
   CFGFN
   NAME       Rollo.grp_2
   NR         10446
   STATE      Gruppe 2
   TYPE       dummy
   Readings:
     2017-04-22 07:14:12   Rollos          EG.Rollo.Buero.Fenster,EG.Rollo.Esszimmer.Fenster,EG.Rollo.Wohnzimmer.Fenster
     2017-04-22 08:40:09   auf_bis         7
     2017-04-22 08:19:22   auf_brightness  0.5
     2017-04-22 08:39:56   auf_von         6
     2017-04-21 10:49:12   state           Gruppe 2
     2017-04-22 12:00:57   zu_bis          22
     2017-04-22 12:03:12   zu_brightness   0.5
     2017-04-22 12:09:56   zu_von          19
Attributes:
   readingList auf_von auf_bis auf_brightness zu_von zu_bis zu_brightness Rollos
   room       test
   setList    auf_von auf_bis auf_brightness zu_von zu_bis zu_brightness Rollos

Damian

#3
([Brightness_Sensor:brightness] <= [Rollo.grp_2:zu_brightness] and [?[Rollo.grp_2:zu_von]-[Rollo.grp_2:zu_bis]] or [Rollo.grp_2:zu_bis]) (set [Rollo.grp_2:Rollos] zu) DOELSEIF ([00:00])
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ms_steini

#4
besten Dank !

aber wenn ich das so übernehme gehen die Rollos jedes mal runter sobald der Bightness.Sensor die helligkeit übermittelt.


im Dummy habe ich folgendes:
zu_bis               23:00
zu_brightness   0.5
zu_von              20:00

und der Brightness.Sensor meldet etwas um die 600




was macht denn das "DOELSEIF ([00:00])" genau

Damian

Zitat von: ms_steini am 22 April 2017, 16:53:00
ui das sieht fein aus, besten Dank !
was macht denn das "DOELSEIF ([00:00])" genau

Da fehlten noch klammern:

([Brightness_Sensor:brightness] <= [Rollo.grp_2:zu_brightness] and [?[Rollo.grp_2:zu_von]-[Rollo.grp_2:zu_bis]] or [[Rollo.grp_2:zu_bis]]) (set [Rollo.grp_2:Rollos] zu) DOELSEIF ([00:00])

Das DOIF-Modul arbeitet mit Zuständen und wiederholt standardmäßig (ohne do always) den gleichen Befehl nicht.

Um Mitternacht wechselt das Modul in einen anderen Zustand und wird damit für den nächsten Tag scharfgestellt.


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

ms_steini

#6
super Danke, habe ich verstanden...

mir fällt aber gerade auf das wenn der Brightness.Sensor zur angebenen Zeit im Dummy "Rollo.grp_2:zu_bis" NICHT <= den im Dummy angebenen Wert hat,
dürften die Rollos ja überhaupt nicht runterfahren,
die Bedinngung ([Brightness_Sensor:brightness] <= [Rollo.grp_2:zu_brightness] trift ja dann garnicht zu, egal wieviel Uhr es ist



Damian

Zitat von: ms_steini am 22 April 2017, 17:41:29
super Danke, habe ich verstanden...

mir fällt aber gerade auf das wenn der Brightness.Sensor zur angebenen Zeit im Dummy "Rollo.grp_2:zu_bis" NICHT <= den im Dummy angebenen Wert hat,
dürften die Rollos ja überhaupt nicht runterfahren,
die Bedinngung ([Brightness_Sensor:brightness] <= [Rollo.grp_2:zu_brightness] trift ja dann garnicht zu, egal wieviel Uhr es ist

deswegen wird mit or um 22:00 Uhr auf jeden Fall die Bedingung wahr und dein Rollladen fährt runter.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ms_steini

#8
Guten Morgen,

ich glaube ich rücke dem Verstehen von "DOIF" immer näher, habe aber immernoch kleine Verständnisprobleme, ganz besonders bei den Klammern.
Die Commandref DOIF ist schon sehr hilfreich, vielen dank dafür


Ich habe jetzt ein DOIF versucht zu erweitern:

Rollo ZU bei Helligkeit <= 0.5, zwischen 19:00 und 22:00 Uhr, nicht später als 22:00 Uhr
Rollo AUF bei Helligkeit >= 0.5, zwischen 06:30 und 07:15 Uhr an Arbeitstagen, nicht später als 07:15 Uhr, und NICHT wenn ich Nachtschicht habe 
Rollo AUF um 09:00 Uhr am Wochenende u. Feiertage, aber NICHT wenn ich Nachtschicht habe
Rollo AUF um 13:00 Uhr wenn ich Nachtschicht habe an jedem Tag inkl. Wochenende und Feiertage


([Brightness_Sensor:brightness] <= [Rollo.grp_5:zu_brightness] and [?[Rollo.grp_5:zu_von]-[Rollo.grp_5:zu_bis]] or [[Rollo.grp_5:zu_bis]]) (set [Rollo.grp_5:Rollos] zu)
DOELSEIF ([Brightness_Sensor:brightness] >= [Rollo.grp_5:auf_brightness] and [Schichtplan_Nacht] == 0 and [?[Rollo.grp_5:auf_von]-[Rollo.grp_5:auf_bis]|AT] or [[Rollo.grp_5:auf_bis]|AT] and [Schichtplan_Nacht] == 0) (set [Rollo.grp_5:Rollos] auf)
DOELSEIF ([?[Rollo.grp_5:auf_WE]|WE] and [Schichtplan_Nacht] == 0) (set [Rollo.grp_5:Rollos] auf)
DOELSEIF ([?[Rollo.grp_5:auf_Nachtdienst]] and [Schichtplan_Nacht] == 1) (set [Rollo.grp_5:Rollos] auf)


Schichtplan_Nacht ist ein Dummy welches durch ein Notify gesetzt wird
Nachtschicht { fhem "set Schichtplan_Nacht " . (ReadingsVal("Nachtschicht", "modeStart", "") =~ "_Nacht" ? 1:0) }
Nachtschicht ist eine ICAL (.ics Datei)

Was mir jetzt komisch vorkommt ist die erste DOELSEIF und ob das [Schichtplan_Nacht] == 0 noch in extra Klammern muß ?






automatisierer

Nein muss es nicht.
Die doppelten eckigen Klammern, brauchst du nur bei indirekten Zeitangaben - also eine [] weil Zeitangaben immer in eckigen Klammern stehen müssen und die zweite [] für das [Device:Reading] in dem die Zeit steht. Das '[Rollo.grp_5:zu_bis]' wir ja z.B. in 22:00 aufgelöst und die 22:00 muss in [] eckigen Klammern stehen. Daher [[...]] oder wenn es nicht triggern soll [?[...]]

Dann gibt es da noch runde Klammern bei and/or Verknüpfungen von Bedingungen. Ist wie bei Punkt- vor Strichrechnung - das and bindet stärker als das or - das and ist also die Punkt- und das or die Strichrechnung.

ms_steini

Zitat von: automatisierer am 24 April 2017, 07:17:05
Nein muss es nicht.
Die doppelten eckigen Klammern, brauchst du nur bei indirekten Zeitangaben - also eine [] weil Zeitangaben immer in eckigen Klammern stehen müssen und die zweite [] für das [Device:Reading] in dem die Zeit steht. Das '[Rollo.grp_5:zu_bis]' wir ja z.B. in 22:00 aufgelöst und die 22:00 muss in [] eckigen Klammern stehen. Daher [[...]] oder wenn es nicht triggern soll [?[...]]

Dann gibt es da noch runde Klammern bei and/or Verknüpfungen von Bedingungen. Ist wie bei Punkt- vor Strichrechnung - das and bindet stärker als das or - das and ist also die Punkt- und das or die Strichrechnung.

Hallo automatisierer,
dann müsste mein DOIF ja richtig sein.

nur zur Sicherheit im zweiten DOELSEIF:
DOELSEIF ([Brightness_Sensor:brightness] >= 0.5 AND [Schichtplan_Nacht] == 0 AND [?[06:30]-[07:15]|AT] OR [[07:15]|AT] AND [Schichtplan_Nacht] == 0) (set [Rollo.grp_5:Rollos] auf)

in Klartext für mich:
bei Helligkeit >= 0.5 und wenn ich KEINE Nachtschicht habe und in der Zeit von 06:30 bis 07:15 Uhr an Arbeitstagen geht das Rollo auf ODER spätestens um 07:15 Uhr und wenn ich KEINE Nachtschicht habe

Wenn dem so ist, habe ich ja doch ein wenig verstanden.




automatisierer

jo, sollte so sein.

and und or müssen natürlich klein geschrieben werden... ansonsten dürfte das nur auf einen Fehler hinaus laufen...

ms_steini

besten DANK

(and or habe ich nur zum hervorheben hier im Text groß geschrieben)

ms_steini

irgendwie habe ich da doch noch einen Fehler drin.

Rollos sollten eigendlich heute "Sonntag" um 09:00 Uhr aufgegangen sein... sind sie aber nicht
Das DoIf stand noch auf "cmd_1" von gestern abend wo die Rollos heruntergefahren sind.

ich vermute da stimmt wieder etwas mit den Klammern nicht

DUMMY

   NAME       Rollo.grp_4
   NR         377
   STATE      Gruppe 4
   TYPE       dummy
   Readings:
     2017-04-22 07:22:55   Rollos          OG.Rollo.Henna.Fenster,OG.Rollo.Shirin.Fenster,OG.Rollo.Buero.Tuer
     2017-04-30 10:03:31   auf_WE          09:00
     2017-04-25 11:02:43   auf_bis         07:15
     2017-04-22 17:28:52   auf_brightness  0.5
     2017-04-22 17:28:52   auf_von         06:30
     2017-04-25 08:19:48   state           Gruppe 4
     2017-04-22 17:28:52   zu_bis          22:00
     2017-04-22 17:28:52   zu_brightness   0.5
     2017-04-22 17:28:52   zu_von          19:00


DOIF

([Brightness_Sensor:brightness] <= [Rollo.grp_4:zu_brightness] and [?[Rollo.grp_4:zu_von]-[Rollo.grp_4:zu_bis]] or [[Rollo.grp_4:zu_bis]]) (set [Rollo.grp_4:Rollos] zu)
DOELSEIF (([Brightness_Sensor:brightness] >= [Rollo.grp_4:auf_brightness] and [NRW_Ferientag] == 0) and [?[Rollo.grp_4:auf_von]-[Rollo.grp_4:auf_bis]|AT] or [[Rollo.grp_4:auf_bis]|AT] and [NRW_Ferientag] == 0) (set [Rollo.grp_4:Rollos] auf)
DOELSEIF ([?[Rollo.grp_4:auf_WE]|WE] or [NRW_Ferientag] == 1) (set [Rollo.grp_4:Rollos] auf)