[Tipp] 57_CALENDAR.pm - events mit deviceNames nutzen

Begonnen von betateilchen, 18 Mai 2018, 12:23:33

Vorheriges Thema - Nächstes Thema

betateilchen

Im Rahmen einer anderen Diskussion zum Thema CALENDAR kam neulich folgende Frage auf.

Zitat von: amenomade am 10 Mai 2018, 13:23:14
Trotzdem bin ich interessiert, wie man Events mit Devicenamen nutzt.

Auch wenn die Frage schon ein paarmal im Forum beantwortet wurde, werde ich trotzdem noch einmal darauf eingehen, insbesondere, weil sich ja nun die Syntax im Modul selbst geändert hat und man die bisher verwendeten Abfragen ändern muss.




Beispiel 1: Ein- und Ausschalten eines Schaltaktors per Kalendereintrag

In meinem Kalender steht ein Eintrag mit dem Betreff "testAktor", das ist der Name des Aktors in meiner FHEM Installation, der geschaltet werden soll. Siehe Screenshot. Die Schaltzeit ist für das Beispiel hier mit einer Minute angeben (12:05 an, 12:06 aus)

Beobachtet man den Event-Monitor, sieht man folgendes:


2018-05-18 12:05:00 Calendar oc_test changed: 499E9A317DBA4ED7AB23F5271B82024C start
2018-05-18 12:05:00 Calendar oc_test start: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:05:00 Calendar oc_test modeUpcoming:
2018-05-18 12:05:00 Calendar oc_test modeAlarmOrStart: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:05:00 Calendar oc_test modeChanged: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:05:00 Calendar oc_test modeStart: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:05:00 Calendar oc_test modeStarted: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:05:00 Calendar oc_test triggered
2018-05-18 12:05:00 Calendar oc_test nextWakeup: 2018-05-18 12:05:10
2018-05-18 12:05:10 Calendar oc_test retrieved
2018-05-18 12:05:10 Calendar oc_test parsed
2018-05-18 12:05:10 Calendar oc_test calname: fhem_test
2018-05-18 12:05:10 Calendar oc_test lastUpdate: 2018-05-18 12:05:10
2018-05-18 12:05:10 Calendar oc_test nextUpdate: 2018-05-18 12:06:10
2018-05-18 12:05:10 Calendar oc_test modeChanged:
2018-05-18 12:05:10 Calendar oc_test modeStarted:
2018-05-18 12:05:10 Calendar oc_test triggered
2018-05-18 12:05:10 Calendar oc_test nextWakeup: 2018-05-18 12:06:00

2018-05-18 12:06:00 Calendar oc_test changed: 499E9A317DBA4ED7AB23F5271B82024C end
2018-05-18 12:06:00 Calendar oc_test end: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:06:00 Calendar oc_test modeAlarmOrStart:
2018-05-18 12:06:00 Calendar oc_test modeChanged: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:06:00 Calendar oc_test modeStart:
2018-05-18 12:06:00 Calendar oc_test modeEnd: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:06:00 Calendar oc_test modeEnded: 499E9A317DBA4ED7AB23F5271B82024C
2018-05-18 12:06:00 Calendar oc_test triggered
2018-05-18 12:06:00 Calendar oc_test nextWakeup: 2018-05-18 12:06:10


Für die Auswertung per notify sind davon nur zwei Zeilen relevant:


2018-05-18 12:05:00 Calendar oc_test changed: 499E9A317DBA4ED7AB23F5271B82024C start

2018-05-18 12:06:00 Calendar oc_test changed: 499E9A317DBA4ED7AB23F5271B82024C end


Für die Auswertung beider Zustandwechsel gibt es bei mir ein notify:


define n_oc_test notify oc_test:changed:.* { oc_Schalter($EVTPART1,$EVTPART2) }


Beim Auftreten eines events "changed" wird also eine Funktion in meiner 99_myUtils.pm aufgerufen.
Dieser Funktion werden die beiden Paramter "uid" und "start/end" aus dem event übergeben.

Mit diesen Parametern wird aus dem Kalender der Name des Aktors gelesen, der in der "summary" des Kalendereintrages steht.
Anschließend wird der fhem-Befehl zum Ein-/Ausschalten ausgeführt.



sub oc_Schalter ($$) {
   my ($uid,$cmd) = @_;
   $cmd = 'on'  if ($cmd eq 'start');
   $cmd = 'off' if ($cmd eq 'end');
   my $actor = fhem('get oc_Schalter events format:custom="$S" filter:uid=="'.$uid.'" limit:count=1',1);
   fhem("set $actor $cmd",1);
   return;
}






Beispiel 2: Heizung per Kalendereintrag steuern

Bei mir wird die Heizung über Homematic Wandregler gesteuert. Der Einfachheit halber, sind dort in den Registern dayTemp (21.5°) und nightTemp (17.0°) die gewünschten Solltemperaturen hinterlegt. Die eigentliche Aufgabe ist also nur, zwischen den beiden Modi "Day" und "Night" umzuschalten.

Das Vorgehen ist im Prinzip identisch zum Schalten eines Aktors, ich verwende allerdings für die Heizungssteuerung einen eigenen Kalender.


  • Im Betreff des Kalendereintrags steht der Name des Climate-Channels des Wandreglers.
  • das notify ist identisch zum Beispiel mit dem Schaltaktor, es wird eine Funktion in der 99_myUtils.pm gerufen

Die Funktion in der 99_myUtils.pm die aus dem notify gerufen wird sieht so aus:



sub oc_Heizung ($$) {
   my ($uid,$cmd) = @_;
   $cmd = 'day'   if ($cmd eq 'start');
   $cmd = 'night' if ($cmd eq 'end');
   my $actor = fhem('get oc_Heizung events format:custom="$S" filter:uid=="'.$uid.'" limit:count=1',1);
   fhem("set $actor controlMode $cmd",1);
   return;
}



Der set-Befehl muss natürlich dem verwendeten Heizungsregler angepasst werden, aber ich hoffe, das Prinzip ist klar.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!