FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Gisbert am 04 Februar 2021, 08:23:54

Titel: [gelöst] timespec erneuern, geht das?
Beitrag von: Gisbert am 04 Februar 2021, 08:23:54
Hallo,

ich habe ein DOIF mit sunrise/sunset, welches noch zusätzlich von einem anderen Device mit dem Wolkenbedeckungsgrad gespeist wird. Ich möchte damit die timespec, in dem sunrise/sunset vorkommt, je nach Bedeckungsgrad leicht variieren, d.h. sunrise soll bei Bedeckung eine spätere Zeit und sunset eine frühere Zeit annehmen.

Ich habe dazu eine periodische Bedingung im letzten Zweig gesetzt, die auch das Reading mit der Wolkenbedeckung neu setzt, aber nicht die timespecs der Bedingungen 1 und 2, in denen sunrise/sunset vorkommt.

Hat jemand eine Idee, wie ich die timespec aktuell halten kann?

Viele​ Grüße​ Gisbert​


Internals:
   CFGFN     
   DEF        ([{sunrise_abs(1800+ReadingsVal('Bewegungsmelder','clouds',''))}])
(set WS_FlurEG day)
(set WS_Garage day)
DOELSEIF ([{sunset_abs(-1800-ReadingsVal('Bewegungsmelder','clouds',''))}])
(set WS_FlurEG night)
(set WS_Garage night)
DOELSEIF ([WS_FlurEG:state]==0
and [?WS_FlurEG:day]==1
and [?WS_FlurEG:mode]==0)
(set WS_FlurEG _off)
DOELSEIF ([WS_FlurEG:state]==0
and [?WS_FlurEG:day]==0
and [?WS_FlurEG:mode]==0)
(set WS_FlurEG _off)
DOELSEIF ([+[1]:10])
   FUUID      60170514-f33f-e986-bd02-dfbb4665652e7fc1
   MODEL      FHEM
   NAME       Bewegungsmelder
   NOTIFYDEV  global,WS_FlurEG
   NR         1269
   NTFY_ORDER 50-Bewegungsmelder_innen
   STATE      cmd_5
   TYPE       DOIF
   VERSION    23633 2021-01-28 19:10:32
   OLDREADINGS:
   READINGS:
     2021-02-04 08:10:00   clouds          1272
     2021-02-04 08:10:00   cmd             5
     2021-02-04 08:10:00   cmd_event       timer_3
     2021-02-04 08:10:00   cmd_nr          5
     2021-02-04 08:09:06   mode            enabled
     2021-02-04 08:10:00   state           cmd_5
     2021-02-04 08:08:56   timer_01_c01    04.02.2021 08:20:14
     2021-02-04 08:08:56   timer_02_c02    04.02.2021 17:11:48
     2021-02-04 08:10:00   timer_03_c05    04.02.2021 09:10:00
   Regex:
     accu:
     cond:
       WS_FlurEG:
         2:
           state      ^WS_FlurEG$:^state:
         3:
           state      ^WS_FlurEG$:^state:
   attr:
     cmdState:
     wait:
       0:
         0
         0
       1:
         15
         15
       2:
         120
         120
       3:
         0
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
     1          ::DOIF_time_once($hash,1,$wday)
     2          ::ReadingValDoIf($hash,'WS_FlurEG','state')==0  and ::ReadingValDoIf($hash,'WS_FlurEG','day')==1  and ::ReadingValDoIf($hash,'WS_FlurEG','mode')==0
     3          ::ReadingValDoIf($hash,'WS_FlurEG','state')==0  and ::ReadingValDoIf($hash,'WS_FlurEG','day')==0  and ::ReadingValDoIf($hash,'WS_FlurEG','mode')==0
     4          ::DOIF_time_once($hash,2,$wday)
   days:
   do:
     0:
       0          set WS_FlurEG day
       1          set WS_Garage day
     1:
       0          set WS_FlurEG night
       1          set WS_Garage night
     2:
       0          set WS_FlurEG _off
     3:
       0          set WS_FlurEG _off
     4:
       0         
     5:
   helper:
     DEVFILTER  ^global$|^WS_FlurEG$
     NOTIFYDEV  global|WS_FlurEG
     event      timer_3
     globalinit 1
     last_timer 3
     sleeptimer -1
     timerdev   
     timerevent timer_3
     triggerDev
     DOIF_eventa:
       cmd_nr: 5
       cmd: 5
       cmd_event: timer_3
       cmd_5
     DOIF_eventas:
       cmd_nr: 5
       cmd: 5
       cmd_event: timer_3
       state: cmd_5
     bm:
       DOIF_Get:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        04.02. 08:09:07
         max        3.09944152832031e-05
         tot        5.48362731933594e-05
         mAr:
           HASH(0x56555bbe6978)
           Bewegungsmelder
           ?
       DOIF_Notify:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        04.02. 08:08:59
         max        0.000294923782348633
         tot        0.000489950180053711
         mAr:
           HASH(0x56555bbe6978)
           HASH(0x56554fb84e60)
       DOIF_Set:
         cnt        10
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        04.02. 08:09:07
         max        0.0243089199066162
         tot        0.0252540111541748
         mAr:
           HASH(0x56555bbe6978)
           Bewegungsmelder
           enable
     timerevents:
       timer_3
     timereventsState:
       timer_3
     triggerEvents:
       timer_3
     triggerEventsState:
       timer_3
   interval:
   intervalfunc:
   localtime:
     0          1612423214
     1          1612455108
     2          1612426200
   readings:
     all         WS_FlurEG:state
   realtime:
     0          08:20:14
     1          17:11:48
     2          09:10:00
   time:
     0          {sunrise_abs(1800+ReadingsVal('Bewegungsmelder','clouds',''))}
     1          {sunset_abs(-1800-ReadingsVal('Bewegungsmelder','clouds',''))}
     2          +[1]:10
   timeCond:
     0          0
     1          1
     2          4
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0
     1           1
     4           2
   triggertime:
     1612423214:
       localtime  1612423214
       hash:
     1612426200:
       localtime  1612426200
       hash:
     1612455108:
       localtime  1612455108
       hash:
   uiState:
   uiTable:
Attributes:
   devStateIcon .*:fts_shutter_1w_0
   do         always
   icon       weather_night
   room       CUL_HM
   userReadings clouds {3600*2/3/100*ReadingsVal('Leverkusen.DarkSky','cloudCover','')}
   wait       0,0:15,15:120,120:0
Titel: Antw:timespec erneuern, geht das?
Beitrag von: Gisbert am 04 Februar 2021, 19:47:32
Hallo,

ich habe noch keine Möglichkeit gefunden, wie es gehen kann. Offensichtlich ist nicht vorgesehen, dass später vorliegende Informationen zur Neuberechnung der nächsten timespec berücksichtigt werden.
Falls jemand eine Idee hat, dann gerne her damit.

Viele​ Grüße​ Gisbert​
Titel: Antw:timespec erneuern, geht das?
Beitrag von: betateilchen am 04 Februar 2021, 19:55:05
Sowas kann man mit at und notify problemlos lösen. Aber mit DOIF? Keine Ahnung.
Titel: Antw:timespec erneuern, geht das?
Beitrag von: Damian am 04 Februar 2021, 21:48:38
Zitat von: Gisbert am 04 Februar 2021, 19:47:32
Hallo,

ich habe noch keine Möglichkeit gefunden, wie es gehen kann. Offensichtlich ist nicht vorgesehen, dass später vorliegende Informationen zur Neuberechnung der nächsten timespec berücksichtigt werden.
Falls jemand eine Idee hat, dann gerne her damit.

Viele​ Grüße​ Gisbert​

Dafür sind doch indirekte Timer da. Die ändern sich sofort, wenn sich die Zeit ändert.
Titel: Antw:timespec erneuern, geht das?
Beitrag von: Gisbert am 05 Februar 2021, 07:16:38
Zitat von: Damian am 04 Februar 2021, 21:48:38
Dafür sind doch indirekte Timer da. Die ändern sich sofort, wenn sich die Zeit ändert.

Hallo Damian,

damit hat es geklappt.
Ich musste zunächst ein userReading (morning, evenig) erzeugen, um das richtige Format hh:mm:ss zu bekommen. Im DOIF-Zweig gab es sonst eine Fehlermeldung, egal.

So sieht jetzt die Lösung aus:
defmod Bewegungsmelder DOIF ([[Bewegungsmelder:morning]]) \
(set WS_FlurEG day) \
(set WS_Garage day) \
DOELSEIF ([[Bewegungsmelder:evening]]) \
(set WS_FlurEG night) \
(set WS_Garage night) \
DOELSEIF ([WS_FlurEG:state]==0 \
and [?WS_FlurEG:day]==1 \
and [?WS_FlurEG:mode]==0) \
(set WS_FlurEG _off) \
DOELSEIF ([WS_FlurEG:state]==0 \
and [?WS_FlurEG:day]==0 \
and [?WS_FlurEG:mode]==0) \
(set WS_FlurEG _off) \
DOELSEIF ([+[1]:20])
attr Bewegungsmelder comment Bei indirekte Zeitangaben mit doppelten [[]] werden die timespecs \
sofort neu berechnet, wenn sich die Readings ändern. \
Damit kann erreicht werden, dass die Zeiten für sunrise/sunset \
mit dem Grad der Wolkenbedeckung abgewandelt werden können.
attr Bewegungsmelder devStateIcon .*:fts_shutter_1w_0
attr Bewegungsmelder do always
attr Bewegungsmelder icon weather_night
attr Bewegungsmelder room CUL_HM
attr Bewegungsmelder userReadings morning {sunrise_abs(1800+3600*2/3/100*ReadingsVal('Leverkusen.DarkSky','cloudCover',''))},\
evening {sunset_abs(-1800-3600*2/3/100*ReadingsVal('Leverkusen.DarkSky','cloudCover',''))}
attr Bewegungsmelder wait 0,0:15,15:120,120:0


Viele​ Grüße​ Gisbert​
Titel: Antw:[gelöst] timespec erneuern, geht das?
Beitrag von: Damian am 05 Februar 2021, 12:20:22
Ich hätte es statt mit userReading mit DOIF_Reading gemacht, der Trigger wäre dann Leverkusen.DarkSky','cloudCover', eine Triggerung der Art DOELSEIF ([+[1]:20]  sollte dann überflüssig sein.
Titel: Antw:[gelöst] timespec erneuern, geht das?
Beitrag von: Gisbert am 05 Februar 2021, 13:01:08
Hallo Damian,
danke, probiere ich aus - ich gehe davon aus, dass ich dies alleine hinbekomme, ansonsten, muss ich dich nochmals belästigen ;)
Viele Grüße Gisbert