Doif schaltet Beleuchtung ein aber nicht aus

Begonnen von MaPae, 17 April 2021, 03:48:05

Vorheriges Thema - Nächstes Thema

MaPae

Hallo,

Ich hoffe ich habe Das richtige Unterforum gewählt. Ich scheitere gerade an einer wahrscheinlich recht einfachen DOIf Schleife, aber ich komme nicht weiter.

Ziel: Die Beleuchtung soll an drei Steckdosen einschalten, wenn die Helligkeit unter eine Grenze fällt. Am Wochenende soll sie um 2:30 Uhr ausgehen, unter der Woche um 0:30Uhr.

Die Lampen schalten zuverlässig ein, aber aus nicht. Erst wenn ich set Check all mache wird das Licht ausgeschaltet.

Hier der Coseschnipsel


(([15:00-02:30|5 6 7] or [15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50))((set SD_GT_A0741_A on) (set SD_GT_A0741_B on) (set SD_GT_A0741_C on))

DOELSE (set SD_GT_A0741_A off) (set SD_GT_A0741_B off) (set SD_GT_A0741_C off)


Habe ich ein Denkfehler  gemacht?

Beste Grüße

Matthias

Otto123

Hallo Matthias,

mach mal ein list vom DOIF wenn es nicht ausgeschaltet hat, aber es ausschalten sollte.

Was ist der Grund für diese eigentümliche Klammerung im Ausführungsteil?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Frank_Huber

Moin Moin,

Um den Fehler zu finden solltest Du wie Otto schon anregte ein list im Fehlerfall posten.
Ich würde es aber davonm unabhängig so umbauen:


(([15:00-02:30|5 6 7] or [15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50)) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C on))
DOELSEIF ([00:30|1 2 3 4 or [02:30|5 6 7) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C off))

So hättest es klar definiert wann abgeschalten werden soll.

schau Dir in CMD_1 auch mal deine Wochentage an. 7 = Wochenende. also hast Du 15:00 bis 2:30 an Freitagen, Samstagen und am Wochenende, 15:00 bis 0:30 von Montag bis Donnerstag.
Samstag und Wochenende? es gäbe auch die "9" für "morgen Wochenende oder Feiertag"

/Frank

MaPae

Besten Dank für eure Anworten, ich habe die DOIF wie vorgeschlagen geändert, kommt mir auch ein wenig logischer vor.

Zitatmach mal ein list vom DOIF wenn es nicht ausgeschaltet hat, aber es ausschalten sollte.
Die list ist ein Auszug aus den Readings und Internals?

stelle ich ein, wenn die Modifikation nicht reicht.

Die Tage kontrolliere ich auch gleich nochmal.

Beste Grüße

Matthias

Frank_Huber

Zitat von: MaPae am 21 April 2021, 17:00:44
Die list ist ein Auszug aus den Readings und Internals?
stelle ich ein, wenn die Modifikation nicht reicht.

Ja, so grob. 😉
In der FHEM Befehlszeile gibst Du "list <Gerätename>" ein.
Das was dann kommt posten.

MaPae

#5
Guten Morgen,

da die List zu groß ist habe ich mal ein pdf raus gemacht und auf meinem Server hochgeladen. Link findet Ihr hier

Die DoIf Schleife geht automatisch in disabled ???

Besten Dank

Frank_Huber

Zitat von: MaPae am 23 April 2021, 08:42:17
Die DoIf Schleife geht automatisch in disabled ???
Mit Sicherheit macht das dein DOIF nicht selbst.
Das passierte von ausserhalb gestern Abend um 22:40.

Otto123

Aber trotzdem steht das DOIF im Zustand cmd1
Zitat2021-04-21 19:47:17 cmd 1
2021-04-21 19:47:17 cmd_event WU_IOBERU16
2021-04-21 19:47:17 cmd_nr 1
2021-04-22 22:28:19 e_WU_IOBERU16_solarRadiation 0
und vorm disable kam 22:28 der Wert 0 um das Licht einzuschalten. Laut DOIF ist es aber ein, es wurde seit 2021-04-21 19:47:17 nicht mehr ausgeschalten.

Wenn ich mir den Event anschaue  :o will ich mal dazu sagen: Jeder Event vom Device WU_IOBERU16 triggert das DOIF und nicht die Änderung des Wertes solarRadiation.

Einen Ausschalter welcher bei Helligkeit wirkt hat das DOIF doch so gar nicht? Einzig der Timer 0:30 oder 2:30 könnte das - aber solange Bedingung 1 erfüllt ist bleibt alles beim Alten :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MaPae

erstmal vielen Dank für deine schnelle Antwort

Zitatund vorm disable kam 22:28 der Wert 0 um das Licht einzuschalten. Laut DOIF ist es aber ein, es wurde seit 2021-04-21 19:47:17 nicht mehr ausgeschalten.
Einschalten soll es das Licht ja bei einem Wert <= 50, damit wären ja die beiden Bedingung um 22.28Uhr ja noch gegeben, also Uhrzeit und Helligkeit passt. Nur nach 0:30 bzw. 2:30 Uhr sollte die cmd 1 nicht mehr erfüllt sein, da Uhrzeit nicht mehr passt auch wenn die Helligkeit unter dem Schwellwert liegt.

ZitatWenn ich mir den Event anschaue  :o will ich mal dazu sagen: Jeder Event vom Device WU_IOBERU16 triggert das DOIF und nicht die Änderung des Wertes solarRadiation.
und wie ändere ich das  :o hast du da einen Vorschlag.

Ziel soll sein:
Licht geht bei Dunkelheit an (Schwellwert < 50) und geht spätestens um 0:30 bzw. 2:30 Uhr aus. Das Licht soll aber nicht tagsüber an sein.

beste Grüße

Matthias

Otto123

Der Event sieht einfach gruselig aus, ich habe so ein list noch nie gesehen. Aber eventuell war ich nur geschockt und damit auf einer falschen Idee.
Nochmal nachgedacht:
Das Problem scheint zu sein: Wenn am Ende der Timerevent kommt wird durch die and Verknüpfung auch noch mal geprüft ob das "Licht" unter 50 ist. Ist es ja, damit bleibt die der Zustand Lampe an. Wenn Du danach einen Check machst ist die Zeit um und es wird cmd2 ausgeführt.

Wenn Du Frank seinen Vorschlag umsortierst könnte es eventuell funktionieren, weil DOIF immer von vorne nach hinten arbeitet.
([00:30|1 2 3 4 or [02:30|5 6 7) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C off))
DOELSEIF (([15:00-02:30|5 6 7] or [15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50)) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C on))

Aber kann auch sein, dass Du den aus Eventtimer einfach ein Minute später setzen musst:
(([15:00-02:30|5 6 7] or [15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50)) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C on))
DOELSEIF ([00:31|1 2 3 4 or [02:31|5 6 7) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C off))

Oder einfach nicht durch die Zeit triggern sondern nur abfragen:
(([?15:00-02:30|5 6 7] or [?15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50)) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C on))
DOELSEIF ([00:30|1 2 3 4 or [02:30|5 6 7) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C off))

DOIF ist eben auch nicht immer einfach ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MaPae

besten Dank, ich drehe die DIOF Schleife erstmal um und versuche alternativ die anderen Varianten einfach mal durch.

ZitatDOIF ist eben auch nicht immer einfach
leider nicht, selbst mit etwas Programmiervorkenntnisse. Aber die reichen bei mir scheinbar auch nicht mehr aus. :'(

MaPae

Also Variante 1 war schonmal nicht erfolgreich

  DEF        ([00:30|1 2 3 4] or [02:30|5 6 7]) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C off))
DOELSEIF (([15:00-02:30|5 6 7] or [15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50)) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C on))

##(([15:00-02:30|5 7] or [15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50)) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C on))
##DOELSEIF ([00:30|1 2 3 4] or [02:30|5 7]) ((set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C off))

##(([15:00-02:30|5 6 7] or [15:00-0:30|1 2 3 4]) and ([WU_IOBERU16:solarRadiation] <= 50))(set SD_GT_A0741_A on, set SD_GT_A0741_B on, set SD_GT_A0741_C on)

