UserReading liefert falsche nächste Schaltzeit

Begonnen von MagicB85, 31 Januar 2021, 21:56:22

Vorheriges Thema - Nächstes Thema

MagicB85

Hallo,
ich habe heute ein Problem mit meinem DOIF zum Schalten der Aussenbeleuchtung bzw. dem zugehörigen UserReading festgestellt.

Hier die Definition des DOIF:

([({sunset("CIVIL",0,"17:00","21:00")}-int(rand(900)))] or [07:00]) (set HM_40D65A on) DOELSEIF ([({sunrise("REAL",0,"7:30","09:30")}+int(rand(900)))] or [23:00]) (set HM_40D65A off)

Das UserReading:

Next { if(ReadingsVal($name, "mode", "") eq "enabled") { min(ReadingsVal($name, "timer_01_c01", ""), ReadingsVal($name, "timer_02_c01", ""), ReadingsVal($name, "timer_03_c02", ""), ReadingsVal($name, "timer_04_c02", "")) } else { "" } }

Dies hat die letzten Tage bis heute wunderbar funktioniert. Doch aktuell liefert es mir als nächste Schaltzeit das Einschalten um 01.02.2021 07:00:00 anstelle des Ausschaltens um 31.01.2021 23:00:00.

Hier der Auszug aus dem list:


2021-01-31 21:50:48   Next            01.02.2021 07:00:00
     2021-01-29 08:36:22   cmd             2
     2021-01-29 08:36:22   cmd_event       timer_3
     2021-01-29 08:36:22   cmd_nr          2
     2021-01-31 21:50:48   mode            enabled
     2021-01-31 21:36:44   state           off
     2021-01-31 21:11:14   timer_01_c01    01.02.2021 17:53:09
     2021-01-31 21:11:14   timer_02_c01    01.02.2021 07:00:00
     2021-01-31 21:11:14   timer_03_c02    01.02.2021 08:26:56
     2021-01-31 21:11:14   timer_04_c02    31.01.2021 23:00:00


Vielleicht hat ja jemand von euch eine Idee woran das liegt.
Danke für eure Unterstützung vorab!

Viele Grüße Björn

Damian

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

xenos1984

Du vergleichst dort Datumsangaben mit der Funktion min. Diese konvertiert die Ausdrücke vorher in Zahlenwerte, und 1 ist eben kleiner als 31. Um den frühesten Zeitpunkt zu bekommen, müsstest du also vorher z.B. in UNIX Timestamps konvertieren.

http://perldoc.perl.org/List::Util#min

Damian

Zitat von: xenos1984 am 01 Februar 2021, 07:47:12
Du vergleichst dort Datumsangaben mit der Funktion min. Diese konvertiert die Ausdrücke vorher in Zahlenwerte, und 1 ist eben kleiner als 31. Um den frühesten Zeitpunkt zu bekommen, müsstest du also vorher z.B. in UNIX Timestamps konvertieren.

http://perldoc.perl.org/List::Util#min

Nicht ganz, die Funktion min in FHEM vergleicht lexikografisch (da bin ich selbst schon mal drauf reingefallen) und nicht numerisch. Das ist aber dennoch hier nicht zielführend, denn 31.01.2021 ist größer als 01.02.2021, es ist aber vor dem 01.02 und nicht danach.

Man müsste den Zeitpunkt entweder anders darstellen: JJJJ-MM-TT HH:MM:SS oder eben wie vorgeschlagen in UNIX Timestamps konvertieren, dann aber mit minNum das Minimum bestimmten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF