Google-Kalender zur Steuerung von Dummies: Unterschied zwischen den Versionen

Aus FHEMWiki
(Formatting of Code)
(Markup verbessert.)
Zeile 2: Zeile 2:
ICal-Format abzufragen.
ICal-Format abzufragen.
Dies und der Wiki-Eintrag [[Wochenende, Feiertage und Schulferien]] hat mich dazu veranlasst, dass ich durch
Dies und der Wiki-Eintrag [[Wochenende, Feiertage und Schulferien]] hat mich dazu veranlasst, dass ich durch
Kalendereinträge im Google-Kalender den Status meiner beiden Dummies "Urlaub" und "Besuch" steuere. Durch diese
Kalendereinträge im Google-Kalender den Status meiner beiden [[dummy|Dummies]] "Urlaub" und "Besuch" steuere. Durch diese
beiden Dummies werden zum Beispiel die Rolläden im Schlafzimmer oder Gästezimmer bei Besuch oder Urlaub anders
beiden Dummies werden zum Beispiel die Rolläden im Schlafzimmer oder Gästezimmer bei Besuch oder Urlaub anders
gesteuert als ohne Besuch oder unter der Woche. Auch meine Zirkulationspumpe soll so bedarfsgerecht gesteuert werden.
gesteuert als ohne Besuch oder unter der Woche. Auch meine Zirkulationspumpe soll so bedarfsgerecht gesteuert werden.
Dass am Wochenende anders gesteuert wird, ist ja mit $we kein Problem.
Dass am Wochenende anders gesteuert wird, ist ja mit $we kein Problem.
Zuerst wird dafür der Kalender definiert:
Zuerst wird dafür der Kalender definiert:
<pre>define Kalender_Christian Calendar ical url <der richtige Kalenderlink> 14400</pre>
 
define Kalender_Christian Calendar ical url <der richtige Kalenderlink> 14400


Den Kalenderlink [https://support.google.com/calendar/answer/37103?hl=de] findet man wie beschrieben heraus.
Den Kalenderlink [https://support.google.com/calendar/answer/37103?hl=de] findet man wie beschrieben heraus.
Dann habe ich meine Dummies definiert:
Dann habe ich meine Dummies definiert:
<pre>define Urlaub_dummy dummy
 
attr Urlaub_dummy room Kalender
define Urlaub_dummy dummy
attr Urlaub_dummy setList ja nein
attr Urlaub_dummy room Kalender
attr Urlaub_dummy webCmd ja:nein
attr Urlaub_dummy setList ja nein
define Gast_dummy dummy
attr Urlaub_dummy webCmd ja:nein
attr Gast_dummy room Kalender
define Gast_dummy dummy
attr Gast_dummy setList ja nein
attr Gast_dummy room Kalender
attr Gast_dummy webCmd ja:nein</pre>
attr Gast_dummy setList ja nein
attr Gast_dummy webCmd ja:nein


Und nun mussten die Notifys definiert werden, um bei entsprechenden Einträgen im Google-Kalender den Status der
Und nun mussten die Notifys definiert werden, um bei entsprechenden Einträgen im Google-Kalender den Status der
Dummies zu setzen.
Dummies zu setzen.
<pre>define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {\
Kalenderstart("$EVENT");;\
}
define Kalender_Christian_Ende notify Kalender_Christian:modeEnded.*googlecom.* {\
Kalenderende("$EVENT");;\
}</pre>


Um nicht für verschiedene Dummies immer einzelne Notifys zu bauen, wird hier bei mir je eine Funktion aus meiner
define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {\
99_MyUtils.pm [[99 myUtils anlegen]] aufgerufen und das Event als Parameter übergeben. Die beiden zugehörigen
Kalenderstart("$EVENT");;\
}
define Kalender_Christian_Ende notify Kalender_Christian:modeEnded.*googlecom.* {\
Kalenderende("$EVENT");;\
}
 
Um nicht für verschiedene Dummies immer einzelne Notifys zu bauen, wird hier bei mir je eine Funktion aus meiner [[99 myUtils anlegen|99_MyUtils.pm]] aufgerufen und das Event als Parameter übergeben. Die beiden zugehörigen
Funktionen für den Start und das Ende des Kalenderevents schauen so aus:
Funktionen für den Start und das Ende des Kalenderevents schauen so aus:
<pre>sub
<source lang="perl">
sub
Kalenderstart ($)
Kalenderstart ($)
{
{
Zeile 38: Zeile 41:
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
if ($Kalendertext =~ /Urlaub/) {
if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_dummy ja");
fhem("set Urlaub_dummy ja");
};
}
if ($Kalendertext =~ /Besuch/) {
if ($Kalendertext =~ /Besuch/) {
fhem("set Gast_dummy ja");
fhem("set Gast_dummy ja");
};
}
};
}
}
}
sub Kalenderende ($) {
sub Kalenderende ($) {
Zeile 53: Zeile 56:
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
if ($Kalendertext =~ /Urlaub/) {
if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_dummy nein");
fhem("set Urlaub_dummy nein");
};
}
if ($Kalendertext =~ /Besuch/) {
if ($Kalendertext =~ /Besuch/) {
fhem("set Gast_dummy nein");
fhem("set Gast_dummy nein");
};
}
};
}
}
}
</pre>
</source>


Zur Erläuterung: Als Ereignis wird z.B. "''modeStarted: 9aas2amo7td47th4sf7mlocl48googlecom''" oder bei 2 gleichzeitigen
Zur Erläuterung: Als Ereignis wird z.B. "''modeStarted: 9aas2amo7td47th4sf7mlocl48googlecom''" oder bei 2 gleichzeitigen
Ereignissen: "''modeStarted: arqpe2a2snu6qn64dt0men7nd0googlecom;j0pjiupfb1sk3m5s64hbeo6880googlecom''"
Ereignissen: "''modeStarted: arqpe2a2snu6qn64dt0men7nd0googlecom;j0pjiupfb1sk3m5s64hbeo6880googlecom''"
übergeben. Da uns aber nur die eindeutige UID interessiert, wird das Ergeinis beim Vorkommen der Zeichen ": Leerzeichen"
übergeben. Da uns aber nur die eindeutige UID interessiert, wird das Ereignis beim Vorkommen der Zeichen ": Leerzeichen"
also nach modeStarted: geteilt (''split(/.*:\s/,$Ereignis'')). Die beiden Teile werden in ein Array (@Ereignisarray) gespeichert.
also nach modeStarted: geteilt (<code>split(/.*:\s/,$Ereignis)</code>). Die beiden Teile werden in ein Array (<code>@Ereignisarray</code>) gespeichert.
Und als 2. Element in dem Array ist nun die uns interessierende UID ($Ereignisarray[1]) vorhanden, mit welcher wir weiter
Und als 2. Element in dem Array ist nun die uns interessierende UID (<code>$Ereignisarray[1]</code>) vorhanden, mit welcher wir weiter
arbeiten. Da auch mit dem Fall mehrerer gleichzeitiger Ereignisse umgegangen werden können soll, müssen wir bei mehreren
arbeiten. Da auch mit dem Fall mehrerer gleichzeitiger Ereignisse umgegangen werden können soll, müssen wir bei mehreren
UID´s diese wieder splitten. Diesmal beim Vorkommen des Semikolons als Trennzeichen (''split(/;/,$Ereignisteil1'')). Auch die
UIDs diese wieder splitten. Diesmal beim Vorkommen des Semikolons als Trennzeichen (<code>split(/;/,$Ereignisteil1)</code>). Auch die
UID´s werden wieder in einem Array gespeichert und dann mittels der foreach-Schleife nacheinander abgearbeitet. Und
UIDs werden wieder in einem Array gespeichert und dann mittels der foreach-Schleife nacheinander abgearbeitet. Und
hierbei wird abhängig von der mittels UID abgerufenen Kalenderbeschreibung (''fhem("get Kalender_Christian summary
hierbei wird abhängig von der mittels UID abgerufenen Kalenderbeschreibung (<code>fhem("get Kalender_Christian summary
$uid''")) ein Vergleich auf die Werte "Besuch" oder "Urlaub" durchgeführt (''if ($Kalendertext =~ /Urlaub/'')) und davon
$uid")</code>) ein Vergleich auf die Werte "Besuch" oder "Urlaub" durchgeführt (<code>if ($Kalendertext =~ /Urlaub/)</code>) und davon
abhängig der Dummy-Status gesetzt.
abhängig der Dummy-Status gesetzt.
Abhängig von diesen Dummies reagiert dann meine Rollosteuerung.
Abhängig von diesen Dummies reagiert dann meine Rollosteuerung.


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Version vom 3. Februar 2016, 21:06 Uhr

Mit dem Kalendermodul Calendar ist es möglich, Ereignisse aus Kalendern im ICal-Format abzufragen. Dies und der Wiki-Eintrag Wochenende, Feiertage und Schulferien hat mich dazu veranlasst, dass ich durch Kalendereinträge im Google-Kalender den Status meiner beiden Dummies "Urlaub" und "Besuch" steuere. Durch diese beiden Dummies werden zum Beispiel die Rolläden im Schlafzimmer oder Gästezimmer bei Besuch oder Urlaub anders gesteuert als ohne Besuch oder unter der Woche. Auch meine Zirkulationspumpe soll so bedarfsgerecht gesteuert werden. Dass am Wochenende anders gesteuert wird, ist ja mit $we kein Problem. Zuerst wird dafür der Kalender definiert:

define Kalender_Christian Calendar ical url <der richtige Kalenderlink> 14400

Den Kalenderlink [1] findet man wie beschrieben heraus. Dann habe ich meine Dummies definiert:

define Urlaub_dummy dummy
attr Urlaub_dummy room Kalender
attr Urlaub_dummy setList ja nein
attr Urlaub_dummy webCmd ja:nein
define Gast_dummy dummy
attr Gast_dummy room Kalender
attr Gast_dummy setList ja nein
attr Gast_dummy webCmd ja:nein

Und nun mussten die Notifys definiert werden, um bei entsprechenden Einträgen im Google-Kalender den Status der Dummies zu setzen.

define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {\
Kalenderstart("$EVENT");;\
}
define Kalender_Christian_Ende notify Kalender_Christian:modeEnded.*googlecom.* {\
Kalenderende("$EVENT");;\
}

Um nicht für verschiedene Dummies immer einzelne Notifys zu bauen, wird hier bei mir je eine Funktion aus meiner 99_MyUtils.pm aufgerufen und das Event als Parameter übergeben. Die beiden zugehörigen Funktionen für den Start und das Ende des Kalenderevents schauen so aus:

sub
Kalenderstart ($)
{
	my ($Ereignis) = @_;
	my @Ereignisarray = split(/.*:\s/,$Ereignis);
	my $Ereignisteil1 = $Ereignisarray[1];
	my @uids = split(/;/,$Ereignisteil1);
	foreach my $uid (@uids) {
		my $Kalendertext = fhem("get Kalender_Christian summary $uid");
		if ($Kalendertext =~ /Urlaub/) {
			fhem("set Urlaub_dummy ja");
		}
		if ($Kalendertext =~ /Besuch/) {
			fhem("set Gast_dummy ja");
		}
	}
}
sub Kalenderende ($) {
	my ($Ereignis) = @_;
	my @Ereignisarray = split(/.*:\s/,$Ereignis);
	my $Ereignisteil1 = $Ereignisarray[1];
	my @uids = split(/;/,$Ereignisteil1);
	foreach my $uid (@uids) {
		my $Kalendertext = fhem("get Kalender_Christian summary $uid");
		if ($Kalendertext =~ /Urlaub/) {
			fhem("set Urlaub_dummy nein");
		}
		if ($Kalendertext =~ /Besuch/) {
			fhem("set Gast_dummy nein");
		}
	}
}

Zur Erläuterung: Als Ereignis wird z.B. "modeStarted: 9aas2amo7td47th4sf7mlocl48googlecom" oder bei 2 gleichzeitigen Ereignissen: "modeStarted: arqpe2a2snu6qn64dt0men7nd0googlecom;j0pjiupfb1sk3m5s64hbeo6880googlecom" übergeben. Da uns aber nur die eindeutige UID interessiert, wird das Ereignis beim Vorkommen der Zeichen ": Leerzeichen" also nach modeStarted: geteilt (split(/.*:\s/,$Ereignis)). Die beiden Teile werden in ein Array (@Ereignisarray) gespeichert. Und als 2. Element in dem Array ist nun die uns interessierende UID ($Ereignisarray[1]) vorhanden, mit welcher wir weiter arbeiten. Da auch mit dem Fall mehrerer gleichzeitiger Ereignisse umgegangen werden können soll, müssen wir bei mehreren UIDs diese wieder splitten. Diesmal beim Vorkommen des Semikolons als Trennzeichen (split(/;/,$Ereignisteil1)). Auch die UIDs werden wieder in einem Array gespeichert und dann mittels der foreach-Schleife nacheinander abgearbeitet. Und hierbei wird abhängig von der mittels UID abgerufenen Kalenderbeschreibung (fhem("get Kalender_Christian summary $uid")) ein Vergleich auf die Werte "Besuch" oder "Urlaub" durchgeführt (if ($Kalendertext =~ /Urlaub/)) und davon abhängig der Dummy-Status gesetzt. Abhängig von diesen Dummies reagiert dann meine Rollosteuerung.