##DOELSE (set SD_GT_A0741_A off, set SD_GT_A0741_B off, set SD_GT_A0741_C off)
   FUUID      60674845-f33f-0553-ca98-9f247c27c81cf7b0
   MODEL      FHEM
   NAME       Abend
   NOTIFYDEV  global,WU_IOBERU16
   NR         39
   NTFY_ORDER 50-Abend
   STATE      disabled
   TYPE       DOIF
   VERSION    23466 2021-01-03 17:14:46
   READINGS:
     2021-04-23 22:39:09   Device          WU_IOBERU16
     2021-04-23 19:29:03   cmd             2
     2021-04-23 19:29:03   cmd_event       WU_IOBERU16
     2021-04-23 19:29:03   cmd_nr          2
     2021-04-23 22:39:09   e_WU_IOBERU16_solarRadiation 0
     2021-04-23 22:43:29   last_cmd        disabled
     2021-04-23 22:43:29   mode            disabled
     2021-04-23 22:43:29   state           disabled
     2021-04-24 00:30:00   timer_01_c01    25.04.2021 00:30:00|1234
     2021-04-23 14:21:01   timer_02_c01    24.04.2021 02:30:00|567
     2021-04-23 14:21:01   timer_03_c02    23.04.2021 15:00:00|567
     2021-04-23 14:21:01   timer_04_c02    24.04.2021 02:30:00|567
     2021-04-24 00:30:00   timer_05_c02    24.04.2021 15:00:00|1234
     2021-04-24 00:30:00   timer_06_c02    25.04.2021 00:30:00|1234
   Regex:
     accu:
     cond:
       WU_IOBERU16:
         0:
         1:
           solarRadiation ^WU_IOBERU16$:^solarRadiation:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday,"1234") or ::DOIF_time_once($hash,1,$wday,"567")
     1          (::DOIF_time($hash,2,3,$wday,$hms,"567") or ::DOIF_time($hash,4,5,$wday,$hms,"1234")) and (::ReadingValDoIf($hash,'WU_IOBERU16','solarRadiation') <= 50)
   days:
     0          1234
     1          567
     2          567
     3          567
     4          1234
     5          1234
   do:
     0:
       0          (set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C off)
     1:
       0          (set SD_GT_A0741_A,SD_GT_A0741_B,SD_GT_A0741_C on)
     2:
   helper:
     DEVFILTER  ^global$|^WU_IOBERU16$
     NOTIFYDEV  global|WU_IOBERU16


Interessant, wenn ich es denn richtig lese, dann war der disable ungefähr zur gleichen Zeit. Kann die Schleife vielleicht nicht mit dem Wert 0 umgehen?

MaPae

Ich habe nochmals in die Wetterstation selber geschaut, ab 20:49 ist der Wert der Helligkeit 0.alle 10 Minuten liest fhem den Wert, so dass spätestens um 20:59 der Wert doch auch in der DOIf Schleife 0 sein müsste.

Ich frage mich nun, was war zum Zeitpunkt 22:43 als der disable ausgelöst wurde.

MaPae

Ich habe noch was gefunden.Zu dieser Uhrzeit schaltet eine Twilight Funktion auf den Zustand ss_astro

Internals:
   DEF        50.1865863 8.5307339 1 ?
   FUUID      60673a3a-f33f-0553-dc29-1b7600976b95022a
   FVERSION   59_Twilight.pm:0.234910/2021-01-09
   INDOOR_HORIZON 1
   NAME       Twilight.Zuhause
   NR         36
   NTFY_ORDER 50-Twilight.Zuhause
   STATE      12
   SUNPOS_OFFSET 300
   TYPE       Twilight
   WEATHER_CORRECTION 0
   WEATHER_HORIZON 1
   READINGS:
     2021-04-23 22:43:30   aktEvent        ss_astro
     2021-04-24 02:15:01   azimuth         13.74
     2021-04-24 02:15:01   compasspoint    north
     2021-04-24 02:15:01   elevation       -24.85
     2021-04-23 22:43:30   horizon         -18
     2021-04-23 22:43:30   light           0
     2021-04-23 22:43:30   nextEvent       sr_astro
     2021-04-23 22:43:30   nextEventTime   04:07:23
     2021-04-24 00:00:01   sr              06:21:12
     2021-04-24 00:00:01   sr_astro        04:04:23
     2021-04-24 00:00:01   sr_civil        05:40:08
     2021-04-24 00:00:01   sr_indoor       06:27:49
     2021-04-24 00:00:01   sr_naut         04:55:36
     2021-04-24 00:00:01   sr_weather      06:27:49
     2021-04-24 00:00:01   ss              20:28:08
     2021-04-24 00:00:01   ss_astro        22:46:09
     2021-04-24 00:00:01   ss_civil        21:09:25
     2021-04-24 00:00:01   ss_indoor       20:21:30
     2021-04-24 00:00:01   ss_naut         21:54:17
     2021-04-24 00:00:01   ss_weather      20:21:30
     2021-04-23 22:43:30   state           12
     2021-04-24 02:15:01   twilight        0
     2021-04-24 02:15:01   twilight_weather 0
   TIMER:
     Twilight.Zuhause_Midnight:
       HASH       Twilight.Zuhause
       MODIFIER   Midnight
       NAME       Twilight.Zuhause_Midnight
     Twilight.Zuhause_sr:
       HASH       Twilight.Zuhause
       MODIFIER   sr
       NAME       Twilight.Zuhause_sr
     Twilight.Zuhause_sr_astro:
       HASH       Twilight.Zuhause
       MODIFIER   sr_astro
       NAME       Twilight.Zuhause_sr_astro
     Twilight.Zuhause_sr_civil:
       HASH       Twilight.Zuhause
       MODIFIER   sr_civil
       NAME       Twilight.Zuhause_sr_civil
     Twilight.Zuhause_sr_indoor:
       HASH       Twilight.Zuhause
       MODIFIER   sr_indoor
       NAME       Twilight.Zuhause_sr_indoor
     Twilight.Zuhause_sr_naut:
       HASH       Twilight.Zuhause
       MODIFIER   sr_naut
       NAME       Twilight.Zuhause_sr_naut
     Twilight.Zuhause_sr_weather:
       HASH       Twilight.Zuhause
       MODIFIER   sr_weather
       NAME       Twilight.Zuhause_sr_weather
     Twilight.Zuhause_ss:
       HASH       Twilight.Zuhause
       MODIFIER   ss
       NAME       Twilight.Zuhause_ss
     Twilight.Zuhause_ss_astro:
       HASH       Twilight.Zuhause
       MODIFIER   ss_astro
       NAME       Twilight.Zuhause_ss_astro
     Twilight.Zuhause_ss_civil:
       HASH       Twilight.Zuhause
       MODIFIER   ss_civil
       NAME       Twilight.Zuhause_ss_civil
     Twilight.Zuhause_ss_indoor:
       HASH       Twilight.Zuhause
       MODIFIER   ss_indoor
       NAME       Twilight.Zuhause_ss_indoor
     Twilight.Zuhause_ss_naut:
       HASH       Twilight.Zuhause
       MODIFIER   ss_naut
       NAME       Twilight.Zuhause_ss_naut
     Twilight.Zuhause_ss_weather:
       HASH       Twilight.Zuhause
       MODIFIER   ss_weather
       NAME       Twilight.Zuhause_ss_weather
     Twilight.Zuhause_sunpos:
       HASH       Twilight.Zuhause
       MODIFIER   sunpos
       NAME       Twilight.Zuhause_sunpos
   TW:
     sr:
       DEG        0
       LIGHT      4
       NAME       sr
       NAMENEXT   sr_indoor
       STATE      4
       SWIP       0
       TIME       1619238072.03
     sr_astro:
       DEG        -18
       LIGHT      1
       NAME       sr_astro
       NAMENEXT   sr_naut
       STATE      1
       SWIP       0
       TIME       1619229863
     sr_civil:
       DEG        -6
       LIGHT      3
       NAME       sr_civil
       NAMENEXT   sr
       STATE      3
       SWIP       0
       TIME       1619235608.02
     sr_indoor:
       DEG        1
       LIGHT      5
       NAME       sr_indoor
       NAMENEXT   sr_weather
       STATE      5
       SWIP       0
       TIME       1619238469.04
     sr_naut:
       DEG        -12
       LIGHT      2
       NAME       sr_naut
       NAMENEXT   sr_civil
       STATE      2
       SWIP       0
       TIME       1619232936.01
     sr_weather:
       DEG        1
       LIGHT      6
       NAME       sr_weather
       NAMENEXT   ss_weather
       STATE      6
       SWIP       0
       TIME       1619238469.05
     ss:
       DEG        0
       LIGHT      3
       NAME       ss
       NAMENEXT   ss_civil
       STATE      9
       SWIP       0
       TIME       1619288888.97
     ss_astro:
       DEG        -18
       LIGHT      0
       NAME       ss_astro
       NAMENEXT   sr_astro
       STATE      12
       SWIP       0
       TIME       1619297169
     ss_civil:
       DEG        -6
       LIGHT      2
       NAME       ss_civil
       NAMENEXT   ss_naut
       STATE      10
       SWIP       0
       TIME       1619291365.98
     ss_indoor:
       DEG        1
       LIGHT      4
       NAME       ss_indoor
       NAMENEXT   ss
       STATE      8
       SWIP       0
       TIME       1619288490.96
     ss_naut:
       DEG        -12
       LIGHT      1
       NAME       ss_naut
       NAMENEXT   ss_astro
       STATE      11
       SWIP       0
       TIME       1619294057.99
     ss_weather:
       DEG        1
       LIGHT      5
       NAME       ss_weather
       NAMENEXT   ss_indoor
       STATE      7
       SWIP       0
       TIME       1619288490.95
   helper:
     extWeather:
       dispatch:
Attributes:
   room       Wetter 


Nur wo ist der Zusammenhang . :o

Otto123

Du solltest mal profan das DOIF ein zweites Mal, mit neuem, möglichst völlig anderem Namen anlegen.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz