FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kossmann am 23 Oktober 2019, 10:03:23

Titel: Rollladensteuerung mittels Calender, WeekdayTimer und Feiertag
Beitrag von: kossmann am 23 Oktober 2019, 10:03:23
Hallo zusammen,

momentan sieht meine Rollladensteuerung im Schlafzimmer wie folgt aus:

define NRW_Feiertag holiday
[...]

define Job_Schlafzimmer_Rollo_hoch WeekdayTimer Schlafzimmer_Rollo 1234|07:00|oben 5|08:00|oben (!$we)
[...]


Dies ist die starre Regel, Montag bis Donnerstag früher aufzustehen, Freitag etwas später (HomeOffice) und an Feiertagen und am Wochenende das Rollo gar nicht automatisch hoch fahren zu lassen. Den HomeOffice-Tag würde ich nun gerne etwas flexibler gestalten und auch eine Urlaubs-Funktion einführen - dies gerne mittels Calendar-Funktion: Montag bis Freitag würde ich gerne den Kalender auf Ganztagestermine prüfen:

get Kalender events limit:when=today format:custom="$D $S"

Beim Vorkommen von "24h Urlaub", "24h Gleittag", einem Feiertag oder am Wochenende wird das Rollo gar nicht hoch gefahren, bei "24h HomeOffice" erst um 8 Uhr, ansonsten um 7 Uhr.

Wie realisiert man dies am besten/einfachsten? Über x verschiedene Jobs und noch mehr dummy-Definitionen würde ich das vermutlich irgendwie hin bekommen, aber das funktioniert doch sicher auch in 1 bis maximal 2 define-Blöcken, oder?
Titel: Antw:Rollladensteuerung mittels Calender, WeekdayTimer und Feiertag
Beitrag von: Beta-User am 23 Oktober 2019, 10:35:28
Moin.

Was die freien Tage angeht, wäre die Frage, ob die auch sonst wie $we zu behandeln sein sollen (nicht nur für die Rollläden). Wenn ja, könntest du den Calendar auswerten und daraus eine .holiday-file machen (und als holiday einbinden, auch im Rahmen von holida2we, code wäre hier  (https://forum.fhem.de/index.php/topic,85759.msg885883.html#msg885883)zu finden).

Wenn es um das Verzögern geht, wäre wohl eher eine delayedExecutionCond festzulegen, wobei ich dazu neigen würde, den "homeoffice"-Tag auch auf dieselbe Weise als holiday-Wert (oder in einem (rechtzeitig) via setreading generierten Reading des WDT) zwischenzuspeichern (aber ohne holiday2we-Einbindung).
Titel: Antw:Rollladensteuerung mittels Calender, WeekdayTimer und Feiertag
Beitrag von: Otto123 am 23 Oktober 2019, 13:05:01
Hi,

ich habe das nicht fertig, aber meine Idee: Ein userReadings im Kalender selbst, das fragst Du einfach in deiner Rollo Steuerung ab:
Mit
Zitatfield(summary)=~"(?i)24h"
kannst Du den Sondertermin filtern und ihn einfach als Reading übernehmen.
So lese ich an andere Stelle einfach den Inhalt eines Termines aus (userReadings):
Termin {fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1)}

Du kannst auch ein notify für die Rollos machen und den Kalender direkt zum steuern nehmen.
der kann nämlich separate Alarmzeiten. Beispiel 8 Stunden nach dem Termin - bei einem Ganztagestermin also 8:00 Uhr:
onCreateEvent { $e->{alarm}= $e->{start}+28800 if($e->{summary} =~ m/24h/i)}
Notify welches auf Alarm triggert:
defmod n_TestKalender notify TestKalender:changed:.*alarm {}

Wenn das komplexer wird rufst Du im notify eine sub in 99_myUtils auf.
Meine Notiz  (https://heinz-otto.blogspot.com/2019/01/kalender-in-fhem-auf-bestimmte-termine.html)zu dem Thema.

Gruß Otto
Titel: Antw:Rollladensteuerung mittels Calender, WeekdayTimer und Feiertag
Beitrag von: kossmann am 23 Oktober 2019, 17:03:24
Ich glaube, ich fange vorerst wie folgt an...

define Tagestyp dummy
  attr Tagestyp setList Arbeitstag Feiertag Gleittag HomeOffice Urlaubstag Wochenende

define Job_Tagestyp at *04:30:00 { \
  fhem("set Tagestyp Arbeitstag");; \
  my $appointment = fhem("get Kalender events limit:when=today format:custom=\"\$D \$S\"");; \
  if ($appointment =~ /24h Gleittag/) { \
    fhem("set Tagestyp Gleittag");; \
  } \
  if ($appointment =~ /24h Home[oO]ffice/) { \
    fhem("set Tagestyp HomeOffice");; \
  } \
  if ($appointment =~ /24h Urlaub/) { \
    fhem("set Tagestyp Urlaubstag");; \
  } \
  if ($we) { \
    fhem("set Tagestyp Wochenende");; \
  } \
}


Das kann man sicher noch etwas verfeinern und optimieren, aber für den Zweck sollte es vorerst hilfreich sein. Mal gucken, wie weit ich komme...
Titel: Antw:Rollladensteuerung mittels Calender, WeekdayTimer und Feiertag
Beitrag von: Beta-User am 23 Oktober 2019, 17:11:51
Na ja, wenn du $we iVm. WeekdayTimer nutzen willst, solltest du aber beachten, dass die Zeiten in der Regel nur einmal am Tag ermittelt werden, nämlich 5 Sekunden nach Mitternacht. Wenn du also danach Änderungen vornimmst (danach klingt das hier allerdings nicht, da außerhalb von $we), bekommt der wdt das nicht automatisch mit (kann aber zur Neuberechnung überredet werden).
Die Readings der holiday-Devices werden übrigens davor aktualisiert.
Titel: Antw:Rollladensteuerung mittels Calender, WeekdayTimer und Feiertag
Beitrag von: Otto123 am 23 Oktober 2019, 17:14:29
Auch ein Anfang  ;D
Tipp: schreib doch den noch ab:
if ($appointment =~ /24h Gleittag/) -> if ($appointment =~ m/24h Gleittag/i)
da funktioniert auch GLEITTAG :)
und den Home[oO]ffice brauchst Du nicht :)

Gruß Otto
Titel: Antw:Rollladensteuerung mittels Calender, WeekdayTimer und Feiertag
Beitrag von: kossmann am 23 Oktober 2019, 17:33:17
Ja, Danke euch.

Um mehrtägige Termine abzufangen und "Urlaub buchen" als Einzeltermin tagsüber zu ignorieren ist nun ein if ($appointment =~ m/^Urlaub$/i) daraus geworden.