<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xenos1984</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xenos1984"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Xenos1984"/>
	<updated>2026-04-27T14:02:21Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37245</id>
		<title>UBus</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37245"/>
		<updated>2022-02-19T14:51:16Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: /* UBUS_CALL - Modul zur Ausführung von uBus-Anfragen */ system added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Die Module UBUS_CLIENT und UBUS_CALL dienen der Kommunikation mit Geräten, die über eine [http://openwrt.org/docs/techref/ubus uBus-Schnittstelle] verfügen. Mittels UBUS_CLIENT wird die Verbindung zu einem solchen Gerät hergestellt. Über UBUS_CALL wird ein Funktionsaufruf (bzw. eine Reihe von Funktionsaufrufen) an das Gerät gesendet und die Antwort in Readings ausgewertet.&lt;br /&gt;
&lt;br /&gt;
== UBUS_CLIENT - Modul zur Kommunikation mit uBus ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbinden von Geräten, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CLIENT&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CLIENT.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Je nach Gerät kann die uBus-Schnittstelle über Websocket oder über HTTP freigegeben sein.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über Websocket ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT ws://192.168.1.1&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über HTTP ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT http://192.168.1.1/ubus&lt;br /&gt;
&lt;br /&gt;
== UBUS_CALL - Modul zur Ausführung von uBus-Anfragen ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden von &amp;quot;call&amp;quot; Anfragen an Geräte, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CALL&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CALL.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele basieren auf der [http://openwrt.org/docs/guide-developer/ubus OpenWRT Dokumentation]. &#039;&#039;&#039;Je nach Gerät können andere Funktionsaufrufe implementiert sein.&#039;&#039;&#039; Welche dies sind, zeigen die Readings des UBUS_CLIENT.&lt;br /&gt;
&lt;br /&gt;
=== network ===&lt;br /&gt;
&lt;br /&gt;
Siehe [http://openwrt.org/docs/guide-developer/ubus/network network] Referenz.&lt;br /&gt;
&lt;br /&gt;
==== network.device status ====&lt;br /&gt;
&lt;br /&gt;
Mittels&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status&lt;br /&gt;
&lt;br /&gt;
wird der Status aller vorhandenen Netzwerk-Schnittstellen zurückgegeben. Soll nur eine Schnittstelle abgefragt werden, kann der Parameter &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; übergeben werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name=eth0&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Namen angegeben werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name=eth0,eth1&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird für jede Schnittstelle eine Abfrage durchgeführt. Alternativ kann eine Perl-Funktion benutzt werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name={GetNetworkNames()}&lt;br /&gt;
&lt;br /&gt;
Hierfür sollte die Funktion (im Beispiel &amp;lt;code&amp;gt;GetNetworkNames()&amp;lt;/code&amp;gt;) z.B. in der 99_myUtils.pm definiert sein.&lt;br /&gt;
&lt;br /&gt;
Wenn das angesprochene Gerät eine Reihe von *_statistics_* Readings zurückgibt, die angeben, wie viele Bytes über eine Schnittstelle übertragen wurde etc., kann es hilfreich sein, dies in eine Anzahl Bytes seit dem letzten Aufruf umzurechnen. Das kann mit einer eigenen Funktion im Attribut &amp;lt;code&amp;gt;readings&amp;lt;/code&amp;gt; erreicht werden:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; readings {\&lt;br /&gt;
   my $r = FHEM::UBUS_CALL::DefaultReadings($RAW);;\&lt;br /&gt;
   foreach my $k (grep(/_statistics_/, keys %{$r}))\&lt;br /&gt;
   {\&lt;br /&gt;
     my $kt = $k . &#039;_total&#039;;;\&lt;br /&gt;
     my $kr = $k . &#039;_rate&#039;;;\&lt;br /&gt;
     my $d = $r-&amp;gt;{$k} - ReadingsNum($NAME, $kt, 0);;\&lt;br /&gt;
     my $t = ReadingsAge($NAME, $kt, 1);;\&lt;br /&gt;
     $r-&amp;gt;{$kt} = $r-&amp;gt;{$k};;\&lt;br /&gt;
     $r-&amp;gt;{$kr} = $d / $t;;\&lt;br /&gt;
     delete $r-&amp;gt;{$k};;\&lt;br /&gt;
   }\&lt;br /&gt;
   $r\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hier werden zuerst mit &amp;lt;code&amp;gt;FHEM::UBUS_CALL::DefaultReadings($RAW)&amp;lt;/code&amp;gt; die Standard-Readings erzeugt. Jedes Reading, das _statistics_ enthält, wird dann durch zwei andere Readings ersetzt, eines für den Gesamtwert, eines für die Änderung seit dem letzten Aufruf.&lt;br /&gt;
&lt;br /&gt;
==== network.interface.&amp;lt;name&amp;gt; status ====&lt;br /&gt;
&lt;br /&gt;
Um z.B. den Status des Interface &amp;lt;code&amp;gt;lan&amp;lt;/code&amp;gt; abzufragen, dient der Aufruf&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.interface.lan status&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Interfaces abgefragt werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.interface.lan,network.interface.wan status&lt;br /&gt;
&lt;br /&gt;
Damit bei dieser Form der Abfrage die Readings von den verschiedenen Interfaces nicht gegenseitig überschrieben werden, bietet es sich an, den Namen des Interface als Präfix zu übergeben. Das Attribut &amp;lt;code&amp;gt;readings&amp;lt;/code&amp;gt; sähe dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; readings {\&lt;br /&gt;
   my $p = $MODULE =~ s/network.interface.//r;;\&lt;br /&gt;
   return FHEM::UBUS_CALL::DefaultReadings($RAW, $p . &#039;_&#039;);;\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== system ===&lt;br /&gt;
&lt;br /&gt;
Siehe [http://openwrt.org/docs/guide-developer/ubus/system system] Referenz.&lt;br /&gt;
&lt;br /&gt;
==== system board ====&lt;br /&gt;
&lt;br /&gt;
Informationen zur verwendeten Hardware können über&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL system board&lt;br /&gt;
&lt;br /&gt;
abgefragt werden. Da sich die Hardware im laufenden Betrieb üblicherweise nicht ändert, kann man außerdem&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; interval 0&lt;br /&gt;
&lt;br /&gt;
setzen, damit die Informationen nur beim Neustart oder &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
==== system info ====&lt;br /&gt;
&lt;br /&gt;
Liefert allgemeine Systeminformationen, z.B. aktuelle Speichernutzung:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL system info&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37244</id>
		<title>UBus</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37244"/>
		<updated>2022-02-19T14:37:04Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: /* network */ network.interface.&amp;lt;name&amp;gt; status&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Die Module UBUS_CLIENT und UBUS_CALL dienen der Kommunikation mit Geräten, die über eine [http://openwrt.org/docs/techref/ubus uBus-Schnittstelle] verfügen. Mittels UBUS_CLIENT wird die Verbindung zu einem solchen Gerät hergestellt. Über UBUS_CALL wird ein Funktionsaufruf (bzw. eine Reihe von Funktionsaufrufen) an das Gerät gesendet und die Antwort in Readings ausgewertet.&lt;br /&gt;
&lt;br /&gt;
== UBUS_CLIENT - Modul zur Kommunikation mit uBus ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbinden von Geräten, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CLIENT&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CLIENT.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Je nach Gerät kann die uBus-Schnittstelle über Websocket oder über HTTP freigegeben sein.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über Websocket ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT ws://192.168.1.1&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über HTTP ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT http://192.168.1.1/ubus&lt;br /&gt;
&lt;br /&gt;
== UBUS_CALL - Modul zur Ausführung von uBus-Anfragen ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden von &amp;quot;call&amp;quot; Anfragen an Geräte, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CALL&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CALL.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele basieren auf der [http://openwrt.org/docs/guide-developer/ubus OpenWRT Dokumentation]. &#039;&#039;&#039;Je nach Gerät können andere Funktionsaufrufe implementiert sein.&#039;&#039;&#039; Welche dies sind, zeigen die Readings des UBUS_CLIENT.&lt;br /&gt;
&lt;br /&gt;
=== network ===&lt;br /&gt;
&lt;br /&gt;
Siehe [http://openwrt.org/docs/guide-developer/ubus/network network] Referenz.&lt;br /&gt;
&lt;br /&gt;
==== network.device status ====&lt;br /&gt;
&lt;br /&gt;
Mittels&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status&lt;br /&gt;
&lt;br /&gt;
wird der Status aller vorhandenen Netzwerk-Schnittstellen zurückgegeben. Soll nur eine Schnittstelle abgefragt werden, kann der Parameter &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; übergeben werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name=eth0&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Namen angegeben werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name=eth0,eth1&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird für jede Schnittstelle eine Abfrage durchgeführt. Alternativ kann eine Perl-Funktion benutzt werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name={GetNetworkNames()}&lt;br /&gt;
&lt;br /&gt;
Hierfür sollte die Funktion (im Beispiel &amp;lt;code&amp;gt;GetNetworkNames()&amp;lt;/code&amp;gt;) z.B. in der 99_myUtils.pm definiert sein.&lt;br /&gt;
&lt;br /&gt;
Wenn das angesprochene Gerät eine Reihe von *_statistics_* Readings zurückgibt, die angeben, wie viele Bytes über eine Schnittstelle übertragen wurde etc., kann es hilfreich sein, dies in eine Anzahl Bytes seit dem letzten Aufruf umzurechnen. Das kann mit einer eigenen Funktion im Attribut &amp;lt;code&amp;gt;readings&amp;lt;/code&amp;gt; erreicht werden:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; readings {\&lt;br /&gt;
   my $r = FHEM::UBUS_CALL::DefaultReadings($RAW);;\&lt;br /&gt;
   foreach my $k (grep(/_statistics_/, keys %{$r}))\&lt;br /&gt;
   {\&lt;br /&gt;
     my $kt = $k . &#039;_total&#039;;;\&lt;br /&gt;
     my $kr = $k . &#039;_rate&#039;;;\&lt;br /&gt;
     my $d = $r-&amp;gt;{$k} - ReadingsNum($NAME, $kt, 0);;\&lt;br /&gt;
     my $t = ReadingsAge($NAME, $kt, 1);;\&lt;br /&gt;
     $r-&amp;gt;{$kt} = $r-&amp;gt;{$k};;\&lt;br /&gt;
     $r-&amp;gt;{$kr} = $d / $t;;\&lt;br /&gt;
     delete $r-&amp;gt;{$k};;\&lt;br /&gt;
   }\&lt;br /&gt;
   $r\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hier werden zuerst mit &amp;lt;code&amp;gt;FHEM::UBUS_CALL::DefaultReadings($RAW)&amp;lt;/code&amp;gt; die Standard-Readings erzeugt. Jedes Reading, das _statistics_ enthält, wird dann durch zwei andere Readings ersetzt, eines für den Gesamtwert, eines für die Änderung seit dem letzten Aufruf.&lt;br /&gt;
&lt;br /&gt;
==== network.interface.&amp;lt;name&amp;gt; status ====&lt;br /&gt;
&lt;br /&gt;
Um z.B. den Status des Interface &amp;lt;code&amp;gt;lan&amp;lt;/code&amp;gt; abzufragen, dient der Aufruf&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.interface.lan status&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Interfaces abgefragt werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.interface.lan,network.interface.wan status&lt;br /&gt;
&lt;br /&gt;
Damit bei dieser Form der Abfrage die Readings von den verschiedenen Interfaces nicht gegenseitig überschrieben werden, bietet es sich an, den Namen des Interface als Präfix zu übergeben. Das Attribut &amp;lt;code&amp;gt;readings&amp;lt;/code&amp;gt; sähe dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; readings {\&lt;br /&gt;
   my $p = $MODULE =~ s/network.interface.//r;;\&lt;br /&gt;
   return FHEM::UBUS_CALL::DefaultReadings($RAW, $p . &#039;_&#039;);;\&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37243</id>
		<title>UBus</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37243"/>
		<updated>2022-02-19T14:10:47Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Example: network.device status&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Die Module UBUS_CLIENT und UBUS_CALL dienen der Kommunikation mit Geräten, die über eine [http://openwrt.org/docs/techref/ubus uBus-Schnittstelle] verfügen. Mittels UBUS_CLIENT wird die Verbindung zu einem solchen Gerät hergestellt. Über UBUS_CALL wird ein Funktionsaufruf (bzw. eine Reihe von Funktionsaufrufen) an das Gerät gesendet und die Antwort in Readings ausgewertet.&lt;br /&gt;
&lt;br /&gt;
== UBUS_CLIENT - Modul zur Kommunikation mit uBus ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbinden von Geräten, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CLIENT&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CLIENT.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Je nach Gerät kann die uBus-Schnittstelle über Websocket oder über HTTP freigegeben sein.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über Websocket ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT ws://192.168.1.1&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über HTTP ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT http://192.168.1.1/ubus&lt;br /&gt;
&lt;br /&gt;
== UBUS_CALL - Modul zur Ausführung von uBus-Anfragen ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden von &amp;quot;call&amp;quot; Anfragen an Geräte, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CALL&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CALL.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele basieren auf der [http://openwrt.org/docs/guide-developer/ubus OpenWRT Dokumentation]. &#039;&#039;&#039;Je nach Gerät können andere Funktionsaufrufe implementiert sein.&#039;&#039;&#039; Welche dies sind, zeigen die Readings des UBUS_CLIENT.&lt;br /&gt;
&lt;br /&gt;
=== network ===&lt;br /&gt;
&lt;br /&gt;
Siehe [http://openwrt.org/docs/guide-developer/ubus/network network] Referenz.&lt;br /&gt;
&lt;br /&gt;
==== network.device status ====&lt;br /&gt;
&lt;br /&gt;
Mittels&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status&lt;br /&gt;
&lt;br /&gt;
wird der Status aller vorhandenen Netzwerk-Schnittstellen zurückgegeben. Soll nur eine Schnittstelle abgefragt werden, kann der Parameter &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; übergeben werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name=eth0&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Namen angegeben werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name=eth0,eth1&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird für jede Schnittstelle eine Abfrage durchgeführt. Alternativ kann eine Perl-Funktion benutzt werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CALL network.device status name={GetNetworkNames()}&lt;br /&gt;
&lt;br /&gt;
Hierfür sollte die Funktion (im Beispiel &amp;lt;code&amp;gt;GetNetworkNames()&amp;lt;/code&amp;gt;) z.B. in der 99_myUtils.pm definiert sein.&lt;br /&gt;
&lt;br /&gt;
Wenn das angesprochene Gerät eine Reihe von *_statistics_* Readings zurückgibt, die angeben, wie viele Bytes über eine Schnittstelle übertragen wurde etc., kann es hilfreich sein, dies in eine Anzahl Bytes seit dem letzten Aufruf umzurechnen. Das kann mit einer eigenen Funktion im Attribut &amp;lt;code&amp;gt;readings&amp;lt;/code&amp;gt; erreicht werden:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; readings {\&lt;br /&gt;
   my $r = FHEM::UBUS_CALL::DefaultReadings($RAW);;\&lt;br /&gt;
   foreach my $k (grep(/_statistics_/, keys %{$r}))\&lt;br /&gt;
   {\&lt;br /&gt;
     my $kt = $k . &#039;_total&#039;;;\&lt;br /&gt;
     my $kr = $k . &#039;_rate&#039;;;\&lt;br /&gt;
     my $d = $r-&amp;gt;{$k} - ReadingsNum($NAME, $kt, 0);;\&lt;br /&gt;
     my $t = ReadingsAge($NAME, $kt, 1);;\&lt;br /&gt;
     $r-&amp;gt;{$kt} = $r-&amp;gt;{$k};;\&lt;br /&gt;
     $r-&amp;gt;{$kr} = $d / $t;;\&lt;br /&gt;
     delete $r-&amp;gt;{$k};;\&lt;br /&gt;
   }\&lt;br /&gt;
   $r\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hier werden zuerst mit &amp;lt;code&amp;gt;FHEM::UBUS_CALL::DefaultReadings($RAW)&amp;lt;/code&amp;gt; die Standard-Readings erzeugt. Jedes Reading, das _statistics_ enthält, wird dann durch zwei andere Readings ersetzt, eines für den Gesamtwert, eines für die Änderung seit dem letzten Aufruf.&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37242</id>
		<title>UBus</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37242"/>
		<updated>2022-02-19T13:34:40Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Extended documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Die Module UBUS_CLIENT und UBUS_CALL dienen der Kommunikation mit Geräten, die über eine [http://openwrt.org/docs/techref/ubus uBus-Schnittstelle] verfügen. Mittels UBUS_CLIENT wird die Verbindung zu einem solchen Gerät hergestellt. Über UBUS_CALL wird ein Funktionsaufruf (bzw. eine Reihe von Funktionsaufrufen) an das Gerät gesendet und die Antwort in Readings ausgewertet.&lt;br /&gt;
&lt;br /&gt;
== UBUS_CLIENT - Modul zur Kommunikation mit uBus ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbinden von Geräten, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CLIENT&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CLIENT.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Je nach Gerät kann die uBus-Schnittstelle über Websocket oder über HTTP freigegeben sein.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über Websocket ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT ws://192.168.1.1&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation über HTTP ===&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; UBUS_CLIENT http://192.168.1.1/ubus&lt;br /&gt;
&lt;br /&gt;
== UBUS_CALL - Modul zur Ausführung von uBus-Anfragen ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden von &amp;quot;call&amp;quot; Anfragen an Geräte, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CALL&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CALL.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele basieren auf der [http://openwrt.org/docs/guide-developer/ubus OpenWRT Dokumentation]. Je nach Gerät können andere Funktionsaufrufe implementiert sein. Welche dies sind, zeigen die Readings des UBUS_CLIENT.&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37241</id>
		<title>UBus</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UBus&amp;diff=37241"/>
		<updated>2022-02-19T12:44:04Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Created page (to be filled with examples)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbinden von Geräten, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CLIENT&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CLIENT.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden von &amp;quot;call&amp;quot; Anfragen an Geräte, die über die uBus Schnittstelle kommunizieren&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=UBUS_CALL&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=72_UBUS_CALL.pm&lt;br /&gt;
|ModOwner=xenos1984 ({{Link2FU|43783|Forum}} / [[Benutzer Diskussion:Xenos1984|Wiki]])}}&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=35981</id>
		<title>DOIF/Zeitschaltuhr mit Calendar</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=35981"/>
		<updated>2021-08-28T05:33:35Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Corrected get syntax (added missing &amp;quot;events&amp;quot;).&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [[DOIF]] Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das [[Calendar]] Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionen auslösen lassen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden soll angenommen werden, dass es ein Gerät von Typ [[Calendar]] namens &#039;&#039;&#039;calendar&#039;&#039;&#039; gibt, auf das reagiert werden soll. Alle Beispiele benutzen den FHEM Modus des [[DOIF]], können aber auch auf den Perl-Modus umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Calendar Ereignissen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen, wie man mittels [[DOIF]] auf Ereignisse eines [[Calendar]] Gerätes reagieren kann. Diese werden ausgelöst, wenn ein Kalendereintrag seinen Status ändert.&lt;br /&gt;
&lt;br /&gt;
=== Calendar Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Eintrag im Kalender seinen Status ändert, werden zwei Ereignisse erzeugt:&lt;br /&gt;
&lt;br /&gt;
 changed: &amp;lt;UID&amp;gt; &amp;lt;mode&amp;gt;&lt;br /&gt;
 &amp;lt;mode&amp;gt;: &amp;lt;UID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist &#039;&#039;&#039;&amp;lt;UID&amp;gt;&#039;&#039;&#039; die UID des Kalendereintrags und &#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; der neue Status (&#039;&#039;upcoming&#039;&#039;, &#039;&#039;alarm&#039;&#039;, &#039;&#039;start&#039;&#039; oder &#039;&#039;end&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf alle Kalendereinträge ===&lt;br /&gt;
&lt;br /&gt;
Soll auf alle Statuswechsel von Kalendereinträgen getriggert werden, so geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^changed:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Soll dagegen z.B. nur auf startende Kalendereinträge getriggert werden, geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^start:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Innerhalb des Ausführungsteils lässt sich dann &#039;&#039;&#039;$EVENT&#039;&#039;&#039; auswerten, wie dies in [[Google-Kalender zur Steuerung von Dummies]] mittels [[Notify]] dargestellt ist.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf eine bestimmte UID ===&lt;br /&gt;
&lt;br /&gt;
Soll dagegen nur auf einen Eintrag mit einer bestimmten, bekannten UID getriggert werden, geht dies z.B. mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^end: event123xyz$&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Ist die UID dagegen nicht bekannt, wenn das [[DOIF]] programmiert wird, sondern wird z.B. in einem Reading namens &#039;&#039;&#039;uid&#039;&#039;&#039; des [[DOIF]] abgelegt, lässt sich wie folgt auf das Ende des Kalendereintrags triggern:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:$1,&amp;quot;&amp;quot;] eq [$SELF:uid])&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels Rückgabewert die UID des Kalendereintrags ermittelt und mit dem gespeicherten Reading verglichen.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge mit bestimmten Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
Soll nicht die UID überprüft werden, sondern der Inhalt eines Kalendereintrags, so lässt sich dafür die Ausgabeformatierung des DOIF Moduls nutzen, um den Inhalt abzufragen. Um z.B. zu triggern, wenn ein Event beginnt, dass in Feld &#039;&#039;&#039;summary&#039;&#039;&#039; das Wort &amp;quot;Erna&amp;quot; enthält:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^start: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Erna&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Triggern beim Ende aller Einträge, die als &amp;quot;PUBLIC&amp;quot; klassifiziert sind:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$CL\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] eq &amp;quot;PUBLIC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Schalten in Abhängigkeit des Calendar Status ==&lt;br /&gt;
&lt;br /&gt;
Soll nicht zum Zeitpunkt eines Statuswechsels reagiert werden, sondern durch einen anderen Auslöser, aber in Abhängigkeit von Kalendereinträgen, so kann dies wie folgt realisiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Abfragen von Kalendereinträgen ===&lt;br /&gt;
&lt;br /&gt;
Das [[Calendar]] Modul bietet den folgenden, sehr umfangreichen Befehl zum Abruf von Kalendereinträgen:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;name&amp;gt; events [format:&amp;lt;formatSpec&amp;gt;] [timeFormat:&amp;lt;timeFormatSpec&amp;gt;] [filter:&amp;lt;filterSpecs&amp;gt;] [series:next[=&amp;lt;max&amp;gt;]] [limit:&amp;lt;limitSpecs&amp;gt;] [include:&amp;lt;names&amp;gt;] [returnType:&amp;lt;returnTypeSpec&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Diese lässt sich mittels der Perl-Funktion &#039;&#039;&#039;fhem()&#039;&#039;&#039; auch innerhalb von [[DOIF]] nutzen. Hier ist zu beachten, dass die Funktion &#039;&#039;undef&#039;&#039; zurückgibt, wenn keine Einträge vorhanden sind, die auf die gefragten Kriterien passen, was sich mittels &#039;&#039;&#039;defined&#039;&#039;&#039; überprüfen lässt.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge heute oder morgen ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 6:00 zu triggern, wenn an diesem Tag &amp;quot;Schule&amp;quot; (zu einer beliebigen Uhrzeit) im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([06:00] and defined fhem(&#039;get calendar events filter:field(summary)==&amp;quot;Schule&amp;quot; limit:when=today&#039;))&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 21:00 zu triggern, wenn am nächsten Tag etwas mit &amp;quot;Tonne&amp;quot; im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([21:00] and defined fhem(&#039;get calendar events filter:field(summary)=~&amp;quot;Tonne&amp;quot; limit:when=tomorrow&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Kalendereintrag aktiv ist ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 7:00 zu triggern, wenn der Kalender einen Eintrag &amp;quot;Arbeitstag&amp;quot; enthält (als ganztägigen Eintrag, mit Anfang und Ende jeweils im Mitternacht, sodass sich das Ereignis den ganzen Tag im Status &#039;&#039;start&#039;&#039; befindet):&lt;br /&gt;
&lt;br /&gt;
 ([07:00] and defined fhem(&#039;get calendar events filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Arbeitstag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Soll dagegen an markierten Tagen nicht getriggert werden, z.B. von 7:00-8:00, aber nicht an Ferientagen:&lt;br /&gt;
&lt;br /&gt;
 ([07:00-08:00] and !defined fhem(&#039;get calendar events filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ferientag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger zur vollen Stunde, außer zu Ruhezeiten:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and !defined fhem(&#039;get calendar events filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ruhezeit&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger auf Frost, aber nur, wenn zu dieser Zeit geheizt werden soll:&lt;br /&gt;
&lt;br /&gt;
 ([temperature &amp;lt; 0] and defined fhem(&#039;get calendar events filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Heizung&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Ereignis bevorsteht oder stattgefunden hat ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Trigger ausgelöst werden soll, bevor ein Kalendereintrag aktiv wird, oder nachdem das Ereignis vorbei ist (z.B. um vor einer Party die Heizung einzuschalten, und danach den Staubsauger) kann man den Zeitfilter benutzen. Um zu jeder vollen Stunde zu testen, ob innerhalb der nächsten 6 Stunden eine Party beginnt:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=05:00,to=06:00&#039;))&lt;br /&gt;
&lt;br /&gt;
Entsprechendes, wenn die Party seit 4 Stunden vorbei ist:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode==&amp;quot;end&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=-04:00,to=0&#039;))&lt;br /&gt;
&lt;br /&gt;
== Komplexere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen ein paar Anwendungen.&lt;br /&gt;
&lt;br /&gt;
=== Heizung einschalten 6 Stunden bevor Besuch kommt, ausschalten wenn Besuch geht ===&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Besuch&amp;quot; limit:from=0,to=06:00&#039;))&lt;br /&gt;
 	(set heating on)&lt;br /&gt;
 DOELSEIF ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Besuch&amp;quot;)&lt;br /&gt;
 	(set heating off)&lt;br /&gt;
&lt;br /&gt;
=== uiTable: Anzahl der Tage bis zur Abfall-Entsorgung ===&lt;br /&gt;
&lt;br /&gt;
Siehe [[DOIF/uiTable Schnelleinstieg#Anzahl der Tage bis zur Abfall-Entsorgung]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[DOIF/Zeitgeber]]&lt;br /&gt;
* [[DOIF/Zeitspanne zwischen zwei Terminen schalten]]&lt;br /&gt;
* [[DOIF/Zeitspanne im DOIF und disabledForIntervals im Vergleich]]&lt;br /&gt;
* [[Calendar]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=34330</id>
		<title>DOIF/Zeitschaltuhr mit Calendar</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=34330"/>
		<updated>2020-12-05T18:55:09Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: /* Komplexere Beispiele */ Link zur uiTable Abfall-Entsorgung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [[DOIF]] Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das [[Calendar]] Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionen auslösen lassen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden soll angenommen werden, dass es ein Gerät von Typ [[Calendar]] namens &#039;&#039;&#039;calendar&#039;&#039;&#039; gibt, auf das reagiert werden soll. Alle Beispiele benutzen den FHEM Modus des [[DOIF]], können aber auch auf den Perl-Modus umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Calendar Ereignissen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen, wie man mittels [[DOIF]] auf Ereignisse eines [[Calendar]] Gerätes reagieren kann. Diese werden ausgelöst, wenn ein Kalendereintrag seinen Status ändert.&lt;br /&gt;
&lt;br /&gt;
=== Calendar Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Eintrag im Kalender seinen Status ändert, werden zwei Ereignisse erzeugt:&lt;br /&gt;
&lt;br /&gt;
 changed: &amp;lt;UID&amp;gt; &amp;lt;mode&amp;gt;&lt;br /&gt;
 &amp;lt;mode&amp;gt;: &amp;lt;UID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist &#039;&#039;&#039;&amp;lt;UID&amp;gt;&#039;&#039;&#039; die UID des Kalendereintrags und &#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; der neue Status (&#039;&#039;upcoming&#039;&#039;, &#039;&#039;alarm&#039;&#039;, &#039;&#039;start&#039;&#039; oder &#039;&#039;end&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf alle Kalendereinträge ===&lt;br /&gt;
&lt;br /&gt;
Soll auf alle Statuswechsel von Kalendereinträgen getriggert werden, so geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^changed:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Soll dagegen z.B. nur auf startende Kalendereinträge getriggert werden, geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^start:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Innerhalb des Ausführungsteils lässt sich dann &#039;&#039;&#039;$EVENT&#039;&#039;&#039; auswerten, wie dies in [[Google-Kalender zur Steuerung von Dummies]] mittels [[Notify]] dargestellt ist.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf eine bestimmte UID ===&lt;br /&gt;
&lt;br /&gt;
Soll dagegen nur auf einen Eintrag mit einer bestimmten, bekannten UID getriggert werden, geht dies z.B. mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^end: event123xyz$&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Ist die UID dagegen nicht bekannt, wenn das [[DOIF]] programmiert wird, sondern wird z.B. in einem Reading namens &#039;&#039;&#039;uid&#039;&#039;&#039; des [[DOIF]] abgelegt, lässt sich wie folgt auf das Ende des Kalendereintrags triggern:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:$1,&amp;quot;&amp;quot;] eq [$SELF:uid])&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels Rückgabewert die UID des Kalendereintrags ermittelt und mit dem gespeicherten Reading verglichen.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge mit bestimmten Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
Soll nicht die UID überprüft werden, sondern der Inhalt eines Kalendereintrags, so lässt sich dafür die Ausgabeformatierung des DOIF Moduls nutzen, um den Inhalt abzufragen. Um z.B. zu triggern, wenn ein Event beginnt, dass in Feld &#039;&#039;&#039;summary&#039;&#039;&#039; das Wort &amp;quot;Erna&amp;quot; enthält:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^start: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Erna&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Triggern beim Ende aller Einträge, die als &amp;quot;PUBLIC&amp;quot; klassifiziert sind:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$CL\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] eq &amp;quot;PUBLIC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Schalten in Abhängigkeit des Calendar Status ==&lt;br /&gt;
&lt;br /&gt;
Soll nicht zum Zeitpunkt eines Statuswechsels reagiert werden, sondern durch einen anderen Auslöser, aber in Abhängigkeit von Kalendereinträgen, so kann dies wie folgt realisiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Abfragen von Kalendereinträgen ===&lt;br /&gt;
&lt;br /&gt;
Das [[Calendar]] Modul bietet den folgenden, sehr umfangreichen Befehl zum Abruf von Kalendereinträgen:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;name&amp;gt; events [format:&amp;lt;formatSpec&amp;gt;] [timeFormat:&amp;lt;timeFormatSpec&amp;gt;] [filter:&amp;lt;filterSpecs&amp;gt;] [series:next[=&amp;lt;max&amp;gt;]] [limit:&amp;lt;limitSpecs&amp;gt;] [include:&amp;lt;names&amp;gt;] [returnType:&amp;lt;returnTypeSpec&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Diese lässt sich mittels der Perl-Funktion &#039;&#039;&#039;fhem()&#039;&#039;&#039; auch innerhalb von [[DOIF]] nutzen. Hier ist zu beachten, dass die Funktion &#039;&#039;undef&#039;&#039; zurückgibt, wenn keine Einträge vorhanden sind, die auf die gefragten Kriterien passen, was sich mittels &#039;&#039;&#039;defined&#039;&#039;&#039; überprüfen lässt.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge heute oder morgen ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 6:00 zu triggern, wenn an diesem Tag &amp;quot;Schule&amp;quot; (zu einer beliebigen Uhrzeit) im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([06:00] and defined fhem(&#039;get calendar filter:field(summary)==&amp;quot;Schule&amp;quot; limit:when=today&#039;))&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 21:00 zu triggern, wenn am nächsten Tag etwas mit &amp;quot;Tonne&amp;quot; im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([21:00] and defined fhem(&#039;get calendar filter:field(summary)=~&amp;quot;Tonne&amp;quot; limit:when=tomorrow&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Kalendereintrag aktiv ist ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 7:00 zu triggern, wenn der Kalender einen Eintrag &amp;quot;Arbeitstag&amp;quot; enthält (als ganztägigen Eintrag, mit Anfang und Ende jeweils im Mitternacht, sodass sich das Ereignis den ganzen Tag im Status &#039;&#039;start&#039;&#039; befindet):&lt;br /&gt;
&lt;br /&gt;
 ([07:00] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Arbeitstag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Soll dagegen an markierten Tagen nicht getriggert werden, z.B. von 7:00-8:00, aber nicht an Ferientagen:&lt;br /&gt;
&lt;br /&gt;
 ([07:00-08:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ferientag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger zur vollen Stunde, außer zu Ruhezeiten:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ruhezeit&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger auf Frost, aber nur, wenn zu dieser Zeit geheizt werden soll:&lt;br /&gt;
&lt;br /&gt;
 ([temperature &amp;lt; 0] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Heizung&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Ereignis bevorsteht oder stattgefunden hat ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Trigger ausgelöst werden soll, bevor ein Kalendereintrag aktiv wird, oder nachdem das Ereignis vorbei ist (z.B. um vor einer Party die Heizung einzuschalten, und danach den Staubsauger) kann man den Zeitfilter benutzen. Um zu jeder vollen Stunde zu testen, ob innerhalb der nächsten 6 Stunden eine Party beginnt:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=05:00,to=06:00&#039;))&lt;br /&gt;
&lt;br /&gt;
Entsprechendes, wenn die Party seit 4 Stunden vorbei ist:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode==&amp;quot;end&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=-04:00,to=0&#039;))&lt;br /&gt;
&lt;br /&gt;
== Komplexere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen ein paar Anwendungen.&lt;br /&gt;
&lt;br /&gt;
=== Heizung einschalten 6 Stunden bevor Besuch kommt, ausschalten wenn Besuch geht ===&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Besuch&amp;quot; limit:from=0,to=06:00&#039;))&lt;br /&gt;
 	(set heating on)&lt;br /&gt;
 DOELSEIF ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Besuch&amp;quot;)&lt;br /&gt;
 	(set heating off)&lt;br /&gt;
&lt;br /&gt;
=== uiTable: Anzahl der Tage bis zur Abfall-Entsorgung ===&lt;br /&gt;
&lt;br /&gt;
Siehe [[DOIF/uiTable Schnelleinstieg#Anzahl der Tage bis zur Abfall-Entsorgung]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[DOIF/Zeitgeber]]&lt;br /&gt;
* [[DOIF/Zeitspanne zwischen zwei Terminen schalten]]&lt;br /&gt;
* [[DOIF/Zeitspanne im DOIF und disabledForIntervals im Vergleich]]&lt;br /&gt;
* [[Calendar]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33909</id>
		<title>DOIF/Zeitschaltuhr mit Calendar</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33909"/>
		<updated>2020-09-12T13:40:12Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [[DOIF]] Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das [[Calendar]] Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionen auslösen lassen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden soll angenommen werden, dass es ein Gerät von Typ [[Calendar]] namens &#039;&#039;&#039;calendar&#039;&#039;&#039; gibt, auf das reagiert werden soll. Alle Beispiele benutzen den FHEM Modus des [[DOIF]], können aber auch auf den Perl-Modus umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Calendar Ereignissen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen, wie man mittels [[DOIF]] auf Ereignisse eines [[Calendar]] Gerätes reagieren kann. Diese werden ausgelöst, wenn ein Kalendereintrag seinen Status ändert.&lt;br /&gt;
&lt;br /&gt;
=== Calendar Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Eintrag im Kalender seinen Status ändert, werden zwei Ereignisse erzeugt:&lt;br /&gt;
&lt;br /&gt;
 changed: &amp;lt;UID&amp;gt; &amp;lt;mode&amp;gt;&lt;br /&gt;
 &amp;lt;mode&amp;gt;: &amp;lt;UID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist &#039;&#039;&#039;&amp;lt;UID&amp;gt;&#039;&#039;&#039; die UID des Kalendereintrags und &#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; der neue Status (&#039;&#039;upcoming&#039;&#039;, &#039;&#039;alarm&#039;&#039;, &#039;&#039;start&#039;&#039; oder &#039;&#039;end&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf alle Kalendereinträge ===&lt;br /&gt;
&lt;br /&gt;
Soll auf alle Statuswechsel von Kalendereinträgen getriggert werden, so geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^changed:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Soll dagegen z.B. nur auf startende Kalendereinträge getriggert werden, geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^start:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Innerhalb des Ausführungsteils lässt sich dann &#039;&#039;&#039;$EVENT&#039;&#039;&#039; auswerten, wie dies in [[Google-Kalender zur Steuerung von Dummies]] mittels [[Notify]] dargestellt ist.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf eine bestimmte UID ===&lt;br /&gt;
&lt;br /&gt;
Soll dagegen nur auf einen Eintrag mit einer bestimmten, bekannten UID getriggert werden, geht dies z.B. mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^end: event123xyz$&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Ist die UID dagegen nicht bekannt, wenn das [[DOIF]] programmiert wird, sondern wird z.B. in einem Reading namens &#039;&#039;&#039;uid&#039;&#039;&#039; des [[DOIF]] abgelegt, lässt sich wie folgt auf das Ende des Kalendereintrags triggern:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:$1,&amp;quot;&amp;quot;] eq [$SELF:uid])&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels Rückgabewert die UID des Kalendereintrags ermittelt und mit dem gespeicherten Reading verglichen.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge mit bestimmten Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
Soll nicht die UID überprüft werden, sondern der Inhalt eines Kalendereintrags, so lässt sich dafür die Ausgabeformatierung des DOIF Moduls nutzen, um den Inhalt abzufragen. Um z.B. zu triggern, wenn ein Event beginnt, dass in Feld &#039;&#039;&#039;summary&#039;&#039;&#039; das Wort &amp;quot;Erna&amp;quot; enthält:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^start: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Erna&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Triggern beim Ende aller Einträge, die als &amp;quot;PUBLIC&amp;quot; klassifiziert sind:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$CL\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] eq &amp;quot;PUBLIC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Schalten in Abhängigkeit des Calendar Status ==&lt;br /&gt;
&lt;br /&gt;
Soll nicht zum Zeitpunkt eines Statuswechsels reagiert werden, sondern durch einen anderen Auslöser, aber in Abhängigkeit von Kalendereinträgen, so kann dies wie folgt realisiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Abfragen von Kalendereinträgen ===&lt;br /&gt;
&lt;br /&gt;
Das [[Calendar]] Modul bietet den folgenden, sehr umfangreichen Befehl zum Abruf von Kalendereinträgen:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;name&amp;gt; events [format:&amp;lt;formatSpec&amp;gt;] [timeFormat:&amp;lt;timeFormatSpec&amp;gt;] [filter:&amp;lt;filterSpecs&amp;gt;] [series:next[=&amp;lt;max&amp;gt;]] [limit:&amp;lt;limitSpecs&amp;gt;] [include:&amp;lt;names&amp;gt;] [returnType:&amp;lt;returnTypeSpec&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Diese lässt sich mittels der Perl-Funktion &#039;&#039;&#039;fhem()&#039;&#039;&#039; auch innerhalb von [[DOIF]] nutzen. Hier ist zu beachten, dass die Funktion &#039;&#039;undef&#039;&#039; zurückgibt, wenn keine Einträge vorhanden sind, die auf die gefragten Kriterien passen, was sich mittels &#039;&#039;&#039;defined&#039;&#039;&#039; überprüfen lässt.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge heute oder morgen ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 6:00 zu triggern, wenn an diesem Tag &amp;quot;Schule&amp;quot; (zu einer beliebigen Uhrzeit) im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([06:00] and defined fhem(&#039;get calendar filter:field(summary)==&amp;quot;Schule&amp;quot; limit:when=today&#039;))&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 21:00 zu triggern, wenn am nächsten Tag etwas mit &amp;quot;Tonne&amp;quot; im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([21:00] and defined fhem(&#039;get calendar filter:field(summary)=~&amp;quot;Tonne&amp;quot; limit:when=tomorrow&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Kalendereintrag aktiv ist ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 7:00 zu triggern, wenn der Kalender einen Eintrag &amp;quot;Arbeitstag&amp;quot; enthält (als ganztägigen Eintrag, mit Anfang und Ende jeweils im Mitternacht, sodass sich das Ereignis den ganzen Tag im Status &#039;&#039;start&#039;&#039; befindet):&lt;br /&gt;
&lt;br /&gt;
 ([07:00] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Arbeitstag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Soll dagegen an markierten Tagen nicht getriggert werden, z.B. von 7:00-8:00, aber nicht an Ferientagen:&lt;br /&gt;
&lt;br /&gt;
 ([07:00-08:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ferientag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger zur vollen Stunde, außer zu Ruhezeiten:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ruhezeit&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger auf Frost, aber nur, wenn zu dieser Zeit geheizt werden soll:&lt;br /&gt;
&lt;br /&gt;
 ([temperature &amp;lt; 0] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Heizung&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Ereignis bevorsteht oder stattgefunden hat ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Trigger ausgelöst werden soll, bevor ein Kalendereintrag aktiv wird, oder nachdem das Ereignis vorbei ist (z.B. um vor einer Party die Heizung einzuschalten, und danach den Staubsauger) kann man den Zeitfilter benutzen. Um zu jeder vollen Stunde zu testen, ob innerhalb der nächsten 6 Stunden eine Party beginnt:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=05:00,to=06:00&#039;))&lt;br /&gt;
&lt;br /&gt;
Entsprechendes, wenn die Party seit 4 Stunden vorbei ist:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode==&amp;quot;end&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=-04:00,to=0&#039;))&lt;br /&gt;
&lt;br /&gt;
== Komplexere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen ein paar Anwendungen.&lt;br /&gt;
&lt;br /&gt;
=== Heizung einschalten 6 Stunden bevor Besuch kommt, ausschalten wenn Besuch geht ===&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Besuch&amp;quot; limit:from=0,to=06:00&#039;))&lt;br /&gt;
 	(set heating on)&lt;br /&gt;
 DOELSEIF ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Besuch&amp;quot;)&lt;br /&gt;
 	(set heating off)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[DOIF/Zeitgeber]]&lt;br /&gt;
* [[DOIF/Zeitspanne zwischen zwei Terminen schalten]]&lt;br /&gt;
* [[DOIF/Zeitspanne im DOIF und disabledForIntervals im Vergleich]]&lt;br /&gt;
* [[Calendar]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33908</id>
		<title>DOIF/Zeitschaltuhr mit Calendar</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33908"/>
		<updated>2020-09-12T13:37:03Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Beispiele&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Das [[DOIF]] Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das [[Calendar]] Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionen auslösen lassen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden soll angenommen werden, dass es ein Gerät von Typ [[Calendar]] namens &#039;&#039;&#039;calendar&#039;&#039;&#039; gibt, auf das reagiert werden soll. Alle Beispiele benutzen den FHEM Modus des [[DOIF]], können aber auch auf den Perl-Modus umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Calendar Ereignissen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen, wie man mittels [[DOIF]] auf Ereignisse eines [[Calendar]] Gerätes reagieren kann. Diese werden ausgelöst, wenn ein Kalendereintrag seinen Status ändert.&lt;br /&gt;
&lt;br /&gt;
=== Calendar Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Eintrag im Kalender seinen Status ändert, werden zwei Ereignisse erzeugt:&lt;br /&gt;
&lt;br /&gt;
 changed: &amp;lt;UID&amp;gt; &amp;lt;mode&amp;gt;&lt;br /&gt;
 &amp;lt;mode&amp;gt;: &amp;lt;UID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist &#039;&#039;&#039;&amp;lt;UID&amp;gt;&#039;&#039;&#039; die UID des Kalendereintrags und &#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; der neue Status (&#039;&#039;upcoming&#039;&#039;, &#039;&#039;alarm&#039;&#039;, &#039;&#039;start&#039;&#039; oder &#039;&#039;end&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf alle Kalendereinträge ===&lt;br /&gt;
&lt;br /&gt;
Soll auf alle Statuswechsel von Kalendereinträgen getriggert werden, so geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^changed:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Soll dagegen z.B. nur auf startende Kalendereinträge getriggert werden, geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^start:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Innerhalb des Ausführungsteils lässt sich dann &#039;&#039;&#039;$EVENT&#039;&#039;&#039; auswerten, wie dies in [[Google-Kalender zur Steuerung von Dummies]] mittels [[Notify]] dargestellt ist.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf eine bestimmte UID ===&lt;br /&gt;
&lt;br /&gt;
Soll dagegen nur auf einen Eintrag mit einer bestimmten, bekannten UID getriggert werden, geht dies z.B. mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^end: event123xyz$&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Ist die UID dagegen nicht bekannt, wenn das [[DOIF]] programmiert wird, sondern wird z.B. in einem Reading namens &#039;&#039;&#039;uid&#039;&#039;&#039; des [[DOIF]] abgelegt, lässt sich wie folgt auf das Ende des Kalendereintrags triggern:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:$1,&amp;quot;&amp;quot;] eq [$SELF:uid])&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels Rückgabewert die UID des Kalendereintrags ermittelt und mit dem gespeicherten Reading verglichen.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge mit bestimmten Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
Soll nicht die UID überprüft werden, sondern der Inhalt eines Kalendereintrags, so lässt sich dafür die Ausgabeformatierung des DOIF Moduls nutzen, um den Inhalt abzufragen. Um z.B. zu triggern, wenn ein Event beginnt, dass in Feld &#039;&#039;&#039;summary&#039;&#039;&#039; das Wort &amp;quot;Erna&amp;quot; enthält:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^start: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Erna&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Triggern beim Ende aller Einträge, die als &amp;quot;PUBLIC&amp;quot; klassifiziert sind:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$CL\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] eq &amp;quot;PUBLIC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Schalten in Abhängigkeit des Calendar Status ==&lt;br /&gt;
&lt;br /&gt;
Soll nicht zum Zeitpunkt eines Statuswechsels reagiert werden, sondern durch einen anderen Auslöser, aber in Abhängigkeit von Kalendereinträgen, so kann dies wie folgt realisiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Abfragen von Kalendereinträgen ===&lt;br /&gt;
&lt;br /&gt;
Das [[Calendar]] Modul bietet den folgenden, sehr umfangreichen Befehl zum Abruf von Kalendereinträgen:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;name&amp;gt; events [format:&amp;lt;formatSpec&amp;gt;] [timeFormat:&amp;lt;timeFormatSpec&amp;gt;] [filter:&amp;lt;filterSpecs&amp;gt;] [series:next[=&amp;lt;max&amp;gt;]] [limit:&amp;lt;limitSpecs&amp;gt;] [include:&amp;lt;names&amp;gt;] [returnType:&amp;lt;returnTypeSpec&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Diese lässt sich mittels der Perl-Funktion &#039;&#039;&#039;fhem()&#039;&#039;&#039; auch innerhalb von [[DOIF]] nutzen. Hier ist zu beachten, dass die Funktion &#039;&#039;undef&#039;&#039; zurückgibt, wenn keine Einträge vorhanden sind, die auf die gefragten Kriterien passen, was sich mittels &#039;&#039;&#039;defined&#039;&#039;&#039; überprüfen lässt.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge heute oder morgen ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 6:00 zu triggern, wenn an diesem Tag &amp;quot;Schule&amp;quot; (zu einer beliebigen Uhrzeit) im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([06:00] and defined fhem(&#039;get calendar filter:field(summary)==&amp;quot;Schule&amp;quot; limit:when=today&#039;))&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 21:00 zu triggern, wenn am nächsten Tag etwas mit &amp;quot;Tonne&amp;quot; im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([21:00] and defined fhem(&#039;get calendar filter:field(summary)=~&amp;quot;Tonne&amp;quot; limit:when=tomorrow&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Kalendereintrag aktiv ist ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 7:00 zu triggern, wenn der Kalender einen Eintrag &amp;quot;Arbeitstag&amp;quot; enthält (als ganztägigen Eintrag, mit Anfang und Ende jeweils im Mitternacht, sodass sich das Ereignis den ganzen Tag im Status &#039;&#039;start&#039;&#039; befindet):&lt;br /&gt;
&lt;br /&gt;
 ([07:00] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Arbeitstag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Soll dagegen an markierten Tagen nicht getriggert werden, z.B. von 7:00-8:00, aber nicht an Ferientagen:&lt;br /&gt;
&lt;br /&gt;
 ([07:00-08:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ferientag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger zur vollen Stunde, außer zu Ruhezeiten:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ruhezeit&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger auf Frost, aber nur, wenn zu dieser Zeit geheizt werden soll:&lt;br /&gt;
&lt;br /&gt;
 ([temperature &amp;lt; 0] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Heizung&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Ereignis bevorsteht oder stattgefunden hat ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Trigger ausgelöst werden soll, bevor ein Kalendereintrag aktiv wird, oder nachdem das Ereignis vorbei ist (z.B. um vor einer Party die Heizung einzuschalten, und danach den Staubsauger) kann man den Zeitfilter benutzen. Um zu jeder vollen Stunde zu testen, ob innerhalb der nächsten 6 Stunden eine Party beginnt:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=05:00,to=06:00&#039;))&lt;br /&gt;
&lt;br /&gt;
Entsprechendes, wenn die Party seit 4 Stunden vorbei ist:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode==&amp;quot;end&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=-04:00,to=0&#039;))&lt;br /&gt;
&lt;br /&gt;
== Komplexere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen ein paar Anwendungen.&lt;br /&gt;
&lt;br /&gt;
=== Heizung einschalten 6 Stunden bevor Besuch kommt, ausschalten wenn Besuch geht ===&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Besuch&amp;quot; limit:from=0,to=06:00&#039;))&lt;br /&gt;
 	(set heating on)&lt;br /&gt;
 DOELSEIF ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Besuch&amp;quot;)&lt;br /&gt;
 	(set heating off)&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33907</id>
		<title>DOIF/Zeitschaltuhr mit Calendar</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33907"/>
		<updated>2020-09-12T13:32:31Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Triggern auf Calendar Status&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Das [[DOIF]] Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das [[Calendar]] Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionen auslösen lassen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden soll angenommen werden, dass es ein Gerät von Typ [[Calendar]] namens &#039;&#039;&#039;calendar&#039;&#039;&#039; gibt, auf das reagiert werden soll. Alle Beispiele benutzen den FHEM Modus des [[DOIF]], können aber auch auf den Perl-Modus umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Calendar Ereignissen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen, wie man mittels [[DOIF]] auf Ereignisse eines [[Calendar]] Gerätes reagieren kann. Diese werden ausgelöst, wenn ein Kalendereintrag seinen Status ändert.&lt;br /&gt;
&lt;br /&gt;
=== Calendar Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Eintrag im Kalender seinen Status ändert, werden zwei Ereignisse erzeugt:&lt;br /&gt;
&lt;br /&gt;
 changed: &amp;lt;UID&amp;gt; &amp;lt;mode&amp;gt;&lt;br /&gt;
 &amp;lt;mode&amp;gt;: &amp;lt;UID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist &#039;&#039;&#039;&amp;lt;UID&amp;gt;&#039;&#039;&#039; die UID des Kalendereintrags und &#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; der neue Status (&#039;&#039;upcoming&#039;&#039;, &#039;&#039;alarm&#039;&#039;, &#039;&#039;start&#039;&#039; oder &#039;&#039;end&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf alle Kalendereinträge ===&lt;br /&gt;
&lt;br /&gt;
Soll auf alle Statuswechsel von Kalendereinträgen getriggert werden, so geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^changed:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Soll dagegen z.B. nur auf startende Kalendereinträge getriggert werden, geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^start:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Innerhalb des Ausführungsteils lässt sich dann &#039;&#039;&#039;$EVENT&#039;&#039;&#039; auswerten, wie dies in [[Google-Kalender zur Steuerung von Dummies]] mittels [[Notify]] dargestellt ist.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf eine bestimmte UID ===&lt;br /&gt;
&lt;br /&gt;
Soll dagegen nur auf einen Eintrag mit einer bestimmten, bekannten UID getriggert werden, geht dies z.B. mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^end: event123xyz$&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Ist die UID dagegen nicht bekannt, wenn das [[DOIF]] programmiert wird, sondern wird z.B. in einem Reading namens &#039;&#039;&#039;uid&#039;&#039;&#039; des [[DOIF]] abgelegt, lässt sich wie folgt auf das Ende des Kalendereintrags triggern:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:$1,&amp;quot;&amp;quot;] eq [$SELF:uid])&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels Rückgabewert die UID des Kalendereintrags ermittelt und mit dem gespeicherten Reading verglichen.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge mit bestimmten Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
Soll nicht die UID überprüft werden, sondern der Inhalt eines Kalendereintrags, so lässt sich dafür die Ausgabeformatierung des DOIF Moduls nutzen, um den Inhalt abzufragen. Um z.B. zu triggern, wenn ein Event beginnt, dass in Feld &#039;&#039;&#039;summary&#039;&#039;&#039; das Wort &amp;quot;Erna&amp;quot; enthält:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^start: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Erna&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Triggern beim Ende aller Einträge, die als &amp;quot;PUBLIC&amp;quot; klassifiziert sind:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$CL\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] eq &amp;quot;PUBLIC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Schalten in Abhängigkeit des Calendar Status ==&lt;br /&gt;
&lt;br /&gt;
Soll nicht zum Zeitpunkt eines Statuswechsels reagiert werden, sondern durch einen anderen Auslöser, aber in Abhängigkeit von Kalendereinträgen, so kann dies wie folgt realisiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Abfragen von Kalendereinträgen ===&lt;br /&gt;
&lt;br /&gt;
Das [[Calendar]] Modul bietet den folgenden, sehr umfangreichen Befehl zum Abruf von Kalendereinträgen:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;name&amp;gt; events [format:&amp;lt;formatSpec&amp;gt;] [timeFormat:&amp;lt;timeFormatSpec&amp;gt;] [filter:&amp;lt;filterSpecs&amp;gt;] [series:next[=&amp;lt;max&amp;gt;]] [limit:&amp;lt;limitSpecs&amp;gt;] [include:&amp;lt;names&amp;gt;] [returnType:&amp;lt;returnTypeSpec&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Diese lässt sich mittels der Perl-Funktion &#039;&#039;&#039;fhem()&#039;&#039;&#039; auch innerhalb von [[DOIF]] nutzen. Hier ist zu beachten, dass die Funktion &#039;&#039;undef&#039;&#039; zurückgibt, wenn keine Einträge vorhanden sind, die auf die gefragten Kriterien passen, was sich mittels &#039;&#039;&#039;defined&#039;&#039;&#039; überprüfen lässt.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge heute oder morgen ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 6:00 zu triggern, wenn an diesem Tag &amp;quot;Schule&amp;quot; (zu einer beliebigen Uhrzeit) im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([06:00] and defined fhem(&#039;get calendar filter:field(summary)==&amp;quot;Schule&amp;quot; limit:when=today&#039;))&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 21:00 zu triggern, wenn am nächsten Tag etwas mit &amp;quot;Tonne&amp;quot; im Kalender steht:&lt;br /&gt;
&lt;br /&gt;
 ([21:00] and defined fhem(&#039;get calendar filter:field(summary)=~&amp;quot;Tonne&amp;quot; limit:when=tomorrow&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Kalendereintrag aktiv ist ===&lt;br /&gt;
&lt;br /&gt;
Um jeden Tag um 7:00 zu triggern, wenn der Kalender einen Eintrag &amp;quot;Arbeitstag&amp;quot; enthält (als ganztägigen Eintrag, mit Anfang und Ende jeweils im Mitternacht, sodass sich das Ereignis den ganzen Tag im Status &#039;&#039;start&#039;&#039; befindet):&lt;br /&gt;
&lt;br /&gt;
 ([07:00] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Arbeitstag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Soll dagegen an markierten Tagen nicht getriggert werden, z.B. von 7:00-8:00, aber nicht an Ferientagen:&lt;br /&gt;
&lt;br /&gt;
 ([07:00-08:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ferientag&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger zur vollen Stunde, außer zu Ruhezeiten:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and !defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Ruhezeit&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
Trigger auf Frost, aber nur, wenn zu dieser Zeit geheizt werden soll:&lt;br /&gt;
&lt;br /&gt;
 ([temperature &amp;lt; 0] and defined fhem(&#039;get calendar filter:mode==&amp;quot;start&amp;quot;,field(summary)==&amp;quot;Heizung&amp;quot;&#039;))&lt;br /&gt;
&lt;br /&gt;
=== Triggern, wenn Ereignis bevorsteht oder stattgefunden hat ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Trigger ausgelöst werden soll, bevor ein Kalendereintrag aktiv wird, oder nachdem das Ereignis vorbei ist (z.B. um vor einer Party die Heizung einzuschalten, und danach den Staubsauger) kann man den Zeitfilter benutzen. Um zu jeder vollen Stunde zu testen, ob innerhalb der nächsten 6 Stunden eine Party beginnt:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode=~&amp;quot;alarm|upcoming&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=05:00,to=06:00&#039;))&lt;br /&gt;
&lt;br /&gt;
Entsprechendes, wenn die Party seit 4 Stunden vorbei ist:&lt;br /&gt;
&lt;br /&gt;
 ([:00] and defined fhem(&#039;get calendar events filter:mode==&amp;quot;end&amp;quot;,field(summary)=~&amp;quot;Party&amp;quot; limit:from=-04:00,to=0&#039;))&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33906</id>
		<title>DOIF/Zeitschaltuhr mit Calendar</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33906"/>
		<updated>2020-09-12T12:44:09Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Triggern auf Calendar Ereignisse&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Das [[DOIF]] Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das [[Calendar]] Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionan auslösen lassen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden soll angenommen werden, dass es ein Gerät von Typ Calendar namens &#039;&#039;&#039;calendar&#039;&#039;&#039; gibt, auf das reagiert werden soll.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Calendar Ereignissen ==&lt;br /&gt;
&lt;br /&gt;
=== Calendar Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Wenn ein Eintrag im Kalender seinen Status ändert, werden zwei Ereignisse erzeugt:&lt;br /&gt;
&lt;br /&gt;
 changed: &amp;lt;UID&amp;gt; &amp;lt;mode&amp;gt;&lt;br /&gt;
 &amp;lt;mode&amp;gt;: &amp;lt;UID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist &#039;&#039;&#039;&amp;lt;UID&amp;gt;&#039;&#039;&#039; die UID des Kalendereintrags und &#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; der neue Status (&#039;&#039;upcoming&#039;&#039;, &#039;&#039;alarm&#039;&#039;, &#039;&#039;start&#039;&#039; oder &#039;&#039;end&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf alle Kalendereinträge ===&lt;br /&gt;
&lt;br /&gt;
Soll auf alle Statuswechsel von Kalendereinträgen getriggert werden, so geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^changed:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Soll dagegen z.B. nur auf startende Kalendereinträge getriggert werden, geht dies mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^start:&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Innerhalb des Ausführungsteils lässt sich dann &#039;&#039;&#039;$EVENT&#039;&#039;&#039; auswerten, wie dies in [[Google-Kalender zur Steuerung von Dummies]] mittels [[Notify]] dargestellt ist.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf eine bestimmte UID ===&lt;br /&gt;
&lt;br /&gt;
Soll dagegen nur auf einen Eintrag mit einer bestimmten, bekannten UID getriggert werden, geht dies z.B. mit&lt;br /&gt;
&lt;br /&gt;
 ([calendar:&amp;quot;^end: event123xyz$&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Ist die UID dagegen nicht bekannt, wenn das DOIF programmiert wird, sondern wird z.B. in einem Reading namens &#039;&#039;&#039;uid&#039;&#039;&#039; des DOIF abgelegt, lässt sich wie folgt auf das Ende des Kalendereintrags triggern:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*)$&amp;quot;:$1,&amp;quot;&amp;quot;] eq [$SELF:uid])&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels Rückgabewert die UID des Kalendereintrags ermittelt und mit dem gespeicherten Reading verglichen.&lt;br /&gt;
&lt;br /&gt;
=== Triggern auf Einträge mit bestimmten Eigenschaften ===&lt;br /&gt;
&lt;br /&gt;
Soll nicht die UID überprüft werden, sondern der Inhalt eines Kalendereintrags, so lässt sich dafür die Ausgabeformatierung des DOIF Moduls nutzen, um den Inhalt abzufragen. Um z.B. zu triggern, wenn ein Event beginnt, dass in Feld &#039;&#039;&#039;summary&#039;&#039;&#039; das Wort &amp;quot;Erna&amp;quot; enthält:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^start: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$S\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] =~ &amp;quot;Erna&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Triggern beim Ende aller Einträge, die als &amp;quot;PUBLIC&amp;quot; klassifiziert sind:&lt;br /&gt;
&lt;br /&gt;
 ([&amp;quot;^calendar$&amp;quot;:&amp;quot;^end: (.*) end$&amp;quot;:fhem(&amp;quot;get calendar events filter:uid==\&amp;quot;$1\&amp;quot; format:custom=\&amp;quot;\$CL\&amp;quot;&amp;quot;),&amp;quot;&amp;quot;] eq &amp;quot;PUBLIC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Schalten in Abhängigkeit des Calendar Status ==&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33905</id>
		<title>DOIF/Zeitschaltuhr mit Calendar</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Zeitschaltuhr_mit_Calendar&amp;diff=33905"/>
		<updated>2020-09-12T08:36:53Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Seite angelegt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Das [[DOIF]] Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das [[Calendar]] Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionan auslösen lassen.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Calendar Ereignissen ==&lt;br /&gt;
&lt;br /&gt;
== Schalten in Abhängigkeit des Calendar Status ==&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=VLC_Media_Player_mit_HTTPMOD&amp;diff=32289</id>
		<title>VLC Media Player mit HTTPMOD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=VLC_Media_Player_mit_HTTPMOD&amp;diff=32289"/>
		<updated>2020-01-05T00:07:17Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: /* Readings und Befehle */ random, loop, repeat hinzugefügt,&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Der [http://www.videolan.org/vlc/ VLC Media Player] besitzt ein HTTP Interface, das eine Fernsteuerung mittels FHEM möglich macht. Dieses HOWTO beschreibt, wie VLC über das Modul [[HTTPMOD]] eingebunden und Kontrollelemente eingerichtet werden können.&lt;br /&gt;
&lt;br /&gt;
== VLC als Server starten ==&lt;br /&gt;
&lt;br /&gt;
== Device erstellen ==&lt;br /&gt;
&lt;br /&gt;
Das VLC Device wird mittels des Moduls [[HTTPMOD]] angelegt. Dafür ist eine URL in der folgenden Form anzugeben:&lt;br /&gt;
&lt;br /&gt;
 define vlc HTTPMOD http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/requests/status.xml 5&lt;br /&gt;
&lt;br /&gt;
Dabei sind &amp;lt;code&amp;gt;&amp;amp;lt;host&amp;amp;gt;&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;&amp;amp;lt;port&amp;amp;gt;&amp;lt;/code&amp;gt; die Angaben für den Hostnamen und Ports des wie im Abschnitt [[#VLC_als_Server_starten]] beschrieben eingerichteten VLC Servers. Die Zahl am Ende gibt das Intervall (in Sekunden) an, nach dem der Server automatisch abgefragt und die Readings aktualisiert werden. Dieser Wert kann bei Bedarf angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Um später Befehle an den Server absetzen zu können, muss noch eine Vorlage für die dafür aufgerufene angegebene URL angegeben werden. Dies lässt sich wie folgt realisieren:&lt;br /&gt;
&lt;br /&gt;
 attr vlc setURL http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/requests/status.xml?command=%%cmd%%&lt;br /&gt;
&lt;br /&gt;
Der Befehl wird beim Aufruf durch einen regulären Ausdruck ersetzt. Dafür dient folgende Angabe:&lt;br /&gt;
&lt;br /&gt;
 attr vlc replacement01Regex %%cmd%%&lt;br /&gt;
&lt;br /&gt;
Als letztes muss noch der Login am Server mit dem wie in Abschnitt [[#VLC_als_Server_starten]] beschrieben eingerichteten Passwort erlaubt werden. Dies ist etwas Trickreich, da VLC nur ein Passwort, aber einen leeren Benutzernamen erwartet. Um diese zu übergeben, muss die [http://de.wikipedia.org/wiki/HTTP-Authentifizierung#Basic_Authentication HTTP Authentifizierung] manuell eingerichtet werden. Dafür muss zunächst der String &amp;lt;code&amp;gt;:&amp;amp;lt;password&amp;amp;gt;&amp;lt;/code&amp;gt; als [http://de.wikipedia.org/wiki/Base64 Base64] codiert werden. Dies kann z.B. mit einem Online-Converter geschehen, oder unter Linux mit dem Befehl&lt;br /&gt;
&lt;br /&gt;
 echo -n &amp;quot;:&amp;lt;password&amp;gt;&amp;quot; | base64&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis wird dann in das VLC Device eingetragen:&lt;br /&gt;
&lt;br /&gt;
 attr vlc requestHeader1 Authorization: Basic &amp;lt;base64&amp;gt;&lt;br /&gt;
 attr vlc getHeader1 Authorization: Basic &amp;lt;base64&amp;gt;&lt;br /&gt;
 attr vlc setHeader1 Authorization: Basic &amp;lt;base64&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch die HTTP URL des VLC Servers über einen Browser und einen Proxy wie [http://portswigger.net/burp/ BurpSuite] aufgerufen werden, und dann beobachtet werden, welchen Header der Browser für die Anmeldung an den Server schickt.&lt;br /&gt;
&lt;br /&gt;
== Readings und Befehle ==&lt;br /&gt;
&lt;br /&gt;
Der VLC Media Player stellt über das HTTP Interface eine Reihe von Statusmeldungen und Steuerbefehlen bereit. Die folgende Liste zeigt, wie diese in FHEM eingebunden werden können. Dafür müssen die genannten Attribute gesetzt werden, und es werden die darunter gelisteten Readings und Set-Befehle erstellt.&lt;br /&gt;
&lt;br /&gt;
=== Zufällige Wiedergabe ===&lt;br /&gt;
&lt;br /&gt;
Zeigt an bzw. legt fest, ob zufällige Wiedergabe aktiv ist.&lt;br /&gt;
&lt;br /&gt;
==== Attribute ====&lt;br /&gt;
&lt;br /&gt;
 attr vlc reading01Name random&lt;br /&gt;
 attr vlc reading01XPath-Strict /root/random/text()&lt;br /&gt;
 attr vlc set01Name random&lt;br /&gt;
 attr vlc set01NoArg 1&lt;br /&gt;
 attr vlc set01Replacement01Value pl_random&lt;br /&gt;
&lt;br /&gt;
==== Readings ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;random&#039;&#039;&#039; - &#039;&#039;true&#039;&#039; wenn zufällige Wiedergabe aktiv ist, anderenfalls &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Set-Befehle ====&lt;br /&gt;
&lt;br /&gt;
Umschalten (negieren der aktuellen Einstellung) der zufälligen Wiedergabe:&lt;br /&gt;
&lt;br /&gt;
 set vlc random&lt;br /&gt;
&lt;br /&gt;
=== Endloswiedergabe ===&lt;br /&gt;
&lt;br /&gt;
Zeigt an bzw. legt fest, ob Endloswiedergabe aktiv ist.&lt;br /&gt;
&lt;br /&gt;
==== Attribute ====&lt;br /&gt;
&lt;br /&gt;
 attr vlc reading02Name loop&lt;br /&gt;
 attr vlc reading02XPath-Strict /root/loop/text()&lt;br /&gt;
 attr vlc set02Name loop&lt;br /&gt;
 attr vlc set02NoArg 1&lt;br /&gt;
 attr vlc set02Replacement01Value pl_loop&lt;br /&gt;
&lt;br /&gt;
==== Readings ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;loop&#039;&#039;&#039; - &#039;&#039;true&#039;&#039; wenn Endloswiedergabe aktiv ist, anderenfalls &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Set-Befehle ====&lt;br /&gt;
&lt;br /&gt;
Umschalten (negieren der aktuellen Einstellung) der Endloswiedergabe:&lt;br /&gt;
&lt;br /&gt;
 set vlc loop&lt;br /&gt;
&lt;br /&gt;
=== Dauerschleife ===&lt;br /&gt;
&lt;br /&gt;
Zeigt an bzw. legt fest, ob eine Dauerschleife (Wiederholung eines bestimmten Titels) aktiv ist.&lt;br /&gt;
&lt;br /&gt;
==== Attribute ====&lt;br /&gt;
&lt;br /&gt;
 attr vlc reading03Name repeat&lt;br /&gt;
 attr vlc reading03XPath-Strict /root/repeat/text()&lt;br /&gt;
 attr vlc set03Name repeat&lt;br /&gt;
 attr vlc set03NoArg 1&lt;br /&gt;
 attr vlc set03Replacement01Value pl_repeat&lt;br /&gt;
&lt;br /&gt;
==== Readings ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;repeat&#039;&#039;&#039; - &#039;&#039;true&#039;&#039; wenn Dauerschleife aktiv ist, anderenfalls &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Set-Befehle ====&lt;br /&gt;
&lt;br /&gt;
Umschalten (negieren der aktuellen Einstellung) der Dauerschleife:&lt;br /&gt;
&lt;br /&gt;
 set vlc repeat&lt;br /&gt;
&lt;br /&gt;
== Playliste ==&lt;br /&gt;
&lt;br /&gt;
{{Todo|Auslesen der Attribute der Playliste - fortlaufende Nummer und Titel}}&lt;br /&gt;
&lt;br /&gt;
== Dateibrowser ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://wiki.videolan.org/Documentation:Modules/http_intf VLC HTTP Interface Dokumentation]&lt;br /&gt;
* [http://wiki.videolan.org/Control_VLC_via_a_browser VLC Browser Interface Dokumentation]&lt;br /&gt;
* [https://github.com/videolan/vlc/tree/master/share/lua/http/requests Liste der VLC HTTP Befehle]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=VLC_Media_Player_mit_HTTPMOD&amp;diff=31996</id>
		<title>VLC Media Player mit HTTPMOD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=VLC_Media_Player_mit_HTTPMOD&amp;diff=31996"/>
		<updated>2019-12-16T00:01:39Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: /* Device erstellen */ Inhalt erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Der [http://www.videolan.org/vlc/ VLC Media Player] besitzt ein HTTP Interface, das eine Fernsteuerung mittels FHEM möglich macht. Dieses HOWTO beschreibt, wie VLC über das Modul [[HTTPMOD]] eingebunden und Kontrollelemente eingerichtet werden können.&lt;br /&gt;
&lt;br /&gt;
== VLC als Server starten ==&lt;br /&gt;
&lt;br /&gt;
== Device erstellen ==&lt;br /&gt;
&lt;br /&gt;
Das VLC Device wird mittels des Moduls [[HTTPMOD]] angelegt. Dafür ist eine URL in der folgenden Form anzugeben:&lt;br /&gt;
&lt;br /&gt;
 define vlc HTTPMOD http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/requests/status.xml 5&lt;br /&gt;
&lt;br /&gt;
Dabei sind &amp;lt;code&amp;gt;&amp;amp;lt;host&amp;amp;gt;&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;&amp;amp;lt;port&amp;amp;gt;&amp;lt;/code&amp;gt; die Angaben für den Hostnamen und Ports des wie im Abschnitt [[#VLC_als_Server_starten]] beschrieben eingerichteten VLC Servers. Die Zahl am Ende gibt das Intervall (in Sekunden) an, nach dem der Server automatisch abgefragt und die Readings aktualisiert werden. Dieser Wert kann bei Bedarf angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Um später Befehle an den Server absetzen zu können, muss noch eine Vorlage für die dafür aufgerufene angegebene URL angegeben werden. Dies lässt sich wie folgt realisieren:&lt;br /&gt;
&lt;br /&gt;
 attr vlc setURL http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/requests/status.xml?command=%%cmd%%&lt;br /&gt;
&lt;br /&gt;
Der Befehl wird beim Aufruf durch einen regulären Ausdruck ersetzt. Dafür dient folgende Angabe:&lt;br /&gt;
&lt;br /&gt;
 attr vlc replacement01Regex %%cmd%%&lt;br /&gt;
&lt;br /&gt;
Als letztes muss noch der Login am Server mit dem wie in Abschnitt [[#VLC_als_Server_starten]] beschrieben eingerichteten Passwort erlaubt werden. Dies ist etwas Trickreich, da VLC nur ein Passwort, aber einen leeren Benutzernamen erwartet. Um diese zu übergeben, muss die [http://de.wikipedia.org/wiki/HTTP-Authentifizierung#Basic_Authentication HTTP Authentifizierung] manuell eingerichtet werden. Dafür muss zunächst der String &amp;lt;code&amp;gt;:&amp;amp;lt;password&amp;amp;gt;&amp;lt;/code&amp;gt; als [http://de.wikipedia.org/wiki/Base64 Base64] codiert werden. Dies kann z.B. mit einem Online-Converter geschehen, oder unter Linux mit dem Befehl&lt;br /&gt;
&lt;br /&gt;
 echo -n &amp;quot;:&amp;lt;password&amp;gt;&amp;quot; | base64&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis wird dann in das VLC Device eingetragen:&lt;br /&gt;
&lt;br /&gt;
 attr vlc requestHeader1 Authorization: Basic &amp;lt;base64&amp;gt;&lt;br /&gt;
 attr vlc getHeader1 Authorization: Basic &amp;lt;base64&amp;gt;&lt;br /&gt;
 attr vlc setHeader1 Authorization: Basic &amp;lt;base64&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch die HTTP URL des VLC Servers über einen Browser und einen Proxy wie [http://portswigger.net/burp/ BurpSuite] aufgerufen werden, und dann beobachtet werden, welchen Header der Browser für die Anmeldung an den Server schickt.&lt;br /&gt;
&lt;br /&gt;
== Readings und Befehle ==&lt;br /&gt;
&lt;br /&gt;
== Playliste ==&lt;br /&gt;
&lt;br /&gt;
{{Todo|Auslesen der Attribute der Playliste - fortlaufende Nummer und Titel}}&lt;br /&gt;
&lt;br /&gt;
== Dateibrowser ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://wiki.videolan.org/Documentation:Modules/http_intf VLC HTTP Interface Dokumentation]&lt;br /&gt;
* [http://wiki.videolan.org/Control_VLC_via_a_browser VLC Browser Interface Dokumentation]&lt;br /&gt;
* [https://github.com/videolan/vlc/tree/master/share/lua/http/requests Liste der VLC HTTP Befehle]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=VLC_Media_Player_mit_HTTPMOD&amp;diff=31995</id>
		<title>VLC Media Player mit HTTPMOD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=VLC_Media_Player_mit_HTTPMOD&amp;diff=31995"/>
		<updated>2019-12-15T23:27:47Z</updated>

		<summary type="html">&lt;p&gt;Xenos1984: Seite erstellt und Struktur angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Der [http://www.videolan.org/vlc/ VLC Media Player] besitzt ein HTTP Interface, das eine Fernsteuerung mittels FHEM möglich macht. Dieses HOWTO beschreibt, wie VLC über das Modul [[HTTPMOD]] eingebunden und Kontrollelemente eingerichtet werden können.&lt;br /&gt;
&lt;br /&gt;
== VLC als Server starten ==&lt;br /&gt;
&lt;br /&gt;
== Device erstellen ==&lt;br /&gt;
&lt;br /&gt;
== Readings und Befehle ==&lt;br /&gt;
&lt;br /&gt;
== Playliste ==&lt;br /&gt;
&lt;br /&gt;
{{Todo|Auslesen der Attribute der Playliste - fortlaufende Nummer und Titel}}&lt;br /&gt;
&lt;br /&gt;
== Dateibrowser ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://wiki.videolan.org/Documentation:Modules/http_intf VLC HTTP Interface Dokumentation]&lt;br /&gt;
* [http://wiki.videolan.org/Control_VLC_via_a_browser VLC Browser Interface Dokumentation]&lt;br /&gt;
* [https://github.com/videolan/vlc/tree/master/share/lua/http/requests Liste der VLC HTTP Befehle]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Xenos1984</name></author>
	</entry>
</feed>