[dochnichtgelöst] Frage zu Bedingung und Auslösen eines DOIF (Jalousiesteuerung)

Begonnen von Vize, 20 Dezember 2015, 13:02:52

Vorheriges Thema - Nächstes Thema

Vize

Mahlzeit zusammen,

für die Adventszeit habe ich versucht, mir mein DOIF für die Sonnenauf- und -untergangsgesteuerte Schaltung der Jalousien im Erdgeschoss so anzuspassen, dass bestimmte Rollos zeitversetzt später zufahren, damit man noch die Weihnachtsbeleuchtung draußen genießen kann.
Dazu steckt im DOIF außerdem noch eine Art "Frostschutz".
Leider klappt mein Vorhaben immer noch nicht zufriedenstellend...

Hier mal das DOIF in "einfachen" Worten:
Wenn (DOIF)
STATE des dummy = "Tag", fahre alle Rollos auf
(Tag wird durch ein weiteres DOIF mit sunrise-sunset ermittelt)
Sonst wenn (DOELSEIF)
STATE des dummy = "Adventszeit" und Wettervorhersage für Morgen < 0, fahre Rollos entsprechend auf Frostschutz, dabei zwei Rollos etwas später
(Adventszeit wird durch sub in der 99_myUtils ermittelt und diser Status wird im dummy nur nach Sonnenuntergang gesetzt)
Sonst wenn (DOELSEIF)
STATE des dummy = "Adventszeit" und Wettervorhersage für Morgen >= 0, fahre Rollos zu, dabei zwei Rollos etwas später
Sonst (DOELSE)
Wenn (IF) Wettervorhersage für Morgen < 0, fahre Rollos entsprechend auf Frostschutz, sonst (ELSE) fahre Rollos zu

Mein Problem, bzw. das was ich nicht verstehe, ist, dass damit, sobald die Wettervorhersage triggert, die Rollos auch tagsüber zu fahren (also der DOELSE-Fall eintritt), obwohl der dummy den STATE "Tag" hat...
Muss ich wohl in den DOELSE Teil noch die Bedingung einbauen, dass der dummy dafür den STATE "Tag" nicht hat?
Ich hoffe ihr versteht, was ich meine, bzw. könnt meinen Ausführungen folgen...
Ich komme hier leider nicht weiter...

Danke schonmal für jegliche Hilfe und Erklärung!

Hier noch ein list vom DOIF und dem entsprechenden dummy

Gruß
Andreas

DOIF
Internals:
   DEF        ([du_eg_rollos_zeitautomatik_parameter] eq "Tag") (set (ez|wz|ku|gb).*rollo.* auf) DOELSEIF ([du_eg_rollos_zeitautomatik_parameter] eq "Adventszeit" and [Wetter:fc2_low_c] < 0) (set gb_103_rollo:FILTER=level>40 40) (set wz_105_rollo_1:FILTER=level>35 35) (set (ez_105_rollo_2|ez_105_rollo_3):FILTER=level>20 20) (set ku_104_rollo:FILTER=level>30 30) (set ez_105_rollo_1:FILTER=level>20 20) (set wz_105_rollo_2:FILTER=level>20 20) DOELSEIF ([du_eg_rollos_zeitautomatik_parameter] eq "Adventszeit" and [Wetter:fc2_low_c] >= 0) (set (gb_103_rollo|wz_105_rollo_1|ez_105_rollo_2|ez_105_rollo_3|ku_104_rollo):FILTER=level>0 zu) (set ez_105_rollo_1:FILTER=level>0 zu) (set wz_105_rollo_2:FILTER=level>0 zu) DOELSE (IF ([Wetter:fc2_low_c] < 0) (set gb_103_rollo:FILTER=level>40 40,set wz_105_rollo_1:FILTER=level>35 35,set ku_104_rollo:FILTER=level>30 30,set (wz_105_rollo_2|ez.*rollo.*):FILTER=level>20 20) ELSE (set (ez|wz|ku|gb).*rollo.*:FILTER=level>0 zu))
   NAME       di_eg_rollos_zeitautomatik
   NR         312
   NTFY_ORDER 50-di_eg_rollos_zeitautomatik
   STATE      cmd_4
   TYPE       DOIF
   Readings:
     2015-12-20 10:43:47   Device          Wetter
     2015-12-20 10:13:45   cmd_event       Wetter
     2015-12-20 10:13:45   cmd_nr          4
     2015-12-20 10:43:47   e_Wetter_fc2_low_c 8
     2015-12-20 08:15:00   e_du_eg_rollos_zeitautomatik_parameter_STATE Tag
     2015-12-20 10:13:45   state           cmd_4
     2015-12-19 23:43:15   wait_timer      no timer
   Condition:
     0          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Tag"
     1          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Adventszeit" and ReadingValDoIf('Wetter','fc2_low_c','') < 0
     2          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Adventszeit" and ReadingValDoIf('Wetter','fc2_low_c','') >= 0
   Devices:
     0           du_eg_rollos_zeitautomatik_parameter
     1           du_eg_rollos_zeitautomatik_parameter Wetter
     2           du_eg_rollos_zeitautomatik_parameter Wetter
     all         du_eg_rollos_zeitautomatik_parameter Wetter
   Do:
     0:
       0          set (ez|wz|ku|gb).*rollo.* auf
     1:
       0          set gb_103_rollo:FILTER=level>40 40
       1          set wz_105_rollo_1:FILTER=level>35 35
       2          set (ez_105_rollo_2|ez_105_rollo_3):FILTER=level>20 20
       3          set ku_104_rollo:FILTER=level>30 30
       4          set ez_105_rollo_1:FILTER=level>20 20
       5          set wz_105_rollo_2:FILTER=level>20 20
     2:
       0          set (gb_103_rollo|wz_105_rollo_1|ez_105_rollo_2|ez_105_rollo_3|ku_104_rollo):FILTER=level>0 zu
       1          set ez_105_rollo_1:FILTER=level>0 zu
       2          set wz_105_rollo_2:FILTER=level>0 zu
     3:
       0          IF ([Wetter:fc2_low_c] < 0) (set gb_103_rollo:FILTER=level>40 40,set wz_105_rollo_1:FILTER=level>35 35,set ku_104_rollo:FILTER=level>30 30,set (wz_105_rollo_2|ez.*rollo.*):FILTER=level>20 20) ELSE (set (ez|wz|ku|gb).*rollo.*:FILTER=level>0 zu)
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice Wetter
     sleepsubtimer -1
     sleeptimer -1
   Internals:
     0           du_eg_rollos_zeitautomatik_parameter:STATE
     1           du_eg_rollos_zeitautomatik_parameter:STATE
     2           du_eg_rollos_zeitautomatik_parameter:STATE
     all         du_eg_rollos_zeitautomatik_parameter:STATE
   Itimer:
   Readings:
     1           Wetter:fc2_low_c
     2           Wetter:fc2_low_c
     all         Wetter:fc2_low_c
   State:
   Trigger:
Attributes:
   room       999_Automatiken
   wait       0:0,0,0,0,12600,8100:0,12600,8100:0


dummy
Internals:
   NAME       du_eg_rollos_zeitautomatik_parameter
   NR         303
   STATE      Tag
   TYPE       dummy
   Readings:
     2015-12-20 00:02:00   Advent          1
     2015-12-20 08:15:00   Tag             1
Attributes:
   readingList Advent Tag
   room       999_Automatiken
   stateFormat {if (ReadingsVal($name,"Advent","")==1 && ReadingsVal($name,"Tag","")==0) {"Adventszeit"} elsif (ReadingsVal($name,"Advent","")==0 && ReadingsVal($name,"Tag","")==0) {"Normalzeit"} else {"Tag"}}


moonsorrox

du hast ganz hinten ein "ELSE" drin..! Ist das richtig

Ich glaube Damian hat mal geschrieben das es in bestimmten Fällen mit einem DOELSE zum Schluss Probleme geben kann, bei mir war das in einem DOIF mal so das habe ich dann mit DOELSEIF ersetzt
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Vize

Hi,

ja, mit dem IF...ELSE im DOELSE-Fall wollte ich nochmals eine Unterscheiden für Frost/kein Frost einbauen.
Wusste nicht, dass das problematisch sein kann...

Ich werd es mal mit der DOESLEIF-Variante probieren und dann berichten.

Dankeschön schonmal für diese Info!

Gruß
Andreas

Vize

Guten Abend,

mit der von moonsorrox vorgeschlagenen Änderung mittels DOELSEIF-Variante funktioniert die Steuerung nun (erstmal)...

Danke nochmal für den Hinweis.

Gruß
Andreas

Vize

Ahoi,

da bin ich nochmal...

hat leider trotz DOELSEIF-Variante heute wieder nicht geklappt.

Jalousien haben eben den Befehl zum Schließen bekommen und danach sofort zum Öffnen.

Logfile:
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_2 off
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_3 off
2015.12.22 17:02:20 3: CUL_HM set ku_104_rollo off
2015.12.22 17:02:20 3: CUL_HM set wz_105_rollo_1 off
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_2 on
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_3 on
2015.12.22 17:02:20 3: CUL_HM set ku_104_rollo on
2015.12.22 17:02:20 3: CUL_HM set wz_105_rollo_1 on

nochmal ein list vom DOIF
Internals:
   DEF        ([du_eg_rollos_zeitautomatik_parameter] eq "Tag") (set (ez|wz|ku|gb).*rollo.* auf)
DOELSEIF ([du_eg_rollos_zeitautomatik_parameter] eq "Adventszeit" and [Wetter:fc2_low_c] < 0)
(set gb_103_rollo:FILTER=level>40 40)
(set wz_105_rollo_1:FILTER=level>35 35)
(set (ez_105_rollo_2|ez_105_rollo_3):FILTER=level>20 20)
(set ku_104_rollo:FILTER=level>30 30)
(set ez_105_rollo_1:FILTER=level>20 20)
(set wz_105_rollo_2:FILTER=level>20 20)
DOELSEIF ([du_eg_rollos_zeitautomatik_parameter] eq "Adventszeit" and [Wetter:fc2_low_c] >= 0)
(set (gb_103_rollo|wz_105_rollo_1|ez_105_rollo_2|ez_105_rollo_3|ku_104_rollo):FILTER=level>0 zu)
(set ez_105_rollo_1:FILTER=level>0 zu)
(set wz_105_rollo_2:FILTER=level>0 zu)
DOELSEIF ([du_eg_rollos_zeitautomatik_parameter] eq "Normalzeit" and [Wetter:fc2_low_c] < 0)
(set gb_103_rollo:FILTER=level>40 40,set wz_105_rollo_1:FILTER=level>35 35,set ku_104_rollo:FILTER=level>30 30,set (wz_105_rollo_2|ez.*rollo.*):FILTER=level>20 20)
DOELSEIF ([du_eg_rollos_zeitautomatik_parameter] eq "Normalzeit" and [Wetter:fc2_low_c] >= 0)
(set (ez|wz|ku|gb).*rollo.*:FILTER=level>0 zu)
   NAME       di_eg_rollos_zeitautomatik
   NR         312
   NTFY_ORDER 50-di_eg_rollos_zeitautomatik
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-12-22 17:02:20   Device          du_eg_rollos_zeitautomatik_parameter
     2015-12-22 17:02:20   cmd_event       du_eg_rollos_zeitautomatik_parameter
     2015-12-22 17:02:20   cmd_nr          1
     2015-12-22 15:18:57   e_Wetter_fc2_low_c 5
     2015-12-22 17:02:20   e_du_eg_rollos_zeitautomatik_parameter_STATE Tag
     2015-12-22 17:02:20   state           cmd_1
     2015-12-22 17:02:20   wait_timer      no timer
   Condition:
     0          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Tag"
     1          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Adventszeit" and ReadingValDoIf('Wetter','fc2_low_c','') < 0
     2          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Adventszeit" and ReadingValDoIf('Wetter','fc2_low_c','') >= 0
     3          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Normalzeit" and ReadingValDoIf('Wetter','fc2_low_c','') < 0
     4          InternalDoIf('du_eg_rollos_zeitautomatik_parameter','STATE','') eq "Normalzeit" and ReadingValDoIf('Wetter','fc2_low_c','') >= 0
   Devices:
     0           du_eg_rollos_zeitautomatik_parameter
     1           du_eg_rollos_zeitautomatik_parameter Wetter
     2           du_eg_rollos_zeitautomatik_parameter Wetter
     3           du_eg_rollos_zeitautomatik_parameter Wetter
     4           du_eg_rollos_zeitautomatik_parameter Wetter
     all         du_eg_rollos_zeitautomatik_parameter Wetter
   Do:
     0:
       0          set (ez|wz|ku|gb).*rollo.* auf
     1:
       0          set gb_103_rollo:FILTER=level>40 40
       1          set wz_105_rollo_1:FILTER=level>35 35
       2          set (ez_105_rollo_2|ez_105_rollo_3):FILTER=level>20 20
       3          set ku_104_rollo:FILTER=level>30 30
       4          set ez_105_rollo_1:FILTER=level>20 20
       5          set wz_105_rollo_2:FILTER=level>20 20
     2:
       0          set (gb_103_rollo|wz_105_rollo_1|ez_105_rollo_2|ez_105_rollo_3|ku_104_rollo):FILTER=level>0 zu
       1          set ez_105_rollo_1:FILTER=level>0 zu
       2          set wz_105_rollo_2:FILTER=level>0 zu
     3:
       0          set gb_103_rollo:FILTER=level>40 40,set wz_105_rollo_1:FILTER=level>35 35,set ku_104_rollo:FILTER=level>30 30,set (wz_105_rollo_2|ez.*rollo.*):FILTER=level>20 20
     4:
       0          set (ez|wz|ku|gb).*rollo.*:FILTER=level>0 zu
   Helper:
     globalinit 1
     last_timer 0
     sleepdevice du_eg_rollos_zeitautomatik_parameter
     sleepsubtimer 1
     sleeptimer -1
   Internals:
     0           du_eg_rollos_zeitautomatik_parameter:STATE
     1           du_eg_rollos_zeitautomatik_parameter:STATE
     2           du_eg_rollos_zeitautomatik_parameter:STATE
     3           du_eg_rollos_zeitautomatik_parameter:STATE
     4           du_eg_rollos_zeitautomatik_parameter:STATE
     all         du_eg_rollos_zeitautomatik_parameter:STATE
   Itimer:
   Readings:
     1           Wetter:fc2_low_c
     2           Wetter:fc2_low_c
     3           Wetter:fc2_low_c
     4           Wetter:fc2_low_c
     all         Wetter:fc2_low_c
   State:
   Trigger:
Attributes:
   room       999_Automatiken
   wait       0:0,0,0,0,12600,8100:0,12600,8100:0


Gruß
Andreas

Damian

Zitat von: Vize am 22 Dezember 2015, 17:14:29
Ahoi,

da bin ich nochmal...

hat leider trotz DOELSEIF-Variante heute wieder nicht geklappt.

Jalousien haben eben den Befehl zum Schließen bekommen und danach sofort zum Öffnen.

Logfile:
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_2 off
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_3 off
2015.12.22 17:02:20 3: CUL_HM set ku_104_rollo off
2015.12.22 17:02:20 3: CUL_HM set wz_105_rollo_1 off
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_2 on
2015.12.22 17:02:20 3: CUL_HM set ez_105_rollo_3 on
2015.12.22 17:02:20 3: CUL_HM set ku_104_rollo on
2015.12.22 17:02:20 3: CUL_HM set wz_105_rollo_1 on


lt. list-Ausgabe 
Zitat2015-12-22 17:02:20   cmd_event       du_eg_rollos_zeitautomatik_parameter

wurde um 17:02:20 dein DOIF-Modul getriggert und damit wurde der erste Fall cmd_1 zum Öffnen ausgelöst.

Offenbar muss in der gleichen Sekunde kurz zuvor du_eg_rollos_zeitautomatik_parameter mit "Normalzeit" getriggert haben, denn es wurde offenbar der letzte Fall zum Schließen getriggert.

Das müsstest du z. B. im Eventmonitor bzw. durch Loggen von du_eg_rollos_zeitautomatik_parameter herausfinden.

Ein DOIF-Modul führt bei einem Trigger immer nur einen DO-Zweig aus und niemals mehr.

Gruß

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

Vize

Hallo Damian,

danke für deine Antwort.

Die Readings von du_eg_rollos_zeitautomatik_parameter werden bzw. wurden durch mehrere weitere DOIFS gefüllt.
Leider bin ich schon wieder am basteln, so dass ich davon zur Zeit kein list mehr liefern kann.
Vor 17:02:20 war der STATE von du_eg_rollos_zeitautomatik_parameter "Tag" und das DOIF di_eg_rollos_zeitautomatik im state cmd_1. Um 17:02:20 mehrfaches "Klackern" in den Aktoren und der STATE von du_eg_rollos_zeitautomatik_parameter blieb (bzw. sprang eventuell umgehend wieder um) "Tag". DOIF di_eg_rollos_zeitautomatik wieder im state cmd_1.
Dazu die bereits erwähnten Logeinträge.
Das DOIF zum Reading "Tag" hatte ich so formuliert:
([{sunrise(600,"06:15","08:00")}-{sunset(300,"17:00","22:45")}|8] or [{sunrise(0,"08:15","09:30")}-{sunset(300,"17:00","23:00")}|7])
(set du_eg_rollos_zeitautomatik_parameter Tag 1)
DOELSE (set du_eg_rollos_zeitautomatik_parameter Tag 0)


Ich hab irgendwie auch das Gefühl, dass das sunrise-Modul irgendwie damit nicht klarkommt...siehe post von moonsorrox.

Ich bin erstmal mit meinem Latein am Ende...

Gruß
Andreas

Damian

Zitat von: Vize am 22 Dezember 2015, 19:46:52
Hallo Damian,

danke für deine Antwort.

Die Readings von du_eg_rollos_zeitautomatik_parameter werden bzw. wurden durch mehrere weitere DOIFS gefüllt.
Leider bin ich schon wieder am basteln, so dass ich davon zur Zeit kein list mehr liefern kann.
Vor 17:02:20 war der STATE von du_eg_rollos_zeitautomatik_parameter "Tag" und das DOIF di_eg_rollos_zeitautomatik im state cmd_1. Um 17:02:20 mehrfaches "Klackern" in den Aktoren und der STATE von du_eg_rollos_zeitautomatik_parameter blieb (bzw. sprang eventuell umgehend wieder um) "Tag". DOIF di_eg_rollos_zeitautomatik wieder im state cmd_1.
Dazu die bereits erwähnten Logeinträge.
Das DOIF zum Reading "Tag" hatte ich so formuliert:
([{sunrise(600,"06:15","08:00")}-{sunset(300,"17:00","22:45")}|8] or [{sunrise(0,"08:15","09:30")}-{sunset(300,"17:00","23:00")}|7])
(set du_eg_rollos_zeitautomatik_parameter Tag 1)
DOELSE (set du_eg_rollos_zeitautomatik_parameter Tag 0)


Ich hab irgendwie auch das Gefühl, dass das sunrise-Modul irgendwie damit nicht klarkommt...siehe post von moonsorrox.

Ich bin erstmal mit meinem Latein am Ende...

Gruß
Andreas

ja, hier setzt du den dummy auf "Tag 0" oder "Tag 1", abgefragt wird aber "Tag" das passt schon mal nicht. Dann hoffe ich, dass du do always hier nicht gesetzt hast, sonst wird das Modul bei gleicher Zeit hier gesetzt von sunset (kommt bei dir zwei mal vor) auch zwei mal getriggert.

Gruß

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

Vize

Zitat von: Damian am 23 Dezember 2015, 10:54:26
ja, hier setzt du den dummy auf "Tag 0" oder "Tag 1", abgefragt wird aber "Tag" das passt schon mal nicht. Dann hoffe ich, dass du do always hier nicht gesetzt hast

Hi Damian,

im dummy setze ich ein reading auf Tag 1 bzw. Tag 0. Im DOIF di_eg_rollos_zeitautomatik zum Auf- bzw. Zufahren rufe ich aber den STATE des dummy ab (z.B. [du_eg_rollos_zeitautomatik_parameter] eq "Tag"). Diesen biege ich mir per stateFormat zurecht, und der hat je nach Readings-Kombination den entsprechenden STATE (siehe meinen ersten post, list vom dummy).
do always ist nicht gesetzt.

Mich wundert halt nur, dass das reading "Tag" im dummy nach 17:02:20 nicht auf 0 gesetzt wurde, bzw. vermute ich aufgrund des Klackerns in den Aktoren, dass es ganz kurz auf 0 und sofort wieder auf 1 gesetzt wurde.

Gruß
Andreas