DOIF mit Zeitberechnung: Warnung Argument "21:37" isn't numeric in...

Begonnen von bmwfan, 10 Juli 2021, 10:45:17

Vorheriges Thema - Nächstes Thema

bmwfan

Guten Morgen,
ich habe wieder ein Problem mit einer Zeitberechnung, dessen Grund ich nicht auf die Schliche komme.
Ich habe ein DOIF, mit dem ich Sonnenaufgang und -untergang bestimme
Internals:
   DEF        ([{sunrise("HORIZON=-4")}]) (set du_Tageslicht hell)
DOELSEIF ([{sunset("HORIZON=-3")}]) (set du_Tageslicht dunkel)
   FUUID      5c4c3931-f33f-6b6f-479e-df5724a54a7d2405
   MODEL      FHEM
   NAME       di_Tageslicht
   NOTIFYDEV  global
   NR         1324
   NTFY_ORDER 50-di_Tageslicht
   STATE      hell
   TYPE       DOIF
   VERSION    24595 2021-06-06 17:52:38
   READINGS:
     2021-07-10 05:06:08   Sonnenaufgang   10
     2021-07-10 05:06:08   Sonnenuntergang 21:37
     2021-07-10 05:06:08   SunDownTimeKor  21:07
     2021-07-10 05:06:08   SunUpTime       05:06
     2021-07-10 05:06:08   cmd             1
     2021-07-10 05:06:08   cmd_event       timer_1
     2021-07-10 05:06:08   cmd_nr          1
     2021-03-21 14:28:32   mode            enabled
     2021-07-10 05:06:08   state           hell
     2021-07-10 05:06:08   timer_01_c01    11.07.2021 05:07:07
     2021-07-09 21:37:35   timer_02_c02    10.07.2021 21:36:56
   Regex:
     accu:
     collect:
   attr:
     cmdState:
       0:
         hell
       1:
          dunkel
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
     1          ::DOIF_time_once($hash,1,$wday)
   days:
   do:
     0:
       0          set du_Tageslicht hell
     1:
       0          set du_Tageslicht dunkel
     2:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1625972827
     1          1625945816
   perlblock:
   realtime:
     0          05:07:07
     1          21:36:56
   time:
     0          {sunrise("HORIZON=-4")}
     1          {sunset("HORIZON=-3")}
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1625945816:
       localtime  1625945816
       hash:
     1625972827:
       localtime  1625972827
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   hell | dunkel
   comment    SunDownTimeKor: Sonnenuntergang minus 30 Minuten.
   do         always
   initialize hell
   room       9.8.1_DOIF
   userReadings Sonnenaufgang {ReadingsTimestamp($name,"timer_01_c01","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;return "$3";},
Sonnenuntergang {ReadingsTimestamp($name,"timer_02_c02","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;return "$4";},
SunUpTime {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name,"timer_01_c01","2000-01-01 00:00:00"))))},
SunDownTimeKor  {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name,"timer_02_c02","2000-01-01 00:00:00"))-30*60))},
   verbose    1


mit dem Reading Sonnenuntergang will ich dieses DOIF steuern:

Internals:
   DEF        (([?Mar_Gar_Ost:pct] != 100 or [?Mar_Gar_West:pct] != 100 or [?Alarm_KueSued] eq "Open") and ([di_Tageslicht:Sonnenuntergang] + [00:45]) and [?MQTT2_shellyswitch25_8CAAB5557520:state] eq "off" and [?MQTT2_shelly1_E8DB84D245AD:input0] == 0) (set MQTT2_shellyswitch25_8CAAB5557520 on-for-timer 600)
DOELSEIF (([FB_8_Btn_07] =~ "Short" or [FB_8_Btn_07:"Long"]) and [?MQTT2_shellyswitch25_8CAAB5557520:state] eq "off" and [?MQTT2_shellyswitch25_8CAAB5557520_CH2:state] eq "off" and [?MQTT2_shelly1_E8DB84D245AD:input0] == 0) (set MQTT2_shellyswitch25_8CAAB5557520 on)
DOELSEIF (([FB_8_Btn_07] =~ "Short" or [FB_8_Btn_07:"Long"]) and [?MQTT2_shellyswitch25_8CAAB5557520:state] eq "on" and [?MQTT2_shellyswitch25_8CAAB5557520_CH2:state] eq "off" and [?MQTT2_shelly1_E8DB84D245AD:input0] == 0) (set MQTT2_shellyswitch25_8CAAB5557520 off, set MQTT2_shellyswitch25_8CAAB5557520_CH2 on)
DOELSEIF (([FB_8_Btn_07] =~ "Short" or [FB_8_Btn_07:"Long"]) and [?MQTT2_shellyswitch25_8CAAB5557520:state] eq "off" and [?MQTT2_shellyswitch25_8CAAB5557520_CH2:state] eq "on" and [?MQTT2_shelly1_E8DB84D245AD:input0] == 0) (set MQTT2_shellyswitch25_8CAAB5557520 on)
DOELSEIF (([FB_8_Btn_07] =~ "Short" or [FB_8_Btn_07:"Long"]) and [?MQTT2_shellyswitch25_8CAAB5557520:state] eq "on" and [?MQTT2_shellyswitch25_8CAAB5557520_CH2:state] eq "on" and [?MQTT2_shelly1_E8DB84D245AD:input0] == 0) (set MQTT2_shellyswitch25_8CAAB5557520 off, set MQTT2_shellyswitch25_8CAAB5557520_CH2 off)
DOELSEIF ([22:50]) (set MQTT2_shellyswitch25_8CAAB5557520 off, set MQTT2_shellyswitch25_8CAAB5557520_CH2 off)
   FUUID      60cf1e02-f33f-6b6f-20b8-24d783d6f570f696
   MODEL      FHEM
   NAME       di_Licht_Freisitz
   NOTIFYDEV  di_Tageslicht,global,FB_8_Btn_07
   NR         1875
   NTFY_ORDER 50-di_Licht_Freisitz
   STATE      initialized
   TYPE       DOIF
   VERSION    24595 2021-06-06 17:52:38
   READINGS:
     2021-07-10 10:12:33   cmd             0
     2021-07-10 10:12:33   mode            enabled
     2021-07-10 10:12:33   state           initialized
     2021-07-10 10:12:33   timer_01_c01    11.07.2021 00:45:00
     2021-07-10 10:12:33   timer_02_c06    10.07.2021 22:50:00
   Regex:
     accu:
     collect:
     cond:
       FB_8_Btn_07:
         1:
           &STATE     ^FB_8_Btn_07$
         2:
           &STATE     ^FB_8_Btn_07$
         3:
           &STATE     ^FB_8_Btn_07$
         4:
           &STATE     ^FB_8_Btn_07$
       di_Tageslicht:
         0:
           Sonnenuntergang ^di_Tageslicht$:^Sonnenuntergang:
   attr:
     cmdState:
       0:
         EIN Zeit
       1:
         Bodenstrahler
       2:
         LED-Leiste
       3:
         Bodenstrahler und LED-Leiste
       4:
         AUS Taster
       5:
         AUS
     wait:
     waitdel:
   condition:
     0          (::ReadingValDoIf($hash,'Mar_Gar_Ost','pct') != 100 or ::ReadingValDoIf($hash,'Mar_Gar_West','pct') != 100 or ::InternalDoIf($hash,'Alarm_KueSued','STATE') eq "Open") and (::ReadingValDoIf($hash,'di_Tageslicht','Sonnenuntergang') + ::DOIF_time_once($hash,0,$wday)) and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520','state') eq "off" and ::ReadingValDoIf($hash,'MQTT2_shelly1_E8DB84D245AD','input0') == 0
     1          (::InternalDoIf($hash,'FB_8_Btn_07','STATE') =~ "Short" or ::EventDoIf('FB_8_Btn_07',$hash,'Long',1)) and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520','state') eq "off" and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520_CH2','state') eq "off" and ::ReadingValDoIf($hash,'MQTT2_shelly1_E8DB84D245AD','input0') == 0
     2          (::InternalDoIf($hash,'FB_8_Btn_07','STATE') =~ "Short" or ::EventDoIf('FB_8_Btn_07',$hash,'Long',1)) and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520','state') eq "on" and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520_CH2','state') eq "off" and ::ReadingValDoIf($hash,'MQTT2_shelly1_E8DB84D245AD','input0') == 0
     3          (::InternalDoIf($hash,'FB_8_Btn_07','STATE') =~ "Short" or ::EventDoIf('FB_8_Btn_07',$hash,'Long',1)) and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520','state') eq "off" and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520_CH2','state') eq "on" and ::ReadingValDoIf($hash,'MQTT2_shelly1_E8DB84D245AD','input0') == 0
     4          (::InternalDoIf($hash,'FB_8_Btn_07','STATE') =~ "Short" or ::EventDoIf('FB_8_Btn_07',$hash,'Long',1)) and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520','state') eq "on" and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_8CAAB5557520_CH2','state') eq "on" and ::ReadingValDoIf($hash,'MQTT2_shelly1_E8DB84D245AD','input0') == 0
     5          ::DOIF_time_once($hash,1,$wday)
   days:
   do:
     0:
       0          set MQTT2_shellyswitch25_8CAAB5557520 on-for-timer 600
     1:
       0          set MQTT2_shellyswitch25_8CAAB5557520 on
     2:
       0          set MQTT2_shellyswitch25_8CAAB5557520 off, set MQTT2_shellyswitch25_8CAAB5557520_CH2 on
     3:
       0          set MQTT2_shellyswitch25_8CAAB5557520 on
     4:
       0          set MQTT2_shellyswitch25_8CAAB5557520 off, set MQTT2_shellyswitch25_8CAAB5557520_CH2 off
     5:
       0          set MQTT2_shellyswitch25_8CAAB5557520 off, set MQTT2_shellyswitch25_8CAAB5557520_CH2 off
     6:
   helper:
     DEVFILTER  ^global$|^di_Tageslicht$|^FB_8_Btn_07$
     NOTIFYDEV  global|di_Tageslicht|FB_8_Btn_07
     globalinit 1
     last_timer 2
     sleeptimer -1
     triggerDev
   internals:
     all         Alarm_KueSued:STATE FB_8_Btn_07:STATE
   intervalfunc:
   localtime:
     0          1625957100
     1          1625950200
   readings:
     all         di_Tageslicht:Sonnenuntergang
   realtime:
     0          00:45:00
     1          22:50:00
   time:
     0          00:45:00
     1          22:50:00
   timeCond:
     0          0
     1          5
   timer:
     0          0
     1          0
   timers:
     0           0
     5           1
   trigger:
     all         FB_8_Btn_07
   triggertime:
     1625950200:
       localtime  1625950200
       hash:
     1625957100:
       localtime  1625957100
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   EIN Zeit|Bodenstrahler|LED-Leiste|Bodenstrahler und LED-Leiste|AUS Taster|AUS
   comment    30.06.2021: Bedingungen erweitert, damit bei Wasser im Freisitz (and [?MQTT2_shelly1_E8DB84D245AD:input0] == 0) Lampen nicht angehen
   room       1.9_Garten,9.8.1_DOIF


Im Log habe ich aber die Meldung:
free(): invalid pointer
free(): invalid pointer
2021.07.10 10:15:22.395 1: PERL WARNING: Argument "21:37" isn't numeric in addition (+) at (eval 6611309) line 1.
2021.07.10 10:15:22.395 3: eval: di_Licht_Freisitz: warning in condition c01
2021.07.10 10:15:24.593 1: PERL WARNING: Argument "21:37" isn't numeric in addition (+) at (eval 6611326) line 1.
2021.07.10 10:15:24.593 3: eval: di_Licht_Freisitz: warning in condition c01
free(): invalid pointer
free(): invalid pointer


Mit Invalid Pointer kann ich leider gar nichts anfangen und die Warnung zur Zeitangabe deutet doch darauf hin, dass es bei ([di_Tageslicht:Sonnenuntergang] + [00:45]) eine Unverträglichkeit der Datentypen gibt, oder?

Ich habe versucht, mich an das Beispiel aus der Commandref zu halten, allerdings ohne Zeitbereich
Licht soll eine Stunde vor gegebener Zeit eingeschaltet werden und eine Stunde danach wieder ausgehen:

define Fixtime dummy
set Fixtime 20:00

define di_light DOIF ([([Fixtime]-[01:00]) - ([Fixtime]+[01:00])])

    (set lampe on)

DOELSE

    (set lampe off)



Wo liegt der Fehler?

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

cwagner

Bei mir läuft eine vergleichbare Berechnung für Heizungsabsenkung in jedem Raum mit dieser Notation:

[18:30-([Schlafen]-[01:00])]

Die Heizphase beginnt um 18:30 Uhr und je nach Art des Folgetages wird der Dummy Schlafen auf eine unterschiedliche Zeit gesetzt und von dieser Zeit in diesem Fall 1 Stunde abgezogen.
Wichtig ist, dass die gesamte Zeitspanne in [ ...   ] steht.  In DOIF werden Rechenvorgänge für sich in ( ...  ) geklammert.

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

bmwfan

Werde es mal mit der zusätzlichen Klammer um den ganzen Zeitausdruck versuchen.

Danke
Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd