(Gelöst) Schalter mit DOIF für Termine innerhalb 2 Datum

Begonnen von DJCrazy, 11 Juli 2019, 21:55:01

Vorheriges Thema - Nächstes Thema

DJCrazy

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.

amenomade

#1
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.

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DJCrazy

#2
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

amenomade

#3
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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DJCrazy

#4
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?

amenomade

#5
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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DJCrazy

Vielen Dank amenomade.

Umgeschrieben, getestet und es läuft beim ersten Versuch.
Ich merke schon. Es gibt für mich noch viel zu lernen.