Hallo zusammen,
Ich habe einen Schalter per DOIF der aktuell ab Uhrzeit 1 und Datum 1 bis zur Uhrzeit 2 und Datum 2 geschalten ist.
Neu möchte ich gerne das täglich von Uhrzeit 1 bis Uhrzeit 2 geschalten wird.
So lange es innerhalb der beiden eingestellten Datums ist.
Aktueller Code:
([[$SELF:P_bhm,"00:00"]] and [?$SELF:P_byear] == $year and [?$SELF:P_bmon] == $month and [?$SELF:P_bday] == $mday)
({Log 1, "Alarmstart"})
DOELSEIF
([[$SELF:P_ehm,"00:00"]] and [?$SELF:P_eyear] == $year and [?$SELF:P_emon] == $month and [?$SELF:P_eday] == $mday)
({Log 1, "Alarmstop"})
Meine Idee:
Alle Parameter müssen gegeneinander verglichen werden. Sprich mit grösser gleich und kleiner gleich. Richtig?
Ich habe mal den Code so umgeschrieben wie ich es mein.
Er reagiert zwar auf die beiden Zeiten aber schaltet trotzdem ausserhalb der beiden Datum Grenzen:
([[$SELF:P_bhm,"00:00"]] and [?$SELF:P_byear] >= $year or [?$SELF:P_eyear] <= $year and [?$SELF:P_bmon] >= $month or [?$SELF:P_emon] <= $month and [?$SELF:P_bday] >= $mday or [?$SELF:P_eday] <= $mday)
({Log 1, "Alarmstart"})
DOELSEIF
([[$SELF:P_ehm,"00:00"]] and [?$SELF:P_byear] >= $year or [?$SELF:P_eyear] <= $year and [?$SELF:P_bmon] >= $month or [?$SELF:P_emon] <= $month and [?$SELF:P_bday] >= $mday or [?$SELF:P_eday] <= $mday)
({Log 1, "Alarmstop"})
Kann mir hier jemand helfen, was der Fehler im Code ist?
Vielen Dank.
Gruß, Fabian.
Unabhängig davon, dass deine Klammern nicht richtig gesetzt sind ("and" bindet stärker als "or"), kann es mit getrenntem Vergleich von Jahr dann Monat dann Tag nicht funktionieren. Du musst dein Datum so formattieren, dass Du wirklich das ganze auf einmal vergleichen kannst, z.B. als Timestamp, oder wie JJJJ-MM-TT
Also... mit einem bDatum und einem eDatum Reading in der form JJJJ-MM-TT:
([[$SELF:P_bhm,"00:00"]] and $ymd ge [$SELF:bDatum] and $ymd le [$SELF:eDatum]) {Log 1, "Alarmstart"}
DOELSEIF ([[$SELF:P_ehm,"00:00"]] and $ymd ge [$SELF:bDatum] and $ymd le [$SELF:eDatum]) {Log 1, "Alarmstop"}
PS: Ich könnte schwören, ich habe fast das gleiche Post vor ein paar Tage schon gesehen.
hatte den Post auch im Anfängerforum aber keine Antwort erhalten.
Hab den Thread löschen wollen, aber ging noch nicht.
Da das Datum Auswählbar sein sollte wird es sicher nicht so einfach mit dem Formatieren. Hast du hier ein Tip für mich?
Eine direkte Formatierung bei ReadingList möglich?
Hier noch die List zu diesem Gerät.
Internals:
DEF ([[$SELF:P_bhm,"00:00"]] and [?$SELF:P_byear] >= $year or [?$SELF:P_eyear] <= $year and [?$SELF:P_bmon] >= $month or [?$SELF:P_emon] <= $month and [?$SELF:P_bday] >= $mday or [?$SELF:P_eday] <= $mday)
({Log 1, "Alarmstart"})
DOELSEIF
([[$SELF:P_ehm,"00:00"]] and [?$SELF:P_byear] >= $year or [?$SELF:P_eyear] <= $year and [?$SELF:P_bmon] >= $month or [?$SELF:P_emon] <= $month and [?$SELF:P_bday] >= $mday or [?$SELF:P_eday] <= $mday)
({Log 1, "Alarmstop"})
FUUID 5d26146c-f33f-b42a-c69a-03162587fcd061e4
MODEL FHEM
NAME di_Datumsbereich_Weih1
NR 426
NTFY_ORDER 50-di_Datumsbereich_Weih1
STATE 0
TYPE DOIF
VERSION 19786 2019-07-05 21:47:08
READINGS:
2019-07-11 18:26:14 P_bday 12
2019-07-11 18:26:26 P_bhm 18:27
2019-07-11 18:10:09 P_bmon 7
2019-07-10 18:45:44 P_byear 2019
2019-07-11 18:26:16 P_eday 13
2019-07-11 18:26:29 P_ehm 18:29
2019-07-11 18:11:52 P_emon 7
2019-07-11 18:11:54 P_eyear 2019
2019-07-11 18:29:00 cmd 2
2019-07-11 18:29:00 cmd_event timer_2
2019-07-11 18:29:00 cmd_nr 2
2019-07-11 18:27:22 mode enabled
2019-07-11 18:29:00 state 0
2019-07-11 20:06:31 timer_01_c01 12.07.2019 18:27:00
2019-07-11 20:06:31 timer_02_c02 12.07.2019 18:29:00
Regex:
accu:
attr:
cmdState:
0:
1
1:
0
condition:
0 ::DOIF_time_once($hash,0,$wday) and ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_byear') >= $year or ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_eyear') <= $year and ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_bmon') >= $month or ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_emon') <= $month and ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_bday') >= $mday or ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_eday') <= $mday
1 ::DOIF_time_once($hash,1,$wday) and ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_byear') >= $year or ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_eyear') <= $year and ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_bmon') >= $month or ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_emon') <= $month and ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_bday') >= $mday or ::ReadingValDoIf($hash,'di_Datumsbereich_Weih1','P_eday') <= $mday
days:
devices:
do:
0:
0 {Log 1, "Alarmstart"}
1:
0 {Log 1, "Alarmstop"}
2:
helper:
globalinit 1
last_timer 2
sleeptimer -1
intervalfunc:
itimer:
all di_Datumsbereich_Weih1
localtime:
0 1562948820
1 1562948940
perlblock:
realtime:
0 18:27:00
1 18:29:00
time:
0 [di_Datumsbereich_Weih1:P_bhm,"00:00"]
1 [di_Datumsbereich_Weih1:P_ehm,"00:00"]
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
triggertime:
1562948820:
localtime 1562948820
hash:
1562948940:
localtime 1562948940
hash:
uiState:
uiTable:
Attributes:
alias Termine Event Innen
cmdState 1|0
group Automation
icon time_calendar
readingList P_bhm P_bday P_bmon P_byear P_ehm P_eday P_emon P_eyear
room Weihnachten
setList P_bhm:time
P_bday:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
P_bmon:1,2,3,4,5,6,7,8,9,10,11,12
P_byear:2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030 P_ehm:time
P_eday:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
P_emon:1,2,3,4,5,6,7,8,9,10,11,12 P_eyear:2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030
sortby 2
webCmd P_bhm:P_ehm:P_bday:P_bmon:P_byear:P_eday:P_emon:P_eyear
webCmdLabel :
: : :
: : : :
widgetOverride setList:textField-long
Zitathatte den Post auch im Anfängerforum aber keine Antwort erhalten.
Hab den Thread löschen wollen, aber ging noch nicht.
Auf dem ersten Post eines Threads kann der TE sein Thread verschieben (Knopf unten links)
Bitte bei dem "list" code Tags benutzen (das # Zeichen im Edit-Menü)
Mit einem Userreading kannst Du das Datum einfach haben (nach erster Änderung):
attr di_Datumsbereich_Weih1 userReadings bDatum:P_b.* {ReadingsVal("di_Datumsbereich_Weih1","P_byear","1970")."-".ReadingsVal("di_Datumsbereich_Weih1","P_bmon","01")."-".ReadingsVal("di_Datumsbereich_Weih1","P_bday","01")}
EDIT: deine setList musst Du aber anpassen, statt 1,2,3,4,5, eher 01,02,03,04,05
Das heißt für mich
1. bDatum und eDatum unter ReadingList zusätzlich hinzufügen.
2. Das userReading von Dir eingeben.
3. das DEF eins zu eins von Dir kopieren
Richtig so, oder noch an anderer Stelle im Device eine Anpassung?
1. Nein, einfach nur als userReadings definieren
2. Ja, und mit eDatum ähnlich ergänzen (Trennzeichen zwischen userReadings = Koma)
2.5 einmal irgendwelches P_b und P_e Readings ändern, und die Seite aktualisieren. bDatum und eDatum sollten kommen
3. Ja, hab ich aber nicht getestet. Einfach probieren. Wenn es nicht geht können wir nachschauen
Vielen Dank amenomade.
Umgeschrieben, getestet und es läuft beim ersten Versuch.
Ich merke schon. Es gibt für mich noch viel zu lernen.