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
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
Werde es mal mit der zusätzlichen Klammer um den ganzen Zeitausdruck versuchen.
Danke