[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

Hallo zusammen,
für eine Zugangssteuerung möchte ich per DOIF bestimmte Schaltaktionen nur in einen bestimmten Zeitraum erlauben, z.B. zwischen "02.11.2018 13:30" und "02.11.2018 17:30"
Start- und Enddatum/Zeit kommen dynamisch aus Dummies, die die Datum und Zeit genau so als String enthalten.
([dummy_start-dummy_ende]
ergibt erwartungsgemäß "error: Wrong timespec dummy_start: either HH:MM:SS or {perlcode}"
Um nun das entsprechende DOIF zu bauen, suche ich nun schon eine geraume Zeit herum: Muss man das wirklich so kompliziert machen wie hier beschrieben? https://wiki.fhem.de/wiki/DOIF/Zeitspanne_zwischen_zwei_Terminen_schalten#Zeitspanne_zwischen_zwei_Terminen
Oder gibt es da einen einfacheren Weg, um das Datum aus den Dummies mit einzubeziehen?
Käme denn das DOIF damit zurecht, wenn man Start- und Enddatum/-Zeit jeweils als timestamps hätte - und falls ja: Kann man innerhalb des DOIF die String aus den Dummies in Timestamps konvertieren oder müssten die schon als Inhalt in den Dummies stehen?
Im Notify würde ich das (ungetestet) etwa so machen:

my $date = ReadingsVal("dummy_start", "STATE", "");
my ($mday,$mon,$year,$hour,$min,$sec) = split(/[\s.:]+/, $date);
my $time = timelocal($sec,$min,$hour,$mday,$mon-1,$year);
print $time,"\n",scalar localtime $time;
...

Danke für Eure Hilfe &
Viele 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

Augen auf und Klammern zählen!

[[dummy_start]-[dummy_ende]]

Otto123

Zitat von: dadoc am 30 Oktober 2018, 16:08:07
Um nun das entsprechende DOIF zu bauen, suche ich nun schon eine geraume Zeit herum: Muss man das wirklich so kompliziert machen wie hier beschrieben? https://wiki.fhem.de/wiki/DOIF/Zeitspanne_zwischen_zwei_Terminen_schalten#Zeitspanne_zwischen_zwei_Terminen
Oder gibt es da einen einfacheren Weg, um das Datum aus den Dummies mit einzubeziehen?
Hallo Martin,

Per hat schon die Lösung gepostet, ich empfehle Dir nicht irgendwo zu suchen sondern immer zuerst in die Doku schauen:
https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

dadoc

Danke Per & Otto,
danke für die Hinweise, Commandref und Wiki sind in der Tat immer meine ersten Anlaufstellen, ich hatte auch die doppelten Klammern probiert, aber der Fehler bleibt derselbe:
timer_01_c01
error: Wrong timespec 02.11.2018 13:00:18: either HH:MM:SS or {perlcode}

timer_02_c01
error: Wrong timespec 02.11.2018 13:45:26: either HH:MM:SS or {perlcode}

weswegen ich vermutete, dass DOIF nicht mit dem Datums+Zeit-String klarkommt.
Oder doch?

Das DOIF sieht so aus:
([[dummy_start_d]-[dummy_ende_d]] and [keyremote_6_6]) (set status_d off)
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

dadoc

Zitat von: Otto123 am 30 Oktober 2018, 16:33:09
immer zuerst in die Doku schauen:
https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
Hmm, da steht ja auch etwas missverständlich:
ZitatDiese müssen eine Zeitangabe im Format HH:MM oder HH:MM:SS oder eine Zahl beinhalten.
Aber anscheinend nicht nur "beinhalten", sondern ausschließlich daraus bestehen...
Wenn ich den datetimepicker, mit dem ich über ftui Start- und Endzeitpunkt auf Uhrzeit im Format HH.MM.SS konfiguiriere, ist der Fehler weg. Hilft mir aber nichts, da ich es ja auf einen bestimmten Tag beziehen will.
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

Otto123

Hallo Martin,

das einzige was ich weiß, ist so das Du es in die DOIF Form bringen musst:
https://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung

Aber für einmalige Tage ist das so einfach gar nicht gebaut, das musst Du sicher selbst machen.

Ob DOIF noch in irgendeiner Variante etwas anderes versteht weiß ich nicht, die Entwicklung dort ist sehr dynamisch.  ;D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

dadoc

Das mit den Wochentagen bringt mich in Sachen Datum leider nicht weiter.
Es scheint aber im DOIF zu klappen, wenn ich statt des Zeit-Datums-Strings einen epoch-Timestamp in den Dummies habe. Dafür habe ich einen zweiten Satz Dummies angelegt. Nur: Wie kriege ich mit einem notify die Strings aus dem erstens Satz von Dummies in timestamps konvertiert? Ich habe mal mit epoch() und str2time() probiert, da ich aber kein wirklicher Perl-Experte bin, leider ohne Erfolg.
Habt Ihr Tipps?
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 30 Oktober 2018, 18:04:46
Das mit den Wochentagen bringt mich in Sachen Datum leider nicht weiter.
Es scheint aber im DOIF zu klappen, wenn ich statt des Zeit-Datums-Strings einen epoch-Timestamp in den Dummies habe. Dafür habe ich einen zweiten Satz Dummies angelegt. Nur: Wie kriege ich mit einem notify die Strings aus dem erstens Satz von Dummies in timestamps konvertiert? Ich habe mal mit epoch() und str2time() probiert, da ich aber kein wirklicher Perl-Experte bin, leider ohne Erfolg.
Habt Ihr Tipps?
Grüße
Martin


Du kannst die entsprechenden Informationen per Filter mit etwas Regex-Verständins abgreifen, siehe https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen

([[dummy_start_d:state:"(\d\d:\d\d:\d\d)$"]-[dummy_ende_d:state:"(\d\d:\d\d:\d\d)$"]] and ## Zeitintervall
[?dummy_start_d:state:"^(\d\d).(\d\d).\d\d(\d\d)":"$3-$2-$1"] le $ymd and                   ## Datumsintervall
$ymd le [?dummy_ende_d:state:"^(\d\d).(\d\d).\d\d(\d\d)":"$3-$2-$1"])
(set ...


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

dadoc

Vielen Dank Damian,
ich habe Deinen Code ausprobiert. Ich verstehe das so, dass wenn ich Start- und Endzeitpunkt der Dummies so setze, dass sie den aktuellen Zeitpunkt beinhalten, der set-Event ausgelöst werden sollte. Das geschieht aber bislang nicht. Keine Fehler im Log, weshalb ich schließe, dass das DOIF nicht getriggert wird?
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

Wenn alles richtig läuft, dann müssen die Timer gesetzt sein - das kann man in den Readings des DOIFs ja sehen. Wenn du die gleiche Start- und Endzeit nimmst, dann ist das Zeitintervall gleich Null, das ist nicht sinnvoll, denn Länge Null bedeutet kein Trigger.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dadoc

Guten Morgen,
irgendwie scheint sich das DOIF da noch um einen bzw. mehrere Tage zu verrechnen:
dummy_start_d 29.10.2018 10:15:30
dummy_ende_d 31.10.2018 12:45:28

timer_01_c01 31.10.2018 10:15:30
timer_02_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}

Ich dachte zunächst, es liegt evtl. am Enddatum 31. Aber:
dummy_start_d 25.10.2018 09:00:30
dummy_ende_d 07.11.2018 11:15:28

timer_01_c01 01.11.2018 09:00:30
timer_02_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}


DOIF ist:
([[dummy_start_d:state:"(\d\d:\d\d:\d\d)$"]-[dimmy_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)
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

Ellert


dadoc

Arghh... ja, das kommt davon, wenn man so was auf dem iPad rumtappert.
Die Berechnungsfehler bleiben aber dennoch erhalten:
dummy_start_d 15.10.2018 07:00:30
dummy_ende_d 15.11.2018 09:30:28

timer_01_c01 01.11.2018 07:00:30
timer_02_c01 01.11.2018 09:30:28


dummy_start_d 30.10.2018 06:00:30
dummy_ende_d 31.10.2018 15:15:28

timer_01_c01 01.11.2018 06:00:30
timer_02_c01 31.10.2018 15:15:28
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

betateilchen

Das ist doch ein klassisches Einsatzszenario für das Kalendermodul 57_Calendar.pm
Oder für ein notify mit entsprechend gesetztem Atttribut disabledForIntervals
Oder für dynamisch erzeugt at devices

oder oder oder...

So umständlich wie hier im Thread würde ich eine so simple Aufgabenstellung jedenfalls nicht angehen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Zitat von: dadoc am 31 Oktober 2018, 10:48:34
Arghh... ja, das kommt davon, wenn man so was auf dem iPad rumtappert.
Die Berechnungsfehler bleiben aber dennoch erhalten:
dummy_start_d 15.10.2018 07:00:30
dummy_ende_d 15.11.2018 09:30:28

timer_01_c01 01.11.2018 07:00:30
timer_02_c01 01.11.2018 09:30:28


dummy_start_d 30.10.2018 06:00:30
dummy_ende_d 31.10.2018 15:15:28

timer_01_c01 01.11.2018 06:00:30
timer_02_c01 31.10.2018 15:15:28


Warum Berechnungsfehler? Die Uhrzeit stimmt, das Datum ist der nächste Triggerzeitpunkt und hat mit deinem Datum an dieser Stelle nichts zu tun.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF