[Gelöst] DOIF, CALENDAR und ROOMMATE: Wecker-Offset mit Kalender

Begonnen von Z-Rick, 20 Oktober 2018, 10:14:39

Vorheriges Thema - Nächstes Thema

Z-Rick

Guten Morgen,

nachdem ich gestern den halben Tag und auch heute morgen am Verzweifeln bin, nun die Frage an das Forum:

Ich möchte gerne mehr Automatismen in meiner Wohnung abhängig von meinem Kalender schalten.

Zukünftig soll beispielsweise auch die Heizung vor dem Aufstehen und vor dem nach Hause kommen aufheizen - dazu komme ich aber ein anderes Mal.  ;D

Folgende Idee und entsprechendes Problem:

Das CALENDAR-Modul ist mit meinem Arbeitskalender verbunden und liefert entsprechende Werte.
Nun soll ein DOIF erkennen, wann ich am nächsten Tag arbeiten muss und den entsprechenden Wert in den Wecker im ROOMATES-Modul eintragen und mir eine Push-Nachricht schicken, dass der Wecker für den nächsten Tag gestellt wurde. Da ich in meinem Kalender nur die tatsächlichen Arbeitszeiten eintrage, muss ich einen entsprechenden OFFSET haben, der den Wecker eine Stunde VOR meinem Arbeitsbeginn anschaltet.

Mein bisheriger Versuch sah so aus:


([CA.ArbeitWerte:c-tomorrow] != 0 and [CA.ArbeitWerte:t_002_btime] ne 0) (set rr_Benutzer_wakeuptimer1 nextRun {([CA.ArbeitWerte:t_002_btime]-[3600])})(set Push msg 'Wecker' 'Wecker für [CA.ArbeitWerte:t_002_daysleftLong] [rr_Cedric_wakeuptimer1:nextRun] Uhr gestellt.') DOELSEIF ([CA.ArbeitWerte:c-tomorrow] == 0) (set rr_Benutzer_wakeuptimer1 nextRun OFF)


Dies führte jedoch dazu, dass "[CA.ArbeitWerte:t_002_btime]-[3600]" (habe alternativ auch mit "[01:00]" gearbeitet) im Weckerstart gesetzt wurde. Ich habe es auch schon hinbekommen, dass die Zeit richtig eingesetzt wurde - da aber nur ohne den Offset. Sobald dieser ins Spiel kommt, erhalte ich Fehler.

Zwei Fehlerideen habe ich dafür:
1. FHEM interpretiert den Kalender-Wert nicht als Timespec, sondern als ganz normalen String und kann deshalb nicht damit rechnen.
2. FHEM mag im Ausführungsteil nicht mit diesen Variablen rechnen - generell geht das ja.

Meine Frage lautet nun, wie bekomme ich das hin? ;-)

Detaillierter:
-Sollte ich den Wert des Kalenders zunächst in ein Dummy (Beispiel: CA.Arbeitsbeginn) schreiben?
-Muss ich mittels Perl den String erst als Timespec aufarbeiten (habe an anderer Stelle bereits gelesen, dass FHEM das eigentlich automatisch machen soll).
-Denke ich vielleicht zu kompliziert?

OT: Generell ist mir aufgefallen, dass mit den Kalendern nur sehr wenig gearbeitet wird. Das kann daran liegen, dass es tatsächlich kaum genutzt wird oder es eine viel elegantere Lösung für sowas gibt, die ich nicht kenne. Wichtig sind für mich die Werte, wann ich Anfange zu arbeiten und wann ich nach Hause kommen soll. Von diesen zwei Werten aus ließen sich dann sehr schöne Automatismen erstellen - Anwesenheit, Heizungsvorlauf, Licht etc.

Ich danke euch für die Hilfe.

Liebe Grüße
Z-Rick

Ellert

Du könntest die Ausgabeformatierung oder DOIF_Readings nutzen um die Angaben in HH:MM:SS in Sekunden umzu wandeln.

Angenommen in [CA.ArbeitWerte:t_002_btime] steht eine Uhrzeit HH:MM, dann berechnest Du die Sekunden so:

{([CA.ArbeitWerte:t_002_btime:"(\d\d):(\d\d)":$1*60*60+$2*60]-3600)}

https://commandref.fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen

Per

Zitat von: Z-Rick am 20 Oktober 2018, 10:14:39[3600]" (habe alternativ auch mit "[01:00]" gearbeitet)
ist aber nicht -1 Stunde, sondern 1 Uhr. Die eckigen Klammern machen den Unterschied!

Damian

Zeitberechnungen funktionieren insb. beim Setzen der eigenen DOIF-Timer, aber nicht ohne weiteres im Ausführungsteil.
z. B.
DOIF ([([CA.ArbeitWerte:t_002_btime]+3600)]) (...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

abc2006

Zitat von: Z-Rick am 20 Oktober 2018, 10:14:39
OT: Generell ist mir aufgefallen, dass mit den Kalendern nur sehr wenig gearbeitet wird. Das kann daran liegen, dass es tatsächlich kaum genutzt wird oder es eine viel elegantere Lösung für sowas gibt, die ich nicht kenne. Wichtig sind für mich die Werte, wann ich Anfange zu arbeiten und wann ich nach Hause kommen soll. Von diesen zwei Werten aus ließen sich dann sehr schöne Automatismen erstellen - Anwesenheit, Heizungsvorlauf, Licht etc.

Hi,
ich habe ähnliche Probleme wie du - in meinem Schichtplan sind auch nur die Arbeitszeiten eingetragen.
Wenn man die Offsetterei nach vorne einfacher nutzen könnte, wäre ich wahrscheinlich auch schon weiter.
Bisher (und das sind schon ein paar Jahre) schiebe ich den Aufwand eher vor mir her ...

Grüße,
Stephan  (der die Erkenntnisse aus diesem Thread gerne nutzt ;)
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Ich würde mir die jeweiligen Zeiten z. B. aus einem Kalender zunächst in Readings ablegen. Die könnten im DOIF, welches den Zeitplan ausführen soll, liegen. Dann würde ich die jeweiligen Offsets entweder fest oder ebenfalls über ein Reading, falls variabel, vornehmen.

Beispiel:

aus Kalender Zeit 06:00 -> in Reading Zeitplan:morgens


Zeitplan DOIF ([([$SELF:morgens]+3600)])(...

oder über ein Reading z. B. offset_morgens, wenn der Offset variabel sein soll

DOIF ([([$SELF:morgens]+[$SELF:offset_morgens])])(...

so kann man die jeweiligen Readings von außen z. B. mit einem separaten DOIF aktualisieren und schon wird die Triggerzeit im Zeitplan-DOIF vom Modul selbst neu berechnet  und unmittelbar neu gesetzt.




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

abc2006

Zitat von: Damian am 24 Oktober 2018, 12:47:56
Beispiel:

aus Kalender Zeit 06:00 -> in Reading Zeitplan:morgens

Zeitplan DOIF ([([$SELF:morgens]+3600)])(...

Oben ging es aber um Zeiten, die *vor* dem Event liegen...-> Okay, habs getestet, geht auch mit "-3600".

Das Problem (nachdem ich mich grade nochmal damit beschäftigt habe,) ist aber ein anderes (zumindest bei mir):
Der Kalender triggert das Event erst zum Beginn (e.g. um 06:00). Da muss ich aber schon auf Arbeit sein. Also muss ich *vorher* den Wecker auf 05:00 stellen.... dazu hab ich aber kein Event...

@Z-Rick, hast du dieses Problem bei dir schon gelöst? (Wenn ja, wie?) Hab deinen Beitrag jetzt dreimal gelesen, bin mir aber nicht sicher, ob du eigentlich genau an der gleichen Stelle hängst ...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Zitat von: abc2006 am 24 Oktober 2018, 18:15:28
Der Kalender triggert das Event erst zum Beginn (e.g. um 06:00). Da muss ich aber schon auf Arbeit sein. Also muss ich *vorher* den Wecker auf 05:00 stellen.... dazu hab ich aber kein Event...

Na ja, egal wie du es löst, du kannst nur eine Information nutzen, wenn sie da ist, wenn nichts neues da ist, dann muss man solange das alte nehmen. Warum kann dein Kalender nicht "rechtzeitig" die Informationen liefern?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

abc2006

Zitat von: Damian am 24 Oktober 2018, 18:21:41
Warum kann dein Kalender nicht "rechtzeitig" die Informationen liefern?

Tjaaa... vermutlich, weil ich nicht in der Lage bin, es ihm beizubringen ...
Wenn ich es schaffen würde, dem Kalender Beizubringen, dass er beim Termin "Frühschicht", der um 06:00 startet,  die Events
"Wecker" (05:00), "Kaffee" (05:10) und "Musik" (05:20) erzeugt, hätt ich ja schon alles, was ich will (und der TO möglicherweise auch)...
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Zitat von: abc2006 am 24 Oktober 2018, 18:46:09
Tjaaa... vermutlich, weil ich nicht in der Lage bin, es ihm beizubringen ...
Wenn ich es schaffen würde, dem Kalender Beizubringen, dass er beim Termin "Frühschicht", der um 06:00 startet,  die Events
"Wecker" (05:00), "Kaffee" (05:10) und "Musik" (05:20) erzeugt, hätt ich ja schon alles, was ich will (und der TO möglicherweise auch)...

?

Mit ical aktualisiere ich meine Einträge stündlich und weiß Wochen im voraus was ansteht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

abc2006

Also das ist mir jetzt ein bisschen unangenehm, aber ... Ich weiss nicht, wie.
Ich hatte mich damals mit den Calendar-Modul beschäftigt, allerdings stehen im Wiki dazu nur Beispiele, wie man eben dummies schaltet, wenn der Termin beginnt.. Aber sowohl damals als auch heute ergibt sich mir keine Idee, wie ich das verarbeiten soll, dass ich bereits vorher weiss, wann ein Termin beginnt.. Gib mir doch bitte mal einen Tipp, und im Gegenzug würd ichs ins Wiki einpflegen, sobald ich was zum laufen gekriegt hab?

Grüße,
Stephan 

FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Zitat von: abc2006 am 24 Oktober 2018, 19:08:27
Also das ist mir jetzt ein bisschen unangenehm, aber ... Ich weiss nicht, wie.
Ich hatte mich damals mit den Calendar-Modul beschäftigt, allerdings stehen im Wiki dazu nur Beispiele, wie man eben dummies schaltet, wenn der Termin beginnt.. Aber sowohl damals als auch heute ergibt sich mir keine Idee, wie ich das verarbeiten soll, dass ich bereits vorher weiss, wann ein Termin beginnt.. Gib mir doch bitte mal einen Tipp, und im Gegenzug würd ichs ins Wiki einpflegen, sobald ich was zum laufen gekriegt hab?

Grüße,
Stephan

Aus meinem Livesystem speziell für den Abfall-Kalender:

defmod cal Calendar ical url https://calendar.google.com/calendar/ical/damian.../basic.ics


Die Auswertung der kryptischen Einträge aus ical mache ich dann über:

defmod abfall ABFALL cal

Dann werden die Einträge des Kalenders im Device "abfall" in Readings abgelegt, auf die man zugreifen kann.

Mehr mache ich mit dem Kalender z. Zt. nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: abc2006 am 24 Oktober 2018, 19:08:27
Also das ist mir jetzt ein bisschen unangenehm, aber ... Ich weiss nicht, wie.
Ich hatte mich damals mit den Calendar-Modul beschäftigt, allerdings stehen im Wiki dazu nur Beispiele, wie man eben dummies schaltet, wenn der Termin beginnt.. Aber sowohl damals als auch heute ergibt sich mir keine Idee, wie ich das verarbeiten soll, dass ich bereits vorher weiss, wann ein Termin beginnt.. Gib mir doch bitte mal einen Tipp, und im Gegenzug würd ichs ins Wiki einpflegen, sobald ich was zum laufen gekriegt hab?

Grüße,
Stephan

Du könntest täglich nachts zu einem bestimmten Zeitpunkt, der vor dem frühesten zu berechnenden Zeitpunkt liegt, per get-Befehl die Startzeit des aktuell anstehenden Termins mit dem Betreff Frühschicht aus dem Calendargerät auslesen und auf diese Zeit die verschiedenen Offsets anwenden. Die so berechneten Zeiten schreibst Du in entsprechende Readings im DOIF, die dann als indirekte Zeitangabe im DOIF zum Triggern genutzt werden.

Z-Rick

Hallo,

nach langer Zeit ein Update zu meinem Problem, welches mich tatsächlich einige Monate begleitet hat.

Erstmal danke für die Rückmeldungen.

Ich habe zunächst das "datestyle" im Kalender auf "ISO8601" gesetzt, damit der Kalender Readings mit Datum ausgibt. Mithilfe des Wiki-Eintrages "Zeitangaben, rechnen mit" habe ich diese dann in drei User-Reading gepackt.

Um den Wecker nicht an freien oder Urlaubstagen zu stellen, habe ich dann noch ein If-Else eingebaut:

ArbeitsbeginnHeute { if( (ReadingsVal('CA.ArbeitWerte','today_001_summary','none') =~ m/Frei/ or ReadingsVal('CA.ArbeitWerte','today_001_summary','none') =~ m/Urlaub/ or ReadingsVal('CA.ArbeitWerte','today_001_summary','none') =~ m/Ausgleich/)) { sprintf("Frei")} else { ReadingsVal('CA.ArbeitWerte','today_001_btime','none') =~ /([0-2][0-9]:[0-5][0-9])/; $1 }},

ArbeitsbeginnHeuteMinusOffset { if( (ReadingsVal('CA.ArbeitWerte','today_001_bdatetimeiso',0) == 0 or ReadingsVal('CA.ArbeitWerte','today_001_summary','none') =~ m/Frei/ or ReadingsVal('CA.ArbeitWerte','today_001_summary','none') =~ m/Urlaub/ or ReadingsVal('CA.ArbeitWerte','today_001_summary','none') =~ m/Ausgleich/)) { sprintf("Frei")} else {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsVal('CA.ArbeitWerte','today_001_bdatetimeiso',0))-2*60*60))}},

ArbeitsbeginnMorgenMinusOffset { if( (ReadingsVal('CA.ArbeitWerte','tomorrow_001_bdatetimeiso',0) == 0)) { sprintf("Frei")} else {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsVal('CA.ArbeitWerte','tomorrow_001_bdatetimeiso',0))-((split(":",ReadingsVal("rr_ROOMMATE_Arbeit","offset",0)))[0]*3600 + (split(":",ReadingsVal("rr_ROOMMATE_Arbeit","offset",0)))[1]*60)))}}


Diese Readings verarbeite ich in Kombination mit einem Dummy-Schalter, der die Variable "offset" setzt.

Vielleicht hilft meine Lösung ja jemandem weiter.

Liebe Grüße
Z-Rick