[gelöst] Wie in einem über 2 Dummies (je Datum+Uhrzeit) def. Zeitraum schalten?

Begonnen von dadoc, 30 Oktober 2018, 16:08:07

Vorheriges Thema - Nächstes Thema

dadoc

Ah, ok. ich dachte, die Daten müssten übereinstimmen. Aber schalten tut es dennoch nicht so, wie es soll. Was mache ich falsch?
([keyremote_1_2] =~ "Short" and [[dummy_start_d:state:"(\d\d:\d\d:\d\d)$"]-[dummy_ende_d:state:"(\d\d:\d\d:\d\d)$"]] and [?dummy_start_d:state:"^(\d\d).(\d\d).\d\d(\d\d)":"$3-$2-$1"] le $ymd and $ymd le [?dummy_ende_d:state:"^(\d\d).(\d\d).\d\d(\d\d)":"$3-$2-$1"])
(set testdummy loel)
DOELSE
(set testdummy unloel)

schaltet bei

dummy_start_d 31.10.2018 14:30:30
dummy_ende_d 31.10.2018 17:00:28

und Betätigung von Keyremote_1_2 um 14:40 Uhr den testdummy nicht auf loel, sondern auf unloel.
Ich hätte das jetzt so verstanden, dass wen das DOIF durch den Remote-Druck getriggert wird, es die Datumsberechnung durchführt und den ersten Befehl anbschickt.
Zitat von: betateilchen am 31 Oktober 2018, 10:54:10
So umständlich wie hier im Thread würde ich eine so simple Aufgabenstellung jedenfalls nicht angehen.
Ich hatte auch im Leben nicht damit gerechnet, dass das irgendwie kompliziert sein könnte - daher hatte ich es mir für ganz für den Schluss aufbewahrt. Aber mit at habe ich es auch nicht hinbekommen, scheint auch nicht so ohne weiter möglich, siehe https://forum.fhem.de/index.php?topic=91625.0
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Per

Nimm doch DOIF_readings, da siehst du schon mal, ob die RegEx funktioniert. Und du brauchst sie auch nicht mehrfach.

dadoc

DOIF_readings - habe es zwar gerade in der Commandref nachgelesen, bin aber nun doch reichlich verwirrt - zu viel Neues auf einmal für eine banal geglaubte Aufgabe, was mich jetzt schon viele Stunden gekostet hat und trotzdem noch nicht das tut, was ich will.
Ich glaube, ich setze erstmal von Hand einen Dummy, der vor dem Schalten abgefragt wird ... Vielleicht bekomme ich ja noch eine Erleuchtung...
Danke & Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Ich habe fälschlicherweise die Jahreszahl nur zweistellig herausgefilter $ymd hat aber das Format YYYY-MM-DD.

Über DOIF_Readings lässt sich die Definition besser nachvollziehen:

defmod di_test2 DOIF ([[$SELF:start_z]-[$SELF:ende_z]] and [?$SELF:start] le $ymd and $ymd le [?$SELF:ende]) (set bla on) DOELSE (set bla off)

attr di_test2 DOIF_Readings start:[dummy_start_d:state:"^(\d\d).(\d\d).(\d\d\d\d)":"$3-$2-$1"],ende:[dummy_ende_d:state:"^(\d\d).(\d\d).(\d\d\d\d)":"$3-$2-$1"],\
start_z:[dummy_start_d:state:"(\d\d:\d\d:\d\d)$"], ende_z:[dummy_ende_d:state:"(\d\d:\d\d:\d\d)$"]


Es entstehen aus den Dummys separate Readings im DOIF für Zeit und Datum (hier kann man schon sehen, ob die Daten noch stimmen), die dann in der Bedingung abgegriffen werden. Diese Version habe ich persönlich bei mir auf Korrektheit geprüft ;)

Edit: Es fehlten noch die Zeittrigger
Edit: Bei einer Änderung der Dummys werden automatisch die Readings neu erstellt und die Zeittrigger neugesetzt :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Vielen Dank Damian, ich war schon dabei, mir eine Routine für die myutils.pm zu basteln, mit str2time...
Zitat von: Damian am 31 Oktober 2018, 18:14:55
Edit: Es fehlten noch die Zeittrigger
Was genau meinst Du damit?

Das Ganze sieht bei mir nun so aus
Internals:
   CFGFN     
   DEF        ([[$SELF:dummy_start_d]-[$SELF:dummy_ende_d]] and [?$SELF:start] le $ymd and $ymd le [?$SELF:ende]) (set bla on) DOELSE (set bla off)
   MODEL      FHEM
   NAME       di_test2
   NR         40470
   NTFY_ORDER 50-di_test2
   STATE      initialized
   TYPE       DOIF
   CHANGED:
     ende_z: 16:45:21
   CHANGEDWITHSTATE:
     ende_z: 16:45:21
   DOIF_Readings:
     ende       ::ReadingValDoIf($hash,'dummy_ende_d','state','','^(\d\d).(\d\d).(\d\d\d\d)','"$3-$2-$1"')
     ende_z     ::ReadingValDoIf($hash,'dummy_ende_d','state','','(\d\d:\d\d:\d\d)$')
     start      ::ReadingValDoIf($hash,'dummy_start_d','state','','^(\d\d).(\d\d).(\d\d\d\d)','"$3-$2-$1"')
     start_z    ::ReadingValDoIf($hash,'dummy_start_d','state','','(\d\d:\d\d:\d\d)$')
   READINGS:
     2018-10-31 18:51:26   cmd             0
     2018-10-31 18:56:25   ende            2018-11-01
     2018-10-31 18:56:26   ende_z          16:45:21
     2018-10-31 18:51:26   mode            enabled
     2018-10-31 18:56:17   start           2018-10-01
     2018-10-31 18:56:19   start_z         16:00:15
     2018-10-31 18:51:26   state           initialized
     2018-10-31 18:51:26   timer_01_c01    error: Wrong timespec : either HH:MM:SS or {perlcode}
     2018-10-31 18:51:26   timer_02_c01    error: Wrong timespec : either HH:MM:SS or {perlcode}
   Regex:
     DOIF_Readings:
       dummy_ende_d:
         ende:
           state      ^dummy_ende_d$:^state:
         ende_z:
           state      ^dummy_ende_d$:^state:
       dummy_start_d:
         start:
           state      ^dummy_start_d$:^state:
         start_z:
           state      ^dummy_start_d$:^state:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'di_test2','start') le $ymd and $ymd le ::ReadingValDoIf($hash,'di_test2','ende')
   devices:
   do:
     0:
       0          set bla on
     1:
       0          set bla off
   helper:
     DOIF_Readings_events
     globalinit 1
     last_timer 2
     sleeptimer -1
   interval:
     0          -1
     1          0
   itimer:
     all         di_test2
   localtime:
   time:
     0          [di_test2:dummy_start_d]
     1          [di_test2:dummy_ende_d]
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   uiState:
   uiTable:
Attributes:
   DOIF_Readings start:[dummy_start_d:state:"^(\d\d).(\d\d).(\d\d\d\d)":"$3-$2-$1"],ende:[dummy_ende_d:state:"^(\d\d).(\d\d).(\d\d\d\d)":"$3-$2-$1"],start_z:[dummy_start_d:state:"(\d\d:\d\d:\d\d)$"], ende_z:[dummy_ende_d:state:"(\d\d:\d\d:\d\d)$"]


Haben die Fehler bei den Timern (Wrong timespec : either HH:MM:SS or {perlcode}) etwas zu besagen?
Ich kann leider nicht behaupten, dass ich den Code schon voll verstehe...
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Zitat von: dadoc am 31 Oktober 2018, 19:02:50
Vielen Dank Damian, ich war schon dabei, mir eine Routine für die myutils.pm zu basteln, mit str2time...Was genau meinst Du damit?

Das Ganze sieht bei mir nun so aus

   DEF        ([[$SELF:dummy_start_d]-[$SELF:dummy_ende_d]] and [?$SELF:start] le $ymd and $ymd le [?$SELF:ende]) (set bla on) DOELSE (set bla off)
 

Das sind die falschen Zeitangaben, siehe meine Definition - das sind die eigentlichen Zeittrigger.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Ah ok, danke. Und schon sind die Fehler weg. Später werde ich es dann mal im Einsatz testen.
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Du wolltest wohl nur ein Zeitintervall abfragen und gar nicht über Zeit triggern, dann müsstest du deine Definition anpassen:

([?[$SELF:start_z]-[$SELF:ende_z]] and [?$SELF:start] le $ymd and $ymd le [?$SELF:ende] and "mytrigger") ...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Jetzt bin ich warm gelaufen, hier eine vereinfachte Version die nur das Zeitintervall (mit Datum) abfragt:

defmod di_test2 DOIF ([?$SELF:start] le "$ymd $hms" and "$ymd $hms" le [?$SELF:ende] and ["mytrigger"]) (...

attr di_test2 DOIF_Readings start:[dummy_start_d:state:"^(\d\d).(\d\d).(\d\d\d\d) (\d\d:\d\d:\d\d)$":"$3-$2-$1 $4"],ende:[dummy_ende_d:state:"^(\d\d).(\d\d).(\d\d\d\d) (\d\d:\d\d:\d\d)$":"$3-$2-$1 $4"]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Cool, danke, werde ich natürlich auch ausprobieren (und dann den Thread auf gelöst setzen). Auch die vorherige Version scheint im Praxistest schon genau das zu machen, was ich wollte. Vielen Dank!
Generell scheint die Datumsbehandlung in fhem noch etwas stiefmütterlich zu sein, sobald es sich nicht um wiederkehrende Wochentage o.ä. handelt. Sicher kann man mit Regex (fast) alles lösen, aber für nicht- oder Gelegenheitsprogrammierer birgt das zahllose Stolperfallen. Das Calendermodul muss ich mir noch einmal anschauen, schien mir beim Querlesen aber auch nicht unbedingt unkomplex...
Schönen Abend
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Mal zur Info auch für Interessierte:

DOIF vergleicht Zeitintervalle als Zeichenketten. Zudem kennt es nur Zeitangaben im Format HH:MM:SS zum Triggern.

at wurde irgendwann auf das Format ISO8601 (YYYY-MM-DDTHH:MM:SS) erweitert. Vielleicht werde ich es irgendwann mal nachziehen, was allerdings einen gewissen Aufwand bedeutet.

Dann könnte man z. B. angeben: [2018-10-01T10:00:00 - 2018-11-01T20:00:00] oder indirekt über Readings.

Das von dir vorgegebene Format 02.11.2018 13:30  also TT.MM.YYYY HH:MM ist nicht für String-Vergleiche geeignet, dafür muss man mit dem Jahr beginnen, dann den Monat angeben und dann den Tag. An dieser Stelle sind uns andere Länder überlegen.

Meine letzte Definition macht einfach nur aus  02.11.2018 13:30:00   2018-11-02 13:30:00 (über DOIF_Readings). Damit lässt sich dann einfach ein zeitliches Intervall vergleichen:

start <= jetzt und jetzt <=ende

das entspricht der zuletzt angegebenen Bedingung im DOIF.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Zitat von: Damian am 31 Oktober 2018, 20:19:48
Das von dir vorgegebene Format 02.11.2018 13:30  also TT.MM.YYYY HH:MM ist nicht für String-Vergleiche geeignet, dafür muss man mit dem Jahr beginnen, dann den Monat angeben und dann den Tag. An dieser Stelle sind uns andere Länder überlegen.
Mich hat bei der Lösungssuche die Flexibilität von str2time in Sachen der unterschiedlichsten Formatierungen beeindruckt: https://metacpan.org/pod/release/RSE/lcwa-1.0.0/lib/lwp/lib/HTTP/Date.pm#DESCRIPTION
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Zitat von: dadoc am 31 Oktober 2018, 20:53:08
Mich hat bei der Lösungssuche die Flexibilität von str2time in Sachen der unterschiedlichsten Formatierungen beeindruckt: https://metacpan.org/pod/release/RSE/lcwa-1.0.0/lib/lwp/lib/HTTP/Date.pm#DESCRIPTION
Grüße
Martin

ja, allerdings kommt dein Format darin nicht vor ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Zitat von: Damian am 31 Oktober 2018, 21:10:14
ja, allerdings kommt dein Format darin nicht vor ;)
Ja, wohl wahr. Ist ja hierzulande auch ein total exotisches Format ;)
Ich vertrete auch unseren Entwicklern gegenüber immer den Standpunkt, dass das Frontend jedweder Applikation dem Benutzer die Informationen in ,,gewohnten" Formaten abbildet und es Aufgabe des Backends (lies: der Entwickler) ist, die entsprechende ,,Übersetzung" in den rechenbaren Bereich zu realisieren.
,,Mein" Format im konkreten Fall ließe sich jedoch auch im Bedarfsfall anpassen, es wird mit dem ftui datetimepicker gesetzt, und der erlaubt eine individuelle Formatierung: https://wiki.fhem.de/wiki/FTUI_Widget_Datetimepicker#Attribute
Hätte aber hier wohl auch nicht geholfen, da wohl die Verarbeitung des Datums, egal in welchem Format (außer epoch/timestamp?) bislang nicht ohne komplexe Regex-Lösungen vorgesehen ist.
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Damian

Zitat von: dadoc am 31 Oktober 2018, 21:28:02
Ja, wohl wahr. Ist ja hierzulande auch ein total exotisches Format ;)
Ich vertrete auch unseren Entwicklern gegenüber immer den Standpunkt, dass das Frontend jedweder Applikation dem Benutzer die Informationen in ,,gewohnten" Formaten abbildet und es Aufgabe des Backends (lies: der Entwickler) ist, die entsprechende ,,Übersetzung" in den rechenbaren Bereich zu realisieren.
,,Mein" Format im konkreten Fall ließe sich jedoch auch im Bedarfsfall anpassen, es wird mit dem ftui datetimepicker gesetzt, und der erlaubt eine individuelle Formatierung: https://wiki.fhem.de/wiki/FTUI_Widget_Datetimepicker#Attribute
Hätte aber hier wohl auch nicht geholfen, da wohl die Verarbeitung des Datums, egal in welchem Format (außer epoch/timestamp?) bislang nicht ohne komplexe Regex-Lösungen vorgesehen ist.
Grüße
Martin

Doch, wenn du Datetimepicker auf YYYY-MM-DD HH:MM:SS umstellst, dann kannst du direkt in der Bedingung angeben

([?dummy_start_d] le "$ymd $hms" and "$ymd $hms" le [?dummy_ende_d] and ["mytrigger"])(...

Dann brauchst keine Kunstgriffe über Regex. Das DOIF_Readings-Attribut kannst du dann löschen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF