<?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=50watt</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=50watt"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/50watt"/>
	<updated>2026-04-04T08:26:06Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FileLogConvert&amp;diff=39222</id>
		<title>FileLogConvert</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FileLogConvert&amp;diff=39222"/>
		<updated>2024-04-12T11:56:48Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Events unterdrücken */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:FileLogConvert}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=einlesen von Filelogs in eine logdb&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=FileLogConvert&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_FileLogConvert.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|DeeSPe}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kann dazu verwendet werden, um FileLogs in eine DbLog-Datenbank einzulesen.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
&lt;br /&gt;
Zuerst brauchen wir ein DbLog-Device:&lt;br /&gt;
&lt;br /&gt;
[[DbLog|DbLog-Device erstellen]]&lt;br /&gt;
&lt;br /&gt;
dazu könnte ein DbRep-Device helfen:&lt;br /&gt;
&lt;br /&gt;
[[DbRep - Reporting und Management von DbLog-Datenbankinhalten| DbRep-Device erstellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn das soweit erledigt ist, muss das FileLogConvert-Modul aus contrib nach FHEM kopiert werden:&lt;br /&gt;
&lt;br /&gt;
 cp /opt/fhem/contrib/98_FileLogConvert.pm /opt/fhem/FHEM&lt;br /&gt;
&lt;br /&gt;
Wenn die Datei nicht vorhanden ist, muss ein [[Cmdalias#svnupdate|update von contrib]] vorgenommen werden:&lt;br /&gt;
&lt;br /&gt;
 svn checkout https://svn.fhem.de/fhem/trunk/fhem/contrib/ contrib&lt;br /&gt;
Das neue Modul muss in fhem geladen sein:&lt;br /&gt;
&lt;br /&gt;
  reload 98_FileLogConvert.pm&lt;br /&gt;
&lt;br /&gt;
dann kann ein FileLogConvert-Device angelegt werden &lt;br /&gt;
&lt;br /&gt;
 define flc FileLogConvert &amp;lt;DbLogDevice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arbeiten mit dem FileLogConvert-Device ==&lt;br /&gt;
&lt;br /&gt;
nun können mit &lt;br /&gt;
 set flc import2DbLog &amp;lt;Filelog-Dateiname.log&amp;gt; &lt;br /&gt;
&lt;br /&gt;
die logdateien importiert werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps und Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Events unterdrücken ===&lt;br /&gt;
wenn man bei Erstellung des DbLog-Devices ein &lt;br /&gt;
 attr .* DbLogExclude .*&lt;br /&gt;
absetzt, werden keine Events geloggt. &lt;br /&gt;
Dadurch kann man hinterher die Zeilen der Datei&lt;br /&gt;
 wc -l Dateiname&lt;br /&gt;
mit den importierten Zeilen &lt;br /&gt;
 Reading lines-imported&lt;br /&gt;
mit den in der Datenbank vorhandenen Zeilen &lt;br /&gt;
 sqlite3 db.db&lt;br /&gt;
 select count(*) from history; &lt;br /&gt;
vergleichen. Der Count-Befehl gibt die totale anzahl an Zeilen an, so dass hier ggf. eine Verrechnung mit den vorher in der Datenbank vorhandenen Zeilen notwendig ist.&lt;br /&gt;
Das ganze funktioniert natürlich nur, wenn man in der Zwischenzeit keine neuen Logeinträge schreiben lässt (durch DbLog).&lt;br /&gt;
Abgesehen davon erhöht das ganze noch die Stabilität und Konsistenz der Datenbank&lt;br /&gt;
&lt;br /&gt;
=== Log-Dateien splitten === &lt;br /&gt;
&lt;br /&gt;
Wenn man größere Logdateien hat, dauert der import unter umständen sehr lange.&lt;br /&gt;
Daher besteht die Möglichkeit, die Logdateien in kleinere Stücke zu unterteilen, damit man z.B. zwischendurch unterbrechen kann:&lt;br /&gt;
 split -C 5m --numeric-suffixes input-file output-prefix&lt;br /&gt;
Blöderweise kann man nur Dateien importieren, die mit .log enden.&lt;br /&gt;
Deshalb muss man noch eine kleine verrenkung machen:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Logging]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/Perl-Modus&amp;diff=39168</id>
		<title>DOIF/Perl-Modus</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/Perl-Modus&amp;diff=39168"/>
		<updated>2024-03-09T11:36:02Z</updated>

		<summary type="html">&lt;p&gt;50watt: Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Licht-Szenarien.png|600px|rechts|Licht-Automatisierung]]&lt;br /&gt;
&lt;br /&gt;
Das DOIF-Modul arbeitet im DOIF-Perl-Modus, wie auch im DOIF-FHEM-Modus, ereignisgesteuert. Ein Steuerungsablauf wird in Perl in DOIF-Perl-Blöcken programmiert. Innerhalb eines DOIF-Devices können mehrere DOIF-Perl-Blöcke programmiert werden, die durch passende Event- oder Zeittrigger unabhängig von einander zur Ausführung gebracht werden.&lt;br /&gt;
&lt;br /&gt;
Die Abläufe lassen sich, wie in höheren Programmiersprachen üblich, strukturiert programmieren. Es können innerhalb eines DOIF-Devices eigene Perlfunktionen definiert und genutzt werden. Es werden ebenfalls sog. Templates (deutsch: Schablonen) unterstützt. Mit Hilfe eines Templates kann ein bestimmter Automatisierungsablauf für mehrere Szenarien in einem DOIF-Device erstellt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Definition werden alle DOIF-spezifischen Angaben in Perl übersetzt. Das garantiert zur Laufzeit eine maximal mögliche Performance.&lt;br /&gt;
&lt;br /&gt;
Genauso wie der DOIF-FHEM-Modus, lässt sich der DOIF-Perl-Modus mit Hilfe des [https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg uiTable-Attributes] um eine Web-Oberfläche ergänzen. Auf diese Weise kann sowohl die Steuerung als auch die Benutzeroberfläche innerhalb eines Devices erstellt werden. In der Abbildung rechts sieht man eine [https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht helligkeitsabhängige Lichtsteuerung für mehrere Szenarien] erstellt im DOIF-Perl-Modus mit einer Benutzeroberfläche.&lt;br /&gt;
&lt;br /&gt;
==Aufbau einer Definition im DOIF-Perl-Modus==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Definition im DOIF-Perl-Modus wird in drei Bereiche unterteilt: &#039;&#039;&#039;DOIF-Perl-Blöcke&#039;&#039;&#039;, &#039;&#039;&#039;Template-Definitionen&#039;&#039;&#039; und &#039;&#039;&#039;Template-Aufrufe&#039;&#039;&#039;. Die letzten beiden Bereiche sind optional, die Reihenfolge der drei Bereiche ist frei wählbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; DOIF&lt;br /&gt;
&amp;lt;DOIF-Perl-Blöcke&amp;gt;&lt;br /&gt;
&amp;lt;Template-Definitionen (optional)&amp;gt; &lt;br /&gt;
&amp;lt;Aufrufe zuvor definierter Templates (optional)&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aufbau eines DOIF-Perl-Blocks===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Blockname (optional)&amp;gt; {&amp;lt;Perlcode mit Ereignis-/Zeittriggern&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein DOIF-Perl-Block wird in Perl programmiert. Dabei muss man [https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Ereignistrigger Ereignis-]/[https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Zeittrigger Zeittrigger] in einer DOIF-spezifischen Syntax in eckigen Klammern im Programmcode einsetzen. Bei der Definition werden diese Angaben vom Modul ausgewertet, es werden intern entsprechende Trigger aufgesetzt, anschließend werden die Trigger-Angaben gegen interne Perlfunktionen ersetzt. So entsteht intern ein reiner Perl-Block, der zur Laufzeit ausgeführt wird, wenn ein Ereignis im System auftritt, welches zu den definierten Triggern des Blocks passt. Es können beliebig viele voneinander unabhängige Perl-Blöcke innerhalb eines DOIF-Devices definiert werden. Wird kein Name eines Perl-Blocks definiert, so wird der Block unter dem Namen &#039;&#039;&#039;block_&amp;lt;nr&amp;gt;&#039;&#039;&#039; intern geführt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Definition eines DOIF-Perl-Blocks mit einem Ereignistrigger und einer Fallunterscheidung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
defmod di_rc_tv DOIF        \&lt;br /&gt;
{                           ## Beginn eines Perlblocks ohne Namen\&lt;br /&gt;
  if ([remotecontol:&amp;quot;on&amp;quot;])  ## Das Device &amp;quot;remotecontrol&amp;quot; triggert das Modul, wenn im Event &amp;quot;on&amp;quot; vorkommt\&lt;br /&gt;
    {fhem_set&amp;quot;tv on&amp;quot;}       ## wird der Befehl &amp;quot;set tv on&amp;quot; ausgeführt\ &lt;br /&gt;
  else                      ## sonst\ &lt;br /&gt;
    {fhem_set&amp;quot;tv off&amp;quot;}      ## wenn im Event &amp;quot;on&amp;quot; nicht kommt, wird &amp;quot;set tv off&amp;quot; ausgeführt\&lt;br /&gt;
}                           ## Ende des Perlblocks&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Definition von zwei benannten DOIF-Perl-Blöcken mit Zeittriggern&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_clock_radio DOIF  \&lt;br /&gt;
radio_on {                  ## Beginn eines Perlblocks namens radio_on\ &lt;br /&gt;
 if ([06:30|Mo Di Mi] or [08:30|Do Fr Sa So]) ## zu definierten Zeitpunkten wird der Block getriggert\&lt;br /&gt;
   {fhem_set&amp;quot;radio on&amp;quot;}     ## der Befehl &amp;quot;set radio on&amp;quot; wird ausgeführt\ &lt;br /&gt;
}                           ## Ende des Perlblocks namens radio_on\&lt;br /&gt;
\&lt;br /&gt;
radio_off {                 ## Beginn eines Perlblocks namens radio_off\&lt;br /&gt;
  if ([08:00|Mo Di Mi] or [09:30|Do Fr Sa So]) ## zu definierten Zeitpunkten wird der Block getriggert\ &lt;br /&gt;
    {fhem_set&amp;quot;radio off&amp;quot;}   ## der Befehl &amp;quot;set radio off&amp;quot; wird ausgeführt\    &lt;br /&gt;
}                           ## Ende des Perlblocks namens radio_off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aufbau einer Template-Definition===&lt;br /&gt;
{{Randnotiz|RNText=&#039;&#039;&#039;nützliche Links&#039;&#039;&#039;&lt;br /&gt;
[https://wiki.fhem.de/wiki/DOIF/Templates DOIF-Templates]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DEF TPL_&amp;lt;Template-Name&amp;gt;(&amp;lt;DOIF-Block-Definition mit Platzhaltern: $1,$2,...&amp;gt;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Templates ist optional. Sie bietet sich dann an, wenn mehrere gleich aufgebaute Abläufe (hier Szenen) definiert werden sollen. Eine Template-Definition beginnt mit &#039;&#039;&#039;DEF&#039;&#039;&#039; gefolgt vom Namen des Templates welches mit &#039;&#039;&#039;TPL_&#039;&#039;&#039; beginnen muss. Anschließend wird eingefasst in runde Klammern ein Perl-Block programmiert. Variable Stellen innerhalb des Perl-Blocks werden mit Platzhaltern: $1, $2, usw. angegeben. Diese werden beim Aufruf des Templates gegen konkrete Angaben ersetzt. Insbesondere können so verschiedene Ereignis- oder Zeittrigger in den zuvor programmierten Ablauf eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DEF TPL_light (                      ## Definition des Templates namens TPL_light zur Steuerung einer Lichtszene\&lt;br /&gt;
light_$1 {                           ## DOIF Block namens light_&amp;lt;Szene&amp;gt;\&lt;br /&gt;
                                     ## Platzhalter für:      Szenennamen Daemmerungssensor Zeitspanne on-Befehl(e) off-Befehl(e)\&lt;br /&gt;
                                     ## Nr. des Platzhalters: $1          $2                $3         $4           $5\&lt;br /&gt;
  if (($3) and [$2] eq &amp;quot;on&amp;quot;) {       ## Innerhalb Zeitspanne (hier $3) und wenn Dämmerung (hier $2) gleich on\&lt;br /&gt;
    fhem_set($4);;                   ## schalte on-Befehle\&lt;br /&gt;
    set_State(&amp;quot;Szene: $1&amp;quot;);;         ## Setze Status des DOIF-Moduls auf den Szenennamen\&lt;br /&gt;
  } else {\&lt;br /&gt;
    fhem_set ($5);;                  ## sonst, schalte off-Befehle\&lt;br /&gt;
  }\&lt;br /&gt;
} ## Ende des Perl-Blocks\&lt;br /&gt;
) ## Ende der Templatedefinition\&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aufruf eines Templates===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
TPL_&amp;lt;Template-Name&amp;gt;(&amp;lt;Übergabeparameter für $1&amp;gt;,&amp;lt;Übergabeparameter für $2&amp;gt;,...&amp;gt;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Template wird durch die Angabe des zuvor definierten Template-Namens aufgerufen. Hinter dem Template-Namen werden in runden Klammern kommagetrennten Angaben für die Platzhalter $1, $2, usw. gemacht. Durch den Aufruf wird intern ein Perl-Block generiert, bei dem alle Platzhalter im definierten Perl-Block des Templates gegen konkrete Angaben getauscht wurden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das oben definierte Beispiel-Template wird für zwei verschiedene Szenarien benutzt. Hierbei entstehen mit dem im Template definierten Ablauf zwei Perl-Blöcke, die unabhängig von einander arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
TPL_light (Erdgeschoss,Daemmerung2,[06:25-08:00|8] or [15:00-23:00],&amp;quot;Lampekueche,LampeFlur on&amp;quot;,&amp;quot;Lampekueche,LampeFlur off&amp;quot;)\&lt;br /&gt;
TPL_light (Kind2,Daemmerung2,[06:25-08:00|8] or [15:00-23:10],&amp;quot;schrank2 on&amp;quot;,&amp;quot;schrank2 off&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ereignistrigger===&lt;br /&gt;
In einem DOIF-Perl-Block sollte mindestens eine Ereignis- oder Zeittriggerangabe vorkommen. Diese Angabe ist erforderlich, damit der Perl-Block beim passenden Event oder der angegeben Zeit ausgeführt wird. Sie wird grundsätzlich in eckigen Klammern angegeben und bei der Definition intern gegen eine Perlfunktion ersetzt, die einen Rückgabewert bei ihrer Ausführung liefert. &lt;br /&gt;
&lt;br /&gt;
====Eventtrigger mit Inhalt====&lt;br /&gt;
&#039;&#039;&#039;Inhalt des Internals STATE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;device&amp;gt;] reagiert auf alle Events vom angegebenen Device, Rückgabewert: STATE des Devices (nicht das Reading state des Devices)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define di_lamp DOIF {if ([lamp] eq &amp;quot;on) {fhem(&amp;quot;push lamp on&amp;quot;)}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inhalt eines Readings&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;] reagiert auf alle Events vom angegebenen Device mit dem angegebenen Reading, Rückgabewert: Inhalt des Readings des Devices&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define di_lamp DOIF {if ([lamp:state] eq &amp;quot;on) {fhem(&amp;quot;push lamp on&amp;quot;)}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Eventtrigger mit Rückgabewert wahr/falsch====&lt;br /&gt;
&#039;&#039;&#039;Eventtrigger für ein bestimmtes Device&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;device&amp;gt;:&amp;quot;&amp;lt;Regex-Events&amp;gt;&amp;quot;] reagiert auf alle Events vom angegebenen Device, Rückgabewert: wahr (true) zum Zeitpunkt des Events, wenn der Regex-Ausdruck passt, sonst falsch (false)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define di_button DOIF {if ([button:&amp;quot;^btn1:&amp;quot;]) {fhem_set(&amp;quot;lamp on&amp;quot;)}} # die if-Bedingung ist wahr und führt zur Ausführung, wenn vom Device button, das Event beginnend mit btn1: vorkommt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Eventtrigger für mehrere Devices&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;quot;&amp;lt;Regex-Devices&amp;gt;:&amp;lt;Regex-Events&amp;gt;&amp;quot;] reagiert auf Events mit Devices mit Events, die den jeweiligen Regex-Angaben entsprechen, Rückgabewert: wahr (true) zum Zeitpunkt des Events, sonst falsch (false)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define di_window DOIF {if ([&amp;quot;^window:on$&amp;quot;]) {fhem(&amp;quot;push window $device on&amp;quot;)}} # die Bedingung ist wahr und führt zur Ausführung, wenn ein Devices beginnend mit window ein Event endend mit on liefert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeittrigger===&lt;br /&gt;
====Zeittrigger zu einer bestimmten Uhrzeit====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;time&amp;gt;] der Zeitpunkt-Trigger mit &amp;lt;time&amp;gt;: HH:MM, HH:MM:SS triggert seinen Perl-Block zum angegebenen Zeitpunkt, Rückgabewert: wahr (true) zum Triggerzeitpunkt, sonst falsch (false)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define di_pump DOIF {if ([10:00] or [11:00:30]) {fhem_set(&amp;quot;pump on-for-timer 300&amp;quot;)}} # um 10:00 Uhr und um 11:00:30 wird der entsprechende Perl-Block ausgeführt, die if-Bedingung ist zu diesen beiden Zeitpunkten wahr und führt zur Ausführung der Anweisung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zeitintervalle====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;begin&amp;gt;-&amp;lt;end&amp;gt;]  &amp;lt;begin&amp;gt;, &amp;lt;end&amp;gt; als HH:MM, HH:MM:SS, triggert seinen Perl-Block zu &amp;lt;begin&amp;gt;-Zeit und zu &amp;lt;end&amp;gt;-Zeit, das Intervall ist ab &amp;lt;begin&amp;gt;-Zeitpunkt wahr und ab &amp;lt;end&amp;gt;-Zeitpunkt falsch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define di_lamp_on_off DOIF {if ([10:00-22:00]) {fhem_set(&amp;quot;lamp on&amp;quot;)} else {fhem_set(&amp;quot;lamp off&amp;quot;)}} # um 10:00 Uhr und um 22:00 Uhr wird der entsprechende Perl-Block getriggert, die if-Bedingung ist ab 10:00 Uhr wahr, lamp wird eingeschaltet, um 22:00 uhr ist die if-Bedingung nicht mehr wahr, lamp wird ausgeschaltet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====indirekte Zeitangaben====&lt;br /&gt;
&#039;&#039;&#039;Zeittrigger, deren Zeitangabe in einem Reading gespeichert wird&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;[[&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;]] im angegebenen Reading muss eine gültige Zeitangabe als HH:MM, HH:MM:SS stehen, um diese Zeit wird der entsprechende Perl-Block ausgeführt, die Bedingung ist dann wahr, sonst falsch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{if ([[mydevice:time]]) {fhem_set(&amp;quot;lamp on&amp;quot;)}} # zum Zeitpunkt, der sich im Reading time des Devices mydevice wird der Perl-Block getriggert, die if-Bedingung ist wahr und lamp wird eingeschaltet&lt;br /&gt;
&lt;br /&gt;
{if ([[mydevice:from]-[mydevice:to]]) {fhem_set(&amp;quot;lamp on&amp;quot;)} else {fhem_set(&amp;quot;lamp off&amp;quot;)}} # im Zeitintervall from-to brennt lamp, sonst ist sie aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====relative Zeitangaben====&lt;br /&gt;
&#039;&#039;&#039;Zyklischer Trigger im zeitlichen Abstand&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[+&amp;lt;time&amp;gt;] &amp;lt;time&amp;gt; als HH:MM, HH:MM:SS oder Zahl in Sekunden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{[+00:30];fhem(&amp;quot;save&amp;quot;)} # sichern der Konfiguration alle 30 Minuten&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ausgerichtete Zeittrigger====&lt;br /&gt;
&#039;&#039;&#039;X-Minuten nach einer vollen Stunde&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[:MM] mit MM sind Minutenangaben zwischen 00 und 59&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{[:15];[:45];fhem_set(&amp;quot;pump on-for-timer 300&amp;quot;)} # Pumpe 15 und 45 Minuten nach einer vollen Stunde für 5 Minuten einschalten&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Alle X-Minuten ab einer vollen Stunde&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[+:MM] mit MM in Minuten als Teiler von 60, sinnvolle Angaben sind: 02, 03, 04, 05, 06, 10, 12, 15, 20, 30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{[+:15];fhem_set(&amp;quot;pump on-for-timer 300&amp;quot;)} # Pumpe um HH:00, HH:15, HH:30, HH:45 für fünf Minuten einschalten &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;X-Minuten nach einer vollen Stunde, alle X-Stunden&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[+[h]:MM] mit MM in Minuten zwischen 1 und 59, h in Stunden als Teiler von 24, sinnvolle Angaben für h sind: 2, 3, 4, 6, 8, 12&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{[+[4]:05]; fhem_set(&amp;quot;pump on-for-timer 300&amp;quot;)} # Pumpe um 00:05, 04:05, 08:05, 12:05, 16:05, 20:05 Uhr für fünf Minuten einschalten&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wochentagsteuerung====&lt;br /&gt;
&#039;&#039;&#039;Zeittrigger an bestimmen Wochen-/Ferientagen&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;time-trigger&amp;gt;|0123456789] Bedeutung: 0 bis 6 für So. bis Sa., 7 Wochenende oder Feiertag, 8 Werktags, 9 Wochenende oder Feiertag am kommenden Tag&lt;br /&gt;
alternativ &lt;br /&gt;
[&amp;lt;time-trigger&amp;gt;|So Mo Di Mi Do Fr Sa WE AT MWE] WE entspricht der Ziffer 7, AT der Ziffer 8 und MWE der Ziffer 9&lt;br /&gt;
oder&lt;br /&gt;
[&amp;lt;time-trigger&amp;gt;|Su Mo Tu We Th Fr Sa WE WD TWE] WE entspricht der Ziffer 7, WD der Ziffer 8 und TWE der Ziffer 9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_lamp DOIF\&lt;br /&gt;
{[22:00|Sa];;fhem_set(&amp;quot;lamp on&amp;quot;)}\&lt;br /&gt;
{[08:00|Mo];;fhem_set(&amp;quot;lamp off&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Intervall-Timer====&lt;br /&gt;
&#039;&#039;&#039;Zyklischer Zeittrigger innerhalb einer Zeitspanne&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;begin&amp;gt;-&amp;lt;end&amp;gt;,&amp;lt;relativ timer&amp;gt;] triggert zu den aus &amp;lt;relativ timer&amp;gt; berechneten Zeitpunkten im angegebenen Zeitintervall &amp;lt;begin&amp;gt;-&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_pump DOIF {[08:00-22:00,+:30];;fhem_set(&amp;quot;pump on-for-timer 300&amp;quot;)} # von 08:00 Uhr bis 22:00 Uhr wird Pumpe alle 30 Minuten eingeschaltet, erste Schaltpunkt ist um 08:00 Uhr, der letzte um 21:30 Uhr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Trigger unterbinden===&lt;br /&gt;
&lt;br /&gt;
Soll eine Ereignis-/Zeitangabe nicht triggern, so lässt sich die Triggerung durch ein vorangestelltes Fragezeichen unterbinden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[?&amp;lt;Triggerangabe&amp;gt;] &amp;lt;Triggerangabe&amp;gt; kann eine Ereignis- oder Zeitangabe sein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_lamp DOIF \&lt;br /&gt;
{                                                     # hier triggert nur [darkness:state], dagegen wird das Zeitintervall nur abgefragt, \&lt;br /&gt;
  if ([darkness:state] eq &amp;quot;on&amp;quot; and [?15:00-22:00]) {  # es gibt keinen Trigger um 15:00 Uhr bzw. um 22:00 Uhr \&lt;br /&gt;
    fhem_set(&amp;quot;lamp on&amp;quot;) \       &lt;br /&gt;
  } else { \&lt;br /&gt;
    fhem_set(&amp;quot;lamp off&amp;quot;) \&lt;br /&gt;
  } \&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aggregationsfunktionen===&lt;br /&gt;
{{Randnotiz|RNText=Aggregationsfunktion&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;function&amp;gt;:&amp;lt;format&amp;gt;:&amp;quot;&amp;lt;regex device&amp;gt;:&amp;lt;regex event&amp;gt;&amp;quot;:&amp;lt;reading&amp;gt;:&amp;lt;condition&amp;gt;,&amp;lt;default&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;function&amp;gt;: #, @, #sum, #max, #min, #average, #median, @max, @min&lt;br /&gt;
# Anzahl der betroffenen Devices, @ kommagetrennte Liste Devices&lt;br /&gt;
#sum Summe, #max höchster Wert, #min niedrigster Wert, #average Durchschnitt, #median Medianwert&lt;br /&gt;
@max Device des höchsten Wertes, @min Device des niedrigsten Wertes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;format&amp;gt;: d&amp;lt;number&amp;gt;, a, s(&amp;lt;splittoken&amp;gt;)&lt;br /&gt;
d&amp;lt;number&amp;gt; zum Runden des Wertes mit Nachkommastellen, a für Aliasnamen bei Devicelisten, s(&amp;lt;splittoken&amp;gt;) &amp;lt;splittoken&amp;gt; sind Trennzeichen in der Device-Liste&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;regex Device&amp;gt;:&amp;lt;regex Event&amp;gt;&amp;quot; spezifiziert sowohl die betroffenen Devices, als auch den Ereignistrigger, die Syntax entspricht der DOIF-Syntax für Ereignistrigger.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;reading&amp;gt; konkretes Reading, welches überprüft werden soll&lt;br /&gt;
alternativ eine Regex in Anführungszeichen&lt;br /&gt;
&amp;quot;&amp;lt;regex reading&amp;gt;&amp;quot; Regex für Readings, die überprüft werden sollen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;condition&amp;gt; Aggregationsbedingung&lt;br /&gt;
wird &amp;lt;condition&amp;gt; in Anführungszeichen gesetzt, so werden Reading mit eq mit dem angegebenen Wert verglichen. Sonst kann ein Perlausdruck angegeben werden. Folgende Variablen sind vorbelegt und können im Perlausdruck benutzt werden:&lt;br /&gt;
&lt;br /&gt;
$_ Inhalt des Readings&lt;br /&gt;
$number Nach Zahl gefilteres Reading&lt;br /&gt;
$name Name des Devices&lt;br /&gt;
$reading Name des Readings&lt;br /&gt;
$TYPE Devices-Typ&lt;br /&gt;
$STATE Status des Devices (nicht das Reading state)&lt;br /&gt;
$room Raum des Devices&lt;br /&gt;
$group Gruppe des Devices&lt;br /&gt;
&lt;br /&gt;
&amp;lt;default&amp;gt; Default-Wert, falls kein Device gefunden wird, entspricht der Syntax des Default-Wertes bei Readingangaben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;format&amp;gt;, &amp;lt;reading&amp;gt;, &amp;lt;condition&amp;gt;, &amp;lt;default&amp;gt; sind optional&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Mit Hilfe einer Aggregationsfunktion können mehrere Readings im System ausgewertet werden, die einem bestimmten Kriterium entsprechen. Die Filterkriterien können mit Hilfe von Regex-Ausdrücken für Devices, Events und Readings angegeben werden. Die Aggregationsangabe wirkt triggernd, soll sie nicht triggern, so muss ein Fragezeichen vorangestellt werden, siehe [https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Trigger_unterbinden Trigger unterbinden]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;lt;function&amp;gt;:&amp;lt;format&amp;gt;:&amp;quot;&amp;lt;regex device&amp;gt;:&amp;lt;regex event&amp;gt;&amp;quot;:&amp;lt;reading&amp;gt;:&amp;lt;condition&amp;gt;,&amp;lt;default&amp;gt;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Offene Fenster anzeigen. Wenn ein Device beginnend mit &amp;quot;window&amp;quot; im Namen ein Event sendet, dann wird bei allen Devices im System, deren Name mit &amp;quot;window&amp;quot; beginnt, status auf &amp;quot;open&amp;quot; geprüft. Diese werden im Status von di_windows angezeigt. Wird kein Device mit status &amp;quot;open&amp;quot; gefunden, so wird der Default-Wert &amp;quot;keine&amp;quot; übernommen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_windows DOIF init {set_State([@:&amp;quot;^window&amp;quot;:state:&amp;quot;open&amp;quot;,&amp;quot;keine&amp;quot;])}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durchschnittstemperatur aller Temperatursensoren in der Gruppe &amp;quot;livingroom&amp;quot; gerundet auf 2 Nachkommastellen. Wenn ein Event von irgendeinem Device beginnend mit &amp;quot;temperature&amp;quot; auftritt, dann werden alle Devices im System durchsucht, die ein Reading namens &amp;quot;temperature&amp;quot; besitzen und sich in der Gruppe &amp;quot;livingroom&amp;quot; befinden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_average_temp DOIF init {set_State ([#average:d2:&amp;quot;:^temperature&amp;quot;:temperature:$group eq &amp;quot;livingroom&amp;quot;])}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um 18:00 Uhr werden alle Devices im System durchsucht, deren Reading &amp;quot;battery&amp;quot; nicht &amp;quot;ok&amp;quot; ist. Damit die Aggregationsangabe den DOIF-Perl-Block nicht triggert, muss am Anfang der Angabe ein Fragezeichen vorangestellt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_batterie_not_ok DOIF init {[18:00];;set_State([?@:&amp;quot;:battery&amp;quot;:battery:$_ ne &amp;quot;ok&amp;quot;,&amp;quot;alle OK&amp;quot;])}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um 18:00 Uhr werden alle Devices im System durchsucht, die ein Reading namens &amp;quot;Battery&amp;quot; oder &amp;quot;battery&amp;quot; haben. Bei diesen Readings wird die letzte Aktualisierung geprüft. Wenn sie älter als 24 Stunden ist, dann wird dessen Device in die Liste aufgenommen. Im Status des Moduls befinden sich danach alle Devices, deren Batterie-Reading länger nicht aktualisiert wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_batteriecheck DOIF init {[18:00];;set_State([?@:&amp;quot;&amp;quot;:&amp;quot;^[Bb]attery$&amp;quot;:ReadingsAge($name,$reading,0) &amp;gt; 3600*24,&amp;quot;keine&amp;quot;])}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Modul wird getriggert wenn ein beliebiges Device ein Event beginnend mit &amp;quot;temperature&amp;quot; sendet, es werden daraufhin alle Devices nach dem Reading &amp;quot;temperature&amp;quot; durchsucht und der maximale/minimale Wert im Reading max/min von di_min_max gespeichert.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_min_max DOIF\&lt;br /&gt;
{set_Reading(&amp;quot;max&amp;quot;,[#max:&amp;quot;:^temperature&amp;quot;:temperature])}\&lt;br /&gt;
{set_Reading(&amp;quot;min&amp;quot;,[#min:&amp;quot;:^temperature&amp;quot;:temperature])}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Für Umsteiger vom DOIF-FHEM-Modus==&lt;br /&gt;
Der Status des Moduls wird nicht vom Modul gesetzt, er kann vom Anwender mit Hilfe der Funktion &#039;&#039;&#039;set_State&#039;&#039;&#039; verändert werden, siehe spezifische Perl-Funktionen im Perl-Modus. FHEM-Befehle werden durch den Aufruf der Perlfunktion fhem(&amp;quot;...&amp;quot;) ausgeführt. Für den häufig genutzten fhem-Befehl &#039;&#039;&#039;set&#039;&#039;&#039; wurde eine kompatible Perlfunktion namens &#039;&#039;&#039;fhem_set&#039;&#039;&#039; definiert. Sie ist performanter und sollte bevorzugt verwendet werden, da das Parsen nach dem FHEM set-Befehl entfällt.&lt;br /&gt;
&lt;br /&gt;
Der Benutzer kann mit der Funktion &#039;&#039;&#039;set_Exec&#039;&#039;&#039; beliebig viele eigene Timer definieren, die unabhängig voneinander gesetzt und ausgewertet werden können, siehe spezifische Perl-Funktionen im Perl-Modus.&lt;br /&gt;
&lt;br /&gt;
Definitionen im FHEM-Modus mit do always-Attribut der Form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DOIF (&amp;lt;Bedingung mit Trigger&amp;gt;) (&amp;lt;FHEM-Befehle&amp;gt;) DOELSE (&amp;lt;FHEM-Befehle&amp;gt;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lassen sich wie folgt in Perl-Modus übertragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DOIF {if (&amp;lt;Bedingung mit Trigger&amp;gt;) {fhem(&amp;quot;&amp;lt;FHEM-Befehle&amp;gt;&amp;quot;)} else {fhem(&amp;quot;&amp;lt;FHEM-Befehle&amp;gt;&amp;quot;)}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Auswertung des eigenen Status (Zustandsauswertung), daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden. Elegant lässt sich das Problem der wiederholenden Ausführung bei zyklisch sendenden Sensoren mit Hilfe des Attributes &#039;&#039;&#039;DOIF_Readings&#039;&#039;&#039; lösen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Heizung soll bei einer Temperatur unter 21 Grad eingeschaltet werden, sonst soll sie ausgeschaltet werden. Das Unterschreiten bzw. Überschreiten der Wunschtemperatur wird über die Definition des Readings &#039;&#039;&#039;cold&#039;&#039;&#039; realisiert. Obwohl der Temperatursensor zyklisch seine Daten sendet, triggert das Reading &#039;&#039;&#039;cold&#039;&#039;&#039; das eigene Modul und führt zum Schalten der Heizung nur wenn sich sein Zustand (on/off) ändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_Threshold DOIF {                       \&lt;br /&gt;
if ([$SELF:cold] eq &amp;quot;on&amp;quot;) {  # wenn es kalt ist\&lt;br /&gt;
  fhem_set(&amp;quot;heating on&amp;quot;);;   # Heizung einschalten\&lt;br /&gt;
  set_State (&amp;quot;heating&amp;quot;);;    # Status auf &#039;heating&#039; setzen\&lt;br /&gt;
} else {                     # sonst\&lt;br /&gt;
  fhem_set(&amp;quot;heating off&amp;quot;);;  # Heizung ausschalten\&lt;br /&gt;
  set_State (&amp;quot;not heating&amp;quot;);;# Status auf &#039;not heating&#039; setzen\&lt;br /&gt;
} \&lt;br /&gt;
}&lt;br /&gt;
attr di_Threshold DOIF_Readings cold: ([room:temperature] &amp;lt; 21 ? &amp;quot;on&amp;quot; : &amp;quot;off&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es können beliebig viele Perl-Blöcke definiert werden, die unabhängig von einander durch einen oder mehrere Trigger ausgewertet und zur Ausführung führen können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DOIF&lt;br /&gt;
{ if (&amp;lt;Bedingung mit Triggern&amp;gt;) ... } ## erster Block&lt;br /&gt;
{ if (&amp;lt;Bedingung mit Triggern&amp;gt;) ... } ## zweiter Block&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einzelne Ereignis-/Zeittrigger, die nicht logisch mit anderen Bedingungen oder Triggern ausgewertet werden müssen, können auch ohne if-Anweisung angegeben werden, z. B.:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_einschalten DOIF\&lt;br /&gt;
{[&amp;quot;Daemmerung:on&amp;quot;];;fhem_set(&amp;quot;lamp on&amp;quot;)}\&lt;br /&gt;
{[08:00];;fhem_set(&amp;quot;radio on&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ereignis-/Zeittrigger sind intern Perlfunktionen, daher können sie an beliebiger Stelle im Perlcode angegeben werden, wo Perlfunktionen vorkommen dürfen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_log DOIF {Log 1,&amp;quot;state of lamp: &amp;quot;.[lamp:state]}&lt;br /&gt;
&lt;br /&gt;
defmod di_set_lamp DOIF {fhem_set(&amp;quot;lamp &amp;quot;.[remote:state])}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innerhalb eines Perlblocks sind beliebige Hierarchietiefen möglich, dabei kann der Trigger irgendwo innerhalb des Blocks vorkommen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DOIF&lt;br /&gt;
{ if (&amp;lt;Bedingung&amp;gt;) {&lt;br /&gt;
    if (&amp;lt;Bedingung&amp;gt;) {&lt;br /&gt;
      if (&amp;lt;Bedingung mit Triggern&amp;gt;...&lt;br /&gt;
        ...&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bemerkung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Innerhalb eines DOIF-Perl-Blocks muss mindestens ein Trigger definiert werden. Zu beachten ist, dass beim passenden Trigger nicht nur ein Zweig, sondern der gesamte Block ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
==Eigene Funktionen==&lt;br /&gt;
&lt;br /&gt;
Ein besonderer Perl-Block ist der Block namens &#039;&#039;&#039;subs&#039;&#039;&#039;. In diesem Block werden Perlfunktionen definiert, die innerhalb des DOIFs genutzt werden, sie befinden sich im Package DOIF und können in den folgenden Perl-Blöcken benutzt werden. Um eine möglichst hohe Kompatibilität zu Perl sicherzustellen, wird im &#039;&#039;&#039;subs-Block&#039;&#039;&#039; keine DOIF-Syntax in eckigen Klammern unterstützt, insb. gibt es keine Trigger, die den Block ausführen können.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DOIF subs { ## Definition von Perlfunktionen lamp_on und lamp_off&lt;br /&gt;
  sub lamp_on {&lt;br /&gt;
     fhem_set(&amp;quot;lamp on&amp;quot;);&lt;br /&gt;
     set_State(&amp;quot;on&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  sub lamp_off {&lt;br /&gt;
     fhem_set(&amp;quot;lamp off&amp;quot;);&lt;br /&gt;
     set_State(&amp;quot;off&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
{[06:00];lamp_on()}  ## Um 06:00 Uhr wird die Funktion lamp_on aufgerufen&lt;br /&gt;
{[08:00];lamp_off()} ## Um 08:00 Uhr wird die Funktion lamp_off aufgerufen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eigene Funktionen mit Parametern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unter Verwendung von Funktionsparameter lassen sich Definitionen oft vereinfachen, das obige Beispiel lässt sich mit Hilfe nur einer Funktion kürzer wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DOIF subs { ## Definition der Perlfunktion lamp&lt;br /&gt;
  sub lamp {&lt;br /&gt;
     my ($state)=@_;  # Variable $state mit dem Parameter belegen&lt;br /&gt;
     fhem_set(&amp;quot;lamp $state&amp;quot;);&lt;br /&gt;
     set_State($state);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
{[06:00];lamp(&amp;quot;on&amp;quot;)}  ## Um 06:00 Uhr wird die Funktion lamp mit Parameter &amp;quot;on&amp;quot; aufgerufen&lt;br /&gt;
{[08:00];lamp(&amp;quot;off&amp;quot;)} ## Um 08:00 Uhr wird die Funktion lamp mit dem Parameter &amp;quot;off&amp;quot; aufgerufen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigener Namensraum: DOIF==&lt;br /&gt;
&lt;br /&gt;
Der Namensraum im DOIF-Perl-Modus ist gekapselt. Selbstdefinierte Funktionen im DOIF-Device können nicht bereits existierende Perlfunktionen in FHEM (Namensraum main) überschreiben. Funktionen aus dem Namensraum &#039;&#039;&#039;main&#039;&#039;&#039; müssen mit vorangestelltem Doppelpunkt angegeben werden: &#039;&#039;&#039;::&amp;lt;perlfunction&amp;gt;&#039;&#039;&#039;. Variablen aus dem Namensraum &#039;&#039;&#039;main&#039;&#039;&#039; werden wie folgt angegeben: &#039;&#039;&#039;$::&amp;lt;Variablenname&amp;gt;&#039;&#039;&#039;-&lt;br /&gt;
&lt;br /&gt;
Eigene Perlfunktionen, die in myutils ausgelagert sind, befinden sich ebenfalls im Namensraum main. Wenn sie ausschließlich in DOIF-Devices benutzt werden sollen, so kann am Anfang vor deren Definition in myutils &#039;&#039;&#039;package DOIF;&#039;&#039;&#039; angegeben werden. In diesen Fall sind auch diese Funktion im DOIF-Device bekannt - sie können dann ohne vorangestellten Doppelpunkt genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Folgende FHEM-Perlfunktionen wurden ebenfalls im DOIF-Namensraum definiert, sie können, wie gewohnt ohne Doppelpunkt genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fhem, Log, Log3, InternVal, InternalNum, OldReadingsVal, OldReadingsNum, OldReadingsTimestamp, OldReadingsAge, ReadingsVal, ReadingsNum, ReadingsTimestamp, ReadingsAge, Value, OldValue, OldTimestamp, AttrVal, AttrNum&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Spezifische Perl-Funktionen im Perl-Modus==&lt;br /&gt;
Die folgenden Perl-Funktionen befinden sich im Package DOIF, sie können in der DOIF-Definition unmittelbar genutzt werden.&lt;br /&gt;
===FHEM-set-Befehl ausführen: &#039;&#039;&#039;fhem_set()&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
fhem_set(&amp;lt;content&amp;gt;); mit &amp;lt;content&amp;gt; Angaben des FHEM-set-Befehls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Lampe namens &#039;&#039;&#039;lamp&#039;&#039;&#039; ausschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
fhem_set(&amp;quot;lamp off&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
entspricht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
fhem(&amp;quot;set lamp off&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Aufruf der fhem_set-Funktion ist performanter, da das Parsen nach dem set-Befehl mit Hilfe der Funktion &#039;&#039;&#039;fhem&#039;&#039;&#039; entfällt.&lt;br /&gt;
&lt;br /&gt;
===Ein FHEM-Event auslösen: &#039;&#039;&#039;set_Event()&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Event(&amp;lt;Event&amp;gt;); mit &amp;lt;Event&amp;gt; das zu generierende FHEM-Event&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Generiere das Event &#039;&#039;&#039;on&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Event(&amp;quot;on&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eigenen Status setzen: &#039;&#039;&#039;set_State()&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_State(&amp;lt;value&amp;gt;,&amp;lt;trigger&amp;gt;); mit &amp;lt;trigger&amp;gt;: 0 ohne Trigger, 1 mit Trigger, &amp;lt;trigger&amp;gt; ist optional, default ist 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Status des eignen DOIF-Device auf &#039;&#039;&#039;on&#039;&#039;&#039; setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_State(&amp;quot;on&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Status des eigenen DOIF-Devices auslesen: &#039;&#039;&#039;get_State()&#039;&#039;&#039;===&lt;br /&gt;
Die Funktion besitzt keine Parameter.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Schalte Lampe namens &#039;&#039;&#039;lamp&#039;&#039;&#039; mit dem Status des eigenen DOIF-Devices:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
fhem_set(&amp;quot;lamp &amp;quot;.get_State());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Reading des eigenen DOIF-Devices setzen: &#039;&#039;&#039;set_Reading()&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Reading(&amp;lt;readingName&amp;gt;,&amp;lt;value&amp;gt;,&amp;lt;Event&amp;gt;); mit &amp;lt;Event&amp;gt;: 0 ohne Eventgenerierung, 1 mit Eventgenerierung, &amp;lt;Event&amp;gt; ist optional, default ist 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Reading(&amp;quot;weather&amp;quot;,&amp;quot;cold&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Reading des eigenen DOIF-Devices auslesen: &#039;&#039;&#039;get_Reading()&#039;&#039;&#039;===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Schalte Lampe mit dem Inhalt des Readings namens &#039;&#039;&#039;dim&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
fhem_set(&amp;quot;lamp &amp;quot;.get_Reading(&amp;quot;dim&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Setzen mehrerer Readings des eigenen DOIF-Devices in einem Eventblock===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Reading_Begin();&lt;br /&gt;
set_Reading_Update(&amp;lt;readingName&amp;gt;,&amp;lt;value&amp;gt;,&amp;lt;change&amp;gt;); &amp;lt;change&amp;gt; ist optional&lt;br /&gt;
set_Reading_End(&amp;lt;Event&amp;gt;); mit &amp;lt;Event&amp;gt;: 0 ohne Eventgenerierung, 1 mit Eventgenerierung&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die obigen Funktionen entsprechen den FHEM-Perlfunktionen: &#039;&#039;&#039;readingsBegin, readingsBulkUpdate, readingsEndUpdate&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Readings &#039;&#039;&#039;temperature&#039;&#039;&#039; und &#039;&#039;&#039;humidity&#039;&#039;&#039; sollen in einem Eventblock mit dem zuvor belegten Inhalt der Variablen &#039;&#039;&#039;$temp&#039;&#039;&#039; bzw. &#039;&#039;&#039;$hum&#039;&#039;&#039; belegt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Reading_Begin;&lt;br /&gt;
set_Reading_Update(&amp;quot;temperature&amp;quot;,$temp);&lt;br /&gt;
set_Reading_Update(&amp;quot;humidity&amp;quot;,$hum);&lt;br /&gt;
set_Reading_End(1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interne Timer==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von Timern können Perl-Anweisungen verzögert ein- oder mehrmalig ausgeführt werden. Im Gegensatz zum wait-Timer im DOIF-FHEM-Modus, können beliebig viele Timer gleichzeitig genutzt werden. Ein Timer wird mit einem Timer-Namen eindeutig definiert. Über den Timer-Namen kann die Restlaufzeit abgefragt werden, ebenfalls kann er vor seinem Ablauf gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
===Timer setzen: &#039;&#039;&#039;set_Exec()&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Exec(&amp;lt;timerName&amp;gt;, &amp;lt;seconds&amp;gt;, &amp;lt;perlCode&amp;gt;, &amp;lt;paramRef&amp;gt;, &amp;lt;condition&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;timerName&amp;gt;: beliebige Angabe, sie spezifiziert eindeutig einen Timer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seconds&amp;gt;: Verzögerungszeit, sie wird per eval-Perlbefehl ausgewertet und kann daher Perlcode zur Bestimmung der Verzögerungszeit beinhalten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;perlCode&amp;gt;: Perl-Anweisung, die nach Ablauf der Verzögerungszeit per eval-Perlbefehl ausgeführt wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;paramRef&amp;gt;: wird unter &amp;lt;perlCode&amp;gt; eine Perlfunktion angegeben, so kann optional hier eine Referenz auf den Übergabeparameter der Perlfunktion angegeben werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;condition&amp;gt;: optionale Bedingung zur Wiederholung der Perl-Ausführung. Sie wird per eval-Perlbefehl vor dem Setzen des Timers und vor der Ausführung der Perl-Anweisung auf wahr geprüft. Bei falsch wird die Wiederholung der Ausführungskette beendet. Wird &amp;lt;condition&amp;gt; nicht angegeben, so erfolgt keine Wiederholung der Perl-Anweisung.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;&#039;set_Exec&#039;&#039;&#039; mit dem gleichen Timer-Namen &#039;&#039;&#039;&amp;lt;timerName&amp;gt;&#039;&#039;&#039; vor seinem Ablauf erneut aufgerufen, so wird der laufender Timer gelöscht und neugesetzt.&lt;br /&gt;
&lt;br /&gt;
===Anwendungsbeispiele für einmalige verzögerte Ausführung===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Funktion namens &#039;&#039;&#039;lamp&#039;&#039;&#039; mit dem Übergabeparameter &#039;&#039;&#039;on&#039;&#039;&#039; 30 Sekunden verzögert aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Exec(&amp;quot;lamp_timer&amp;quot;,30,&#039;lamp(&amp;quot;on&amp;quot;)&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Lampe verzögert um 30 Sekunden ausschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Exec(&amp;quot;off_timer&amp;quot;,30,&#039;fhem_set(&amp;quot;lamp off&amp;quot;)&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Event &#039;&#039;&#039;off&#039;&#039;&#039; 30 Sekunden verzögert generieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Exec(&amp;quot;Event_timer&amp;quot;,30,&#039;set_Event(&amp;quot;off&amp;quot;)&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Funktion namens &#039;&#039;&#039;check_shutters&#039;&#039;&#039; wird mit einer Referenz auf ein zuvor definiertes Array namens &#039;&#039;&#039;shutters&#039;&#039;&#039; um 5 Sekunden verzögert ausgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set_Exec(&amp;quot;check_timer&amp;quot;,5,&amp;quot;check_shutters&amp;quot;,\@shutters);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anwendungsbeispiele mit bedingter Wiederholung einer Ausführung===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wenn Alarm ausgelöst wird, soll eine Benachrichtigung gesendet werden und alle 60 Sekunden wiederholt werden, solange Alarmanlage auf &#039;&#039;&#039;on&#039;&#039;&#039; steht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_alarm DOIF {[&amp;quot;alarm:on&amp;quot;];;fhem(&amp;quot;send myphone alarm!&amp;quot;);;set_Exec(&amp;quot;timer&amp;quot;,60,&#039;fhem(&amp;quot;send myphone alarm!&amp;quot;)&#039;,&#039;ReadingsVal(&amp;quot;alarm&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;on&amp;quot;) eq &amp;quot;on&amp;quot;&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wenn Taster auslöst, Lampe auf &#039;&#039;&#039;on&#039;&#039;&#039; schalten und noch zwei mal im Abstand von einer Sekunde wiederholt auf &#039;&#039;&#039;on&#039;&#039;&#039; schalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_lamp_on DOIF {[&amp;quot;button:on&amp;quot;];;fhem_set&amp;quot;lamp on&amp;quot;;;set_Exec(&amp;quot;timer&amp;quot;,1,&#039;fhem_set(&amp;quot;lamp on&amp;quot;)&#039;,&#039;$count &amp;lt; 2&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alternativ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_lamp_on DOIF {[&amp;quot;button:on&amp;quot;];;set_Exec(&amp;quot;timer&amp;quot;,&#039;$count == 0 ? 0 : 1&#039;,&#039;fhem_set(&amp;quot;lamp on&amp;quot;)&#039;,&#039;$count &amp;lt; 2&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$count&#039;&#039;&#039; ist eine interne Variable, die beginnend bei 0 nach jedem Durchlauf um eins erhöht wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wenn Fenster geöffnet wird, dann soll eine Benachrichtigung erfolgen, dabei soll die Benachrichtigung bis zu 10 mal jeweils um weitere 60 Sekunden verzögert werden: erste Benachrichtigung nach 5 Minuten, zweite Benachrichtigung nach weiteren 6 Minuten, dritte Benachrichtigung nach weiteren 7 Minuten usw.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_window DOIF {if ([window:state] eq &amp;quot;open&amp;quot;) {\&lt;br /&gt;
  set_Exec(&amp;quot;timer&amp;quot;,&#039;300+$count*60&#039;,&#039;fhem(&amp;quot;echo speak window open&amp;quot;)&#039;,&#039;$count &amp;lt; 9&#039;)\&lt;br /&gt;
} else {\&lt;br /&gt;
  del_Exec(&amp;quot;timer&amp;quot;)\&lt;br /&gt;
}\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pumpe alle zwei Stunden im Abstand von fünf Minuten 3 mal einschalten, beim ersten mal für 60 Sekunden, beim zweiten mal für 80 Sekunden und beim dritten mal für 100 Sekunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_pump DOIF {[08:00-20:00,+[2]:00];;set_Exec(&amp;quot;timer&amp;quot;,300,&#039;fhem_set(&amp;quot;pump on-for-timer &amp;quot;.60+$count*20)&#039;,&#039;$count &amp;lt; 3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hochdimmen beim Tastendruck im Sekundentakt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_dimm DOIF {[&amp;quot;button:on&amp;quot;];;@{$_pct}=(10,35,65,80,90,100);;set_Exec(&amp;quot;timer&amp;quot;,1,&#039;fhem_set&amp;quot;lamp pct &amp;quot;.$_pct[$count]&#039;,&#039;$count &amp;lt; 6&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$_pct&#039;&#039;&#039; ist hier ein Array mit Helligkeitswerten, auf das innerhalb des Devices zu jedem Zeitpunkt zugegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
===Restzeit des Timers bestimmen: &#039;&#039;&#039;get_Exec()&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
get_Exec(&amp;lt;timerName&amp;gt;); Returnwert: 0, wenn Timer abgelaufen oder nicht gesetzt ist, sonst Anzahl der Sekunden bis zum Ablauf des Timers&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Laufenden Timer löschen: &#039;&#039;&#039;del_Exec()&#039;&#039;&#039;===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
del_Exec(&amp;lt;timerName&amp;gt;); &amp;lt;timeName&amp;gt; Name des Timers&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==init-Block==&lt;br /&gt;
&lt;br /&gt;
Wird ein DOIF-Perl-Block mit dem Namen &#039;&#039;&#039;init&#039;&#039;&#039; benannt, so wird dieser Block beim Systemstart von FHEM ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Lampe um 22:00 Uhr oder wenn das FHEM-System hochgefahren wird ausschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_lamp_off DOIF init {[22:00];;fhem_set(&amp;quot;lamp off&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Device-Variablen==&lt;br /&gt;
&lt;br /&gt;
Device-Variablen sind sogenannte Instanzvariablen, die global innerhalb eines DOIF-Devices genutzt werden können. Deren Inhalt bleibt von Trigger zu Trigger während der Laufzeit des System erhalten. Sie beginnen mit &#039;&#039;&#039;$_&#039;&#039;&#039; und müssen nicht mit &#039;&#039;&#039;my&#039;&#039;&#039; deklariert werden. Intern handelt es sich um hash-Variablen des jeweiligen DOIF-Devices.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_var DOIF\&lt;br /&gt;
init {$_myvalue=10}                                    ## nach dem Starten des FHEM-System Variable namens $_myvalue mit dem Wert 10 initialisieren\&lt;br /&gt;
{[+:30];;fhem_set(&amp;quot;mydevice $_myvalue&amp;quot;);;$_myvalue++}  ## alle 30 Minuten set mydevice mit dem Wert von $_myvalue ausführen und diesen anschließend um eins erhöhen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Instanzvariable nicht initialisiert wird, gilt sie als nicht definiert. Das lässt sich mit dem Perlbefehl &#039;&#039;&#039;define&#039;&#039;&#039; abfragen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
if (!defined $_value) ($_value=30);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instanzvariablen überleben nicht den Neustart, sie können jedoch z.B. im init-Block, der beim Systemstart von FHEM ausgewertet wird, mit Inhalten aus Readings initialisiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Initialisierung einer Instanzvariablen namens &#039;&#039;&#039;$_status&#039;&#039;&#039; beim Systemstart mit dem Status des Moduls:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
init {$_status=get_State()}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instanzvariablen lassen sich wie Perl-Hashes indizieren:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $i=0;&lt;br /&gt;
$_betrag{$i}=100;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder mit konkreten Angaben hier &#039;&#039;&#039;heute&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$_betrag{heute}=100;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Blockierende Funktionsaufrufe (blocking calls)==&lt;br /&gt;
&lt;br /&gt;
DOIF verwaltet blockierende Funktionsaufrufe, d.h. die in diesem Zusammenhang gestarteten FHEM-Instanzen werden gelöscht, beim Herunterfahren (&#039;&#039;&#039;shutdown&#039;&#039;&#039;), Wiedereinlesen der Konfiguration (&#039;&#039;&#039;rereadcfg&#039;&#039;&#039;) Änderung der Konfiguration (&#039;&#039;&#039;modify&#039;&#039;&#039;) und Deaktivieren des Gerätes (&#039;&#039;&#039;disabled&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Die Handhabung von blockierenden Funktionsaufrufen ist im FHEMwiki erklärt, s. Blocking Call.&lt;br /&gt;
&lt;br /&gt;
Der von der Funktion BlockingCall zurückgegebene Datensatz ist unterhalb von &#039;&#039;&#039;$_blockingcalls&#039;&#039;&#039; abzulegen, z.B.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$_blockingcalls{&amp;lt;blocking call name&amp;gt;} = ::BlockingCall(&amp;lt;blocking function&amp;gt;, &amp;lt;argument&amp;gt;, &amp;lt;finish function&amp;gt;, &amp;lt;timeout&amp;gt;, &amp;lt;abort function&amp;gt;, &amp;lt;abort argument&amp;gt;) unless(defined($_blockingcalls{&amp;lt;blocking call name&amp;gt;}));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für unterschiedliche blockierende Funktionen ist jeweils ein eigener Name (&#039;&#039;&#039;&amp;lt;blocking call name&amp;gt;&#039;&#039;&#039;) unterhalb von &#039;&#039;&#039;$_blockingcalls&#039;&#039;&#039; anzulegen.&lt;br /&gt;
&lt;br /&gt;
Wenn &#039;&#039;&#039;&amp;lt;blocking function&amp;gt;&#039;&#039;&#039;, &#039;&#039;&#039;&amp;lt;finish function&amp;gt;&#039;&#039;&#039; und &#039;&#039;&#039;&amp;lt;abort function&amp;gt;&#039;&#039;&#039; im Package DOIF definiert werden, dann ist dem Funktionsnamen DOIF:: voranzustellen, im Aufruf der Funktion BlockingCall, z.B. &#039;&#039;&#039;DOIF::&amp;lt;blocking function&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$_blockingcalls&#039;&#039;&#039; ist eine für DOIF reservierte Variable und darf nur in der beschriebener Weise verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Nutzbare Attribute im Perl-Modus==&lt;br /&gt;
Folgende Auswahl an Attributen ist im DOIF-Perl-Modus nutzbar:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;addStateEvent   checkReadingEvent   DOIF_Readings   disable   event_Readings   notexist   readingList   setList   uiTable   uiState   weekdays readingFnAttributes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktionsweise der Attribute kann im DOIF-FHEM-Modus nachgeschlagen werden.&lt;br /&gt;
&lt;br /&gt;
==set-Befehle im Perl-Modus==&lt;br /&gt;
===set &amp;lt;name&amp;gt; disable===&lt;br /&gt;
&lt;br /&gt;
blockiert die Befehlsausführung&lt;br /&gt;
&lt;br /&gt;
===set &amp;lt;name&amp;gt; enable===&lt;br /&gt;
&lt;br /&gt;
aktiviert die Befehlsausführung&lt;br /&gt;
&lt;br /&gt;
===set &amp;lt;name&amp;gt; &amp;lt;Blockname&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
führt den entsprechenden DOIF-Perl-Block unmittelbar aus&lt;br /&gt;
==FOR-Schleife==&lt;br /&gt;
Mit Hilfe der FOR-Schleife kann ein Template in einer Schleife mehrfach aufgerufen werden. Damit können mit einer Parameterliste gleiche Abläufe für verschiedene Szenarien erstellt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
FOR (&amp;lt;Array&amp;gt;,&amp;lt;Template&amp;gt;($_$1,$_$2,...)) mit $_$1 erstes Element des Arrays, $_$2 zweites Element des Arrays usw. der jeweiligen Zeile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Lichtsteuerung für mehrere Szenarien&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_light DOIF subs  {\&lt;br /&gt;
## In einem Array namens $_sc wird pro Szenario eine Definitionszeile mit Parametern erstellt \&lt;br /&gt;
##             Zeitspanne                          Einschaltbefehl              Ausschaltbefehl\&lt;br /&gt;
push (@{$_sc},[&amp;quot;[06:25-08:00|8] or [18:00-23:30]&amp;quot;, &amp;quot;Lampekueche,Lampeflur on&amp;quot;, &amp;quot;Lampekueche,Lampeflur off&amp;quot;]);;\&lt;br /&gt;
push (@{$_sc},[&amp;quot;[06:25-08:00|8] or [18:00-22:10]&amp;quot;, &amp;quot;schrank2 on&amp;quot;,              &amp;quot;schrank2 off&amp;quot;]);;\&lt;br /&gt;
## Das Array kann um weitere Szenarien mit Hilfe des push-Befehls erweitert werden \&lt;br /&gt;
} \&lt;br /&gt;
## Template zur Steuerung des Lichtes für ein Szenario\&lt;br /&gt;
DEF TPL_light ( \&lt;br /&gt;
{                   ## Perl-Block \&lt;br /&gt;
  if ($1) {         ## In der Zeitspanne \&lt;br /&gt;
    fhem_set(&amp;quot;$2&amp;quot;)  ## Licht einschalten \&lt;br /&gt;
  } else { \&lt;br /&gt;
    fhem_set(&amp;quot;$3&amp;quot;)  ## Licht ausschalten \&lt;br /&gt;
  } \&lt;br /&gt;
}                   ## Ende des Perl-Blocks \&lt;br /&gt;
)                   ## Ende von TPL_light \&lt;br /&gt;
\&lt;br /&gt;
## Mit Hilfe der FOR-Schleife wird das Array $_sc durchlaufen, für jede Szene (Zeile des Arrays) wird das oben definierte Template mit den Parametern der Szene: Zeitspanne $_$1, Einschaltbefehl $_$2 und Ausschaltbefehl $_$2 aufgerufen \&lt;br /&gt;
\&lt;br /&gt;
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3)) \&lt;br /&gt;
\&lt;br /&gt;
## Die FOR-Schleife ruft auf: \&lt;br /&gt;
## TPL_light(&amp;quot;[06:25-08:00|8] or [18:00-23:30]&amp;quot;, &amp;quot;Lampekueche,Lampeflur on&amp;quot;, &amp;quot;Lampekueche,Lampeflur off&amp;quot;) \&lt;br /&gt;
## TPL_light(&amp;quot;[06:25-08:00|8] or [18:00-22:10]&amp;quot;, &amp;quot;schrank2 on&amp;quot;,              &amp;quot;schrank2 off&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Vorgehensweise können weitere Szenarien durch Hinzufügen einer Array-Zeile erstellt werden, ohne den restlichen Code anpassen zu müssen. Desweitern können die Elemente des Arrays für Visualisierungszwecke über das [https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg uiTable-Attribut] genutzt werden, siehe: [https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht Helligkeitsabhängige Lichtsteuerung mit Web-Oberfläche]&lt;br /&gt;
&lt;br /&gt;
==Einfache Anwendungsbeispiele==&lt;br /&gt;
&lt;br /&gt;
===Treppenhauslicht mit Bewegungsmelder===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_light DOIF {\&lt;br /&gt;
  if ([&amp;quot;FS:motion&amp;quot;]) {                          # bei Bewegung\&lt;br /&gt;
    fhem_set(&amp;quot;lamp on&amp;quot;) if ([?lamp] ne &amp;quot;on&amp;quot;);;  # Lampe einschalten, wenn sie nicht an ist\&lt;br /&gt;
    set_Exec(&amp;quot;off&amp;quot;,30,&#039;fhem_set(&amp;quot;lamp off&amp;quot;)&#039;);; # Timer namens &amp;quot;off&amp;quot; für das Ausschalten der Lampe auf 30 Sekunden setzen bzw. verlängern\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Einknopf-Fernbedienung===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Taste innerhalb von zwei Sekunden zwei mal betätig wird, soll der Rollladen nach oben, bei einem Tastendruck nach unten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_shutter DOIF {\&lt;br /&gt;
  if ([&amp;quot;FS:^on$&amp;quot;] and !get_Exec(&amp;quot;shutter&amp;quot;)){          # wenn Taste betätigt wird und kein Timer läuft\&lt;br /&gt;
    set_Exec(&amp;quot;shutter&amp;quot;,2,&#039;fhem_set(&amp;quot;shutter down&amp;quot;)&#039;);;#Timer zum shutter down auf zwei Sekunden setzen\&lt;br /&gt;
  } else {                                            # wenn Timer läuft, d.h. ein weitere Tastendruck innerhalb von zwei Sekunden\&lt;br /&gt;
    del_Exec(&amp;quot;shutter&amp;quot;);;                             # Timer löschen\&lt;br /&gt;
    fhem_set(&amp;quot;shutter up&amp;quot;);;                          # Rollladen hoch\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aktion auslösen, wenn innerhalb einer bestimmten Zeitspanne ein Ereignis x mal auftritt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod di_count DOIF {\&lt;br /&gt;
  if ([&amp;quot;FS:on&amp;quot;] and !get_Exec(&amp;quot;counter&amp;quot;)) {                                           # wenn Ereignis (hier &amp;quot;FS:on&amp;quot;) eintritt und kein Timer läuft\&lt;br /&gt;
    $_my_count=1;;                                                                    # setze count-Variable auf 1\&lt;br /&gt;
    set_Exec(&amp;quot;counter&amp;quot;,3600,&#039;Log (3,&amp;quot;count: $_my_count action&amp;quot;) if ($_my_count &amp;gt; 10)&#039;);; # setze Timer auf eine Stunde zum Protokollieren der Anzahl der Ereignisse, wenn sie über 10 ist\&lt;br /&gt;
  } else {\&lt;br /&gt;
    $_my_count++;;                                                                    # wenn Timer bereits läuft zähle Ereignis\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weitere Anwendungsbeispiele im DOIF-Perl-Modus==&lt;br /&gt;
===[https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien Lichtsteuerung für mehrere Szenarien]===&lt;br /&gt;
===[https://wiki.fhem.de/wiki/DOIF/Automatisierung#Zeitgesteuerte_Heizungsregelung_mit_Hilfe_von_Raumthermostaten Steuerung von Raumthermostaten für mehrere Räume]===&lt;br /&gt;
===[https://wiki.fhem.de/wiki/DOIF/Automatisierung#Beschattungssteuerung_abh.C3.A4ngig_von_der_Zimmertemperatur_und_Sonneneinstrahlung_f.C3.BCr_mehrere_Szenarien Beschattungssteuerung für mehrere Szenarien]===&lt;br /&gt;
===[https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzahl_der_Tage_bis_zur_Abfall-Entsorgung Abfallentsorgung]===&lt;br /&gt;
===[https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung_und_Steuerung:_Heiztherme Heiztherme]===&lt;br /&gt;
===[https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung:_Anwesenheitsstatus Anwesenheitsstatus]===&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-FSR61VA-10A-Stromsto%C3%9F-Schaltrelais_mit_Strommessung&amp;diff=38494</id>
		<title>EnOcean-FSR61VA-10A-Stromstoß-Schaltrelais mit Strommessung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-FSR61VA-10A-Stromsto%C3%9F-Schaltrelais_mit_Strommessung&amp;diff=38494"/>
		<updated>2023-07-13T06:55:19Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Links */ Link zum Datenblatt war tot - aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=FSR61VA-10A.JPG&lt;br /&gt;
|Bildbeschreibung=Eltako FSR61VA-10A &lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Empfänger, Aktor, Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=1 Schaltkanal, 2 EnOcean IDs (bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Standby: 0,8W&lt;br /&gt;
|HWPoweredBy=230V~&lt;br /&gt;
|HWSize= 45mm lang, 55mm breit, 33mm tief&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Eltako&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-FSR61VA-10A-Stromstoß-Schaltrelais mit Strommessung&#039;&#039;&#039; (FSR61VA) sind in einem Gehäuse für Einbaumontage&lt;br /&gt;
zwei FHEM-Device:&lt;br /&gt;
# Ein Schalt-Kanal mit 10A maximalem Schaltstrom (2000W Glühlampen)&lt;br /&gt;
# Sensor für Scheinleistung&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== Relais ===&lt;br /&gt;
(ER)&lt;br /&gt;
solange es ein Steuersignal gibt, bleibt der Kontakt geschlossen, ohne Steuersignal ist der Kontakt geöffnet&lt;br /&gt;
=== Einschaltwischrelais ===&lt;br /&gt;
(EW) &lt;br /&gt;
Der Kontakt schließt mit dem Steuersignal und öffnet nach der eingestellten Wischzeit  - auch wenn das Steuersignal noch an ist. Die Wischzeit (0 - 120 Sekunden) ist für alle Kanäle gleich und wird am oberen Drehschalter eingestellt&lt;br /&gt;
=== Stromstoßschalter ===&lt;br /&gt;
(ES)&lt;br /&gt;
Mit jedem Steuerimpuls schaltet der Kanal ein -&amp;gt; aus bzw. aus -&amp;gt; ein ...&amp;quot;toggle&amp;quot;. &lt;br /&gt;
=== Stromstoßschalter mit Rückfallverzögerung ===&lt;br /&gt;
(ESV)&lt;br /&gt;
Mit jedem Steuerimpuls schaltet der Kanal ein -&amp;gt; aus bzw. aus -&amp;gt; ein ...&amp;quot;toggle&amp;quot;. Am oberen Drehschalter kann für alle Kanäle die gleiche Rückfallverzögerungszeit (0-120 Minuten) eingestellt werden.&lt;br /&gt;
Tasterdauerlicht: Wird der Taster länger als eine Sekunde gedrückt, bleibt der Schalter für 2 Stunden geschlossen und schaltet danach ab.&lt;br /&gt;
Ausschaltvorwarnung: Ist diese aktiviert, wird 30 Sekunden vor dem endgültigen Ausschalten, 3 Mal kurz ausgeschaltet&lt;br /&gt;
&lt;br /&gt;
=== Scheinleistungmessung ===&lt;br /&gt;
Messbereich: 10VA bis 2300VA&lt;br /&gt;
=== Einlernbare Sensoren ===&lt;br /&gt;
* Funktaster (siehe auch FHEM Attribut [http://fhem.de/commandref.html#switchType switchType])&lt;br /&gt;
** Richtungstaster (eine Taste für EIN, eine Taste für AUS)&lt;br /&gt;
** Universaltaster (eine Taste für EIN und AUS -&amp;gt; toggle)&lt;br /&gt;
** Zentraltaster (eine Taste für EIN, eine Taste für AUS, Zentraltaster haben Priorität vor anderen Tastern -&amp;gt; ist der Zentraltaster EIN, kann mit Richtungstastern und Universaltastern nicht AUS geschaltet werden)&lt;br /&gt;
* Funkbewegungshelligkeitssensoren&lt;br /&gt;
* Funkhelligkeitssensoren&lt;br /&gt;
* Funkfenster-Tür-Kontakte&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Minimalkonfiguration ===&lt;br /&gt;
==== Aktor ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define EnO_switch_FSR61VA EnOcean FFAABBC0      --&amp;gt; EnO_switch_FSR61VA ist ein frei gewählter eindeutiger Name&lt;br /&gt;
                                                       für das FHEM-Device.&lt;br /&gt;
                                                       FFAABBC0 ist die erste am Boden des FSR61VA aufgedruckte SenderID. &lt;br /&gt;
                                                       Damit sendet das FSR61VA den Schaltzustand (B0/BI --&amp;gt; ein/aus)&lt;br /&gt;
attr EnO_switch_FSR61VA IODev TCM310_0              --&amp;gt; TCM310_0 ist der Name des Devices, mit dem FHEM EnOcean-Funk &lt;br /&gt;
                                                       sendet und empfängt.&lt;br /&gt;
attr EnO_switch_FSR61VA subDef getNextID            --&amp;gt; &amp;quot;getNextID&amp;quot; ersetzt FHEM automatisch durch eine freie SenderID des TCMs. Damit sendet FHEM an den FSR61VA&lt;br /&gt;
attr EnO_switch_FSR61VA subType switch                --&amp;gt; es handelt sich um einen EnOcean Schalter (der kann A0, AI, B0, BI,...)&lt;br /&gt;
attr EnO_switch_FSR61VA switchMode pushbutton  --&amp;gt; als &amp;quot;pushbutton&amp;quot; sendet FHEM bei einem &lt;br /&gt;
                                                       &amp;quot;set EnO_switch_FSR61VA B0&amp;quot; nach dem Kommando (B0) noch ein &amp;quot;release&amp;quot;.&lt;br /&gt;
                                                       Das braucht&#039;s, wenn der FSR61VA als ES oder ESV betrieben wird.&lt;br /&gt;
                                                       Sonst wird jedes &amp;quot;set&amp;quot;-Kommando vom FSR61VA als  &lt;br /&gt;
                                                       &amp;quot;länger als eine Sekunde gedrückt&amp;quot; interpretiert -&amp;gt; &amp;quot;Tasterdauerlicht&amp;quot;.&lt;br /&gt;
                                                       Beim Betrieb als &amp;quot;ER&amp;quot; wird das Attribut &amp;quot;switchMode&amp;quot; nicht angegeben (&amp;quot;ER&amp;quot;&lt;br /&gt;
                                                       passt gut, wenn der FSR61VA exklusiv via FHEM bedient wird.)&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scheinleistungssensor ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define EnO_sensor_FSR61VA EnOcean FFAABBC1         --&amp;gt; EnO_sensor_FSR61VA ist ein frei gewählter eindeutiger Name&lt;br /&gt;
                                                       für das FHEM-Device.&lt;br /&gt;
                                                       FFAABBC1 ist die zweite am Boden des FSR61VA aufgedruckte SenderID. &lt;br /&gt;
                                                       Damit sendet das FSR61VA die gemessene Scheinleistung in Watt.&lt;br /&gt;
attr EnO_sensor_FSR61VA IODev TCM310_0&lt;br /&gt;
attr EnO_sensor_FSR61VA subType autoMeterReading.01 --&amp;gt; es handelt sich um einen EnOcean Automated meter reading (AMR),&lt;br /&gt;
                                                        Electricity (EEP A5-12-01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definition des Logs für den Sensor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define FileLog_EnO_sensor_FSR61VA FileLog ./log/EnO_sensor_FSR61VA-%Y.log EnO_sensor_FSR61VA:power:.*&lt;br /&gt;
attr FileLog_EnO_sensor_FSR61VA logtype text&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FileLog_EnO_sensor_FSR61VA ist der FHEM-Name des Logs&lt;br /&gt;
* ./log/EnO_sensor_FSR61VA-%Y.log beschreibt, dass&lt;br /&gt;
** im Verzeichnis &amp;quot;log&amp;quot; die Logdateien angelegt werden&lt;br /&gt;
** es wird jedes Jahr (&amp;quot;-%Y&amp;quot;) eine neue Datei erstellt&lt;br /&gt;
** die Logdatei hat im Jahr 2014 den Namen: EnO_sensor_FSR61VA-2014.log&lt;br /&gt;
* EnO_sensor_FSR61VA:power:.* gibt an, dass nur Zeilen mit &amp;quot;EnO_sensor_FSR61VA power:&amp;quot; ins Log aufgenommen werden&lt;br /&gt;
&lt;br /&gt;
Auszug aus dem Log des Sensors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2014-07-25_23:27:30 EnO_sensor_FSR61VA power: 21&lt;br /&gt;
2014-07-25_23:28:44 EnO_sensor_FSR61VA power: 0&lt;br /&gt;
2014-07-25_23:33:07 EnO_sensor_FSR61VA power: 21&lt;br /&gt;
2014-07-25_23:33:23 EnO_sensor_FSR61VA power: 0&lt;br /&gt;
2014-07-25_23:43:28 EnO_sensor_FSR61VA power: 0&lt;br /&gt;
2014-07-25_23:53:32 EnO_sensor_FSR61VA power: 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FHEM Device in FSR61VA einlernen ===&lt;br /&gt;
Damit der FSR61VA auf FHEM reagieren kann (Ein/Ausschalten), wird das FHEM-Device EnO_switch_FSR61VA in den FSR61VA als Richtungstaster (bzw. Taster ein/aus) eingelernt:&lt;br /&gt;
# Unterer Drehschalter je nach Produktionswoche des FSR61VA (aufgedruckt):&lt;br /&gt;
## bis KW 2/13: &amp;quot;ca. Mitte&amp;quot; (Taster Ein/Aus einlernen)&lt;br /&gt;
## ab KW 3/13 bis KW 10/14: &amp;quot;60&amp;quot; (Taster Ein/Aus einlernen)&lt;br /&gt;
## ab KW 11/14: &amp;quot;40&amp;quot; (Richtungstaster einlernen)&lt;br /&gt;
# Oberer Funktions-Drehschalter: &amp;quot;LRN&amp;quot; (LED blinkt)&lt;br /&gt;
# FHEM Eingabefeld: „set EnO_switch_FSR61VA B0“, &amp;amp;lt;Enter&amp;amp;gt; (LED erlischt)&lt;br /&gt;
# Oberer Funktions-Drehschalter: Eine der ESV-Einstellungen&lt;br /&gt;
# Unterer Funktions-Drehschalter: auf &amp;quot;oo&amp;quot; einstellen (unendlich)&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== FSR61VA im Webfrontend anzeigen und schalten ===&lt;br /&gt;
Ziel: Eine an das FSR61VA angeschlossene Lampe an der Stiege soll aus dem FHEM Webfrontend ein- und ausgeschaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Die minimale FHEM Config für [[#Aktor|FSR61VA Aktor]] hat für dieses Beispiel noch folgende Schwächen:&lt;br /&gt;
# Im Webfrontend wird der Status des FSR61VA als B0 (ein) oder BI (aus) angezeigt -&amp;gt; wünschenswert wären &amp;quot;on&amp;quot; bzw &amp;quot;off&amp;quot;&lt;br /&gt;
===== Visualisierung verbessern =====&lt;br /&gt;
Ein Möglichkeit B0/BI auf on/off zu ändern ist das Attribut [http://fhem.de/commandref_DE.html#eventMap eventMap]&lt;br /&gt;
&amp;lt;pre&amp;gt;attr EnO_switch_FSR61VA eventMap BI:off B0:on&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Name im Webfrontend könnte vielsprechender sein:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr EnO_switch_FSR61VA alias Treppenlicht&amp;lt;/pre&amp;gt;&lt;br /&gt;
FHEM kommt mit Icons...&lt;br /&gt;
&amp;lt;pre&amp;gt;attr EnO_switch_FSR61VA icon light_stairs&amp;lt;/pre&amp;gt;&lt;br /&gt;
Icon abhängig ob on/off:&lt;br /&gt;
* wenn &amp;quot;on&amp;quot; dann gelb (@yellow)&lt;br /&gt;
* wenn &amp;quot;on&amp;quot; dann beim Klick auf das Icon: &amp;quot;off&amp;quot; (:off)&lt;br /&gt;
&amp;lt;pre&amp;gt;attr EnO_switch_FSR61VA devStateIcon on:light_stairs@yellow:off off:light_stairs@white:on&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;quot;group&amp;quot; fasst noch die Gruppe der Lichter zusammen&lt;br /&gt;
&amp;lt;pre&amp;gt;attr EnO_switch_FSR61VA group Licht&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FHEM-Device EnO_switch_FSR61VA in FSR61VA einlernen ====&lt;br /&gt;
Das FSR61VA wird als ES verwendet.&lt;br /&gt;
Einlernvorgang siehe [[#FHEM Device in FSR61VA einlernen|oben]].&lt;br /&gt;
==== Ergebnis ====&lt;br /&gt;
[[Image:ScreenshotWebFrontendFSR61VA.png]]&lt;br /&gt;
&lt;br /&gt;
Klick auf das linke Icon öffnet die Details zum FHEM Device.&lt;br /&gt;
Klick auf das rechte Icon ändert den Status vom Treppenlicht: EIN -&amp;gt; AUS bzw. AUS -&amp;gt; EIN.&lt;br /&gt;
Klick auf &amp;quot;on&amp;quot; schaltet das Treppenlicht definiert ein.&lt;br /&gt;
Klick auf &amp;quot;off&amp;quot; schaltet das Treppenlicht definiert aus.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt: [https://www.eltako.com/fileadmin/downloads/de/datenblatt/Datenblatt_FSR61VA-10A.pdf PDF]&lt;br /&gt;
* Anleitung: [https://www.eltako.com/de/product/professional-standard/drehstromzaehler-und-wechselstromzaehler/fsr61va-10a/ PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
[[Kategorie:Energieverbrauchsmessung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=38427</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=38427"/>
		<updated>2023-06-28T14:38:02Z</updated>

		<summary type="html">&lt;p&gt;50watt: Secu-Signal Fentergriff hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
== Mögliche Mappings ==&lt;br /&gt;
Die Möglichen Mappings können hier nachgelesen werden https://github.com/KhaosT/HAP-NodeJS/tree/master/src/lib/gen  insbesondere in HomeKit.ts.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
 Characteristic.Brightness = function() {&lt;br /&gt;
  Characteristic.call(this, &#039;Brightness&#039;, &#039;00000008-0000-1000-8000-0026BB765291&#039;);&lt;br /&gt;
  this.setProps({&lt;br /&gt;
    format: Characteristic.Formats.INT,&lt;br /&gt;
    unit: Characteristic.Units.PERCENTAGE,&lt;br /&gt;
    maxValue: 100,&lt;br /&gt;
    minValue: 0,&lt;br /&gt;
    minStep: 1,&lt;br /&gt;
    perms: [Characteristic.Perms.READ, Characteristic.Perms.WRITE, Characteristic.Perms.NOTIFY]&lt;br /&gt;
  });&lt;br /&gt;
  this.value = this.getDefaultValue();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Das Mapping in diesem Fall, hat den Titel Brightness.&lt;br /&gt;
&lt;br /&gt;
Die Werte können in 1er Schritten zwischen 0 und 100 liegen (max und min Value)&lt;br /&gt;
== Erstellung eines HomebridgeMappings am Beispiel &amp;quot;Feuchtesensor&amp;quot; ==&lt;br /&gt;
Zum Einstieg etwas leicht nachvollziehbares. &lt;br /&gt;
&lt;br /&gt;
Feuchtesensoren haben in der Regel ein &amp;quot;humidity&amp;quot; Reading, im Falle des Opus XT300 Bodenfeuchtesensors auch Temperatur und Batterie Level. Homekit unterstützt einen &amp;quot;HumiditySensor&amp;quot; Service. Dieser ist in homebridge-fhem nicht standardmäßig vorhanden (kann also nicht aus dem dropdown ausgewählt werden, sondern muss über das Befehlsfeld zugewiesen werden):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor genericDeviceType HumiditySensor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt werden die Readings gemappt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor homebridgeMapping clear CurrentRelativeHumidity=humidity StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW CurrentTemperature=temperature&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;löscht default mappings - das wird in der Regel nicht notwendig sein, schadet aber nicht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CurrentRelativeHumidity&amp;lt;/code&amp;gt; ist die relevante Homekit Characteristic - wird mit dem entsprechenden Reading des Sensors gemappt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;StatusLowBattery&amp;lt;/code&amp;gt; erwartet entweder BATTERY_LEVEL_NORMAL oder _LOW. Mein Sensor liefert ok zurück, wenn alles gut ist, also wird &amp;quot;ok&amp;quot; auf _NORMAL gemappt, alles andere auf _LOW. &lt;br /&gt;
&lt;br /&gt;
Der Opus XT300 Bodenfeuchtesensors liefert auch noch die Temperatur - der HumiditySensor Service sieht das eigentlich nicht vor, daher wird die Temperatur auch nicht in der Apple &amp;quot;Home&amp;quot; App angezeigt. Bei Eve wird die Temperatur hingegen berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
== BRAVIA Fernseher ==&lt;br /&gt;
Ein Beispiel homebridgeMapping für Sony Bravia Fernseher (iOS 12.2 beta!) und genericDeviceType Television:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear&lt;br /&gt;
ConfiguredName:model&lt;br /&gt;
Active:state,values=off:INACTIVE;on:ACTIVE,cmds=ACTIVE:on;INACTIVE:off&lt;br /&gt;
RemoteKey:key,cmds=REWIND:remoteControl+Rewind;FAST_FORWARD:remoteControl+FastForward;NEXT_TRACK:remoteControl+NEXT_TRACK;PREVIOUS_TRACK:remoteControl+PREVIOUS_TRACK;ARROW_UP:remoteControl+Up;ARROW_DOWN:remoteControl+Down;ARROW_LEFT:remoteControl+Left;ARROW_RIGHT:remoteControl+Right;SELECT:remoteControl+Ok;BACK:remoteControl+RETURN;EXIT:remoteControl+Exit;PLAY_PAUSE:remoteControl+Play;INFORMATION:remoteControl+Info&lt;br /&gt;
SleepDiscoveryMode:default=ALWAYS_DISCOVERABLE&lt;br /&gt;
ClosedCaptions:default=0&lt;br /&gt;
DisplayOrder:default=Test1&lt;br /&gt;
CurrentMediaState:default=0:currentTitle&lt;br /&gt;
TargetMediaState:default=0,cmds=PLAY:remoteControl+play;PAUSE:remoteControl+pause;STOP:remoteControl+stop;&lt;br /&gt;
PictureMode:default=1&lt;br /&gt;
PowerModeSelection:default=1,cmds=0:remoteControl+options&lt;br /&gt;
ActiveIdentifier:input,default=0,values=/tv.dvbt|TV...DVB-T/:1;/HDMI.3/:2,cmds=1:input+TV+/+DVB-T;2:input+HDMI+3/ARC;3:application+Plex&lt;br /&gt;
TelevisionSpeaker#Mute=mute&lt;br /&gt;
 Active:default=ACTIVE&lt;br /&gt;
 VolumeSelector:volume,cmds=INCREMENT:VolumeUp;DECREMENT:VolumeDown&lt;br /&gt;
 VolumeControlType:default=RELATIVE_WITH_CURRENT&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(1)#Identifier:default=1&lt;br /&gt;
 ConfiguredName:default=TV&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=TUNER&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(2)#Identifier:default=2&lt;br /&gt;
 ConfiguredName:default=APPLE+TV&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=HDMI&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(3)#Identifier:default=3&lt;br /&gt;
 ConfiguredName:default=PLEX&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=APPLICATION&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit lässt sich der Fernseher über Siri/Homekit ein- und ausschalten sowie über das appleTV Control-Center Widget steuern.&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus {{Link2Forum|Topic=48558|Message=402024|LinkText=homebridge/homekit}}&lt;br /&gt;
== EnOcean Secu-Signal Fenstergriff ==&lt;br /&gt;
Der [[EnOcean-SecuSignal-Fenstergriff|Secu-Signal Fenstergriff]] liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; beziehungsweise &amp;lt;code&amp;gt;open_from_tilted&amp;lt;/code&amp;gt;, wenn das Fenster offen ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen ist. Ist das Fenster gekippt, wird der Status &amp;lt;code&amp;gt;tilted&amp;lt;/code&amp;gt; gesetzt. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren.&lt;br /&gt;
Die Integration in HomeKit via HomeBridge erfordert zwei weitere Attribute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr SecuSignal genericDeviceType window&lt;br /&gt;
attr SecuSignal homebridgeMapping CurrentPosition=state,values=closed:0;open:100;tilted:75;open_from_tilted:100; TargetPosition=state,values=open:100;closed:0;tilted:75;open_from_tilted:100;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 6.2&lt;br /&gt;
 Homebridge 1.6.1&lt;br /&gt;
 homebridge-fhem v0.5.38&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus {{Link2Forum|Topic=48558|Message=402024|LinkText=homebridge/homekit}}&lt;br /&gt;
&lt;br /&gt;
Eine noch etwas bessere Schaltmöglichkeit bietet &#039;&#039;&#039;genericDeviceType security&#039;&#039;&#039;.&lt;br /&gt;
Das Mapping für ROOMMATE sieht wie folgt aus:&lt;br /&gt;
 attr TYPE=ROOMMATE genericDeviceType security&lt;br /&gt;
 attr TYPE=ROOMMATE homebridgeMapping SecuritySystemCurrentState=state,values=/home|awoken/:0;;absent:1;;/asleep|gotosleep/:2;;gone:3 SecuritySystemTargetState=SecuritySystemCurrentState,cmds=0:state+home;;1:state+absent;;2:state+gotosleep;;3:state+gone,delay=1&lt;br /&gt;
für GUEST:&lt;br /&gt;
 attr TYPE=GUEST genericDeviceType security&lt;br /&gt;
 attr TYPE=GUEST homebridgeMapping SecuritySystemCurrentState=state,values=/home|awoken/:0;;absent:1;;/asleep|gotosleep/:2;;none:3 SecuritySystemTargetState=SecuritySystemCurrentState,cmds=0:state+home;;1:state+absent;;2:state+gotosleep;;3:state+none,delay=1&lt;br /&gt;
&lt;br /&gt;
== Homematic Luftfeuchtigkeits- und Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - HM-WDS10-TH-O&lt;br /&gt;
 - HM-WDS40-TH-I&lt;br /&gt;
 - HM-WDS40-TH-I-2&lt;br /&gt;
&lt;br /&gt;
Achtung: Hier wird genericDeviceType &amp;quot;TemperatureSensor&amp;quot; verwendet, um eine history in EVE zu erhalten. Mit einem &amp;quot;HumiditySensor&amp;quot; funktionierte dies bei den Tests (Februar 2019) nicht.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;THSensor&amp;gt; genericDeviceType TemperatureSensor&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;THSensor&amp;gt;      CurrentRelativeHumidity=humidity&lt;br /&gt;
                      CurrentTemperature=temperature&lt;br /&gt;
                      StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
                      history:size=1024&lt;br /&gt;
&lt;br /&gt;
== Homematic SmokeDetector HM-SEC-SD und HM-SEC-SD2 ==&lt;br /&gt;
 [[Datei:Homebridge-Homematic-Smokedetector-Gen1.jpg|mini|Homebridge-Homematic-Smokedetector-Gen1 in EVE]]&lt;br /&gt;
Es sind keine Homebridge Mappings für die Rauch Meldung erforderlich.&lt;br /&gt;
&lt;br /&gt;
Allerdings ist ein Mapping für den Batterie Zustand nötig, siehe Unten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; genericDeviceType SmokeSensor&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; subType smokeDetector&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; homebridgeMapping StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
&lt;br /&gt;
== Homematic Heizkörperthermostat HM-CC-RT-DN ==&lt;br /&gt;
[[Datei:HM-CC-RT-DN-Eve.PNG|mini|Darstellung des HM-CC-RT-DN in der iOS App Eve]]&lt;br /&gt;
 attr &amp;lt;HMCCRTDN_Channel2_Clima&amp;gt; homebridgeMapping TargetTemperature=desired-temp::desired-temp,minValue=5,maxValue=35,minStep=0.5,nocache=1&lt;br /&gt;
                      CurrentTemperature=BU_Heizung_01_Clima:measured-temp,nocache=1&lt;br /&gt;
                      StatusLowBattery=BU_Heizung_01:battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
                      TargetHeatingCoolingState=heatingState,values=OFF:0;;HEAT:1;;COOL:2;;AUTO:3,cmds=OFF:controlManu+off;;HEAT:controlMode+boost;;AUTO:controlMode+auto;;COOL:controlManu+17.0&lt;br /&gt;
                      CurrentHeatingCoolingState=heatingState,values=OFF:0;;HEAT:1;;COOL:2;;AUTO:0,valud=OFF&lt;br /&gt;
 attr &amp;lt;HMCCRTDN_Channel2_Clima&amp;gt; siriName Robby&lt;br /&gt;
Dieses Mapping bezieht sich auf ein vorhandenes &#039;&#039;userReading&#039;&#039; mit dem Namen &amp;lt;code&amp;gt;heatingState&amp;lt;/code&amp;gt;, womit Homekit die einzelnen Status nachher unterscheidet.&lt;br /&gt;
 attr &amp;lt;HM-CC-RT-DN_Clima&amp;gt; userReadings heatingState {(ReadingsVal($NAME,&amp;quot;ValvePosition&amp;quot;,0) &amp;gt; 0 || ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;on&amp;quot;) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;controlMode&amp;quot;,&amp;quot;auto&amp;quot;) eq &amp;quot;auto&amp;quot; ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;measured-temp&amp;quot;,20) &amp;gt; ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,20)) ? &amp;quot;COOL&amp;quot; : &amp;quot;AUTO&amp;quot;}&lt;br /&gt;
Global auf alle in FHEM angelegten HM-CC-RT-DN, lässt sich mit folgendem Befehl das &#039;&#039;userReading&#039;&#039; anlegen.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,59211.msg505986.html#msg505986 Forumsthread].&lt;br /&gt;
&lt;br /&gt;
 attr TYPE=CUL_HM:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04 userReadings heatingState {(ReadingsVal($NAME,&amp;quot;ValvePosition&amp;quot;,0) &amp;gt; 0 || ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;on&amp;quot;) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;controlMode&amp;quot;,&amp;quot;auto&amp;quot;) eq &amp;quot;auto&amp;quot; ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;measured-temp&amp;quot;,20) &amp;gt; ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,20)) ? &amp;quot;COOL&amp;quot; : &amp;quot;AUTO&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
== Homematic IP Wandthermostat mit Schaltausgang HmIP-BWTH ==&lt;br /&gt;
 attr &amp;lt;HmIP_BWTH_Thermostat&amp;gt; homebridgeMapping TargetTemperature=1.SET_POINT_TEMPERATURE::1.SET_POINT_TEMPERATURE,,minValue=17,maxValue=25,minStep=0.5,cmd=control,nocache=true&lt;br /&gt;
                                                  CurrentTemperature=1.ACTUAL_TEMPERATURE&lt;br /&gt;
                                                  CurrentHeatingCoolingState=heatingState,values=HEAT:1;COOL:2;OFF:0;AUTO:0&lt;br /&gt;
                                                  TargetHeatingCoolingState=heatingState,values=OFF:0;HEAT:1;COOL:2;AUTO:3,cmds=OFF:datapoint+1.CONTROL_MODE+1;HEAT:datapoint+1.BOOST_MODE+1;COOL:datapoint+1.BOOST_MODE+0;AUTO:datapoint+1.CONTROL_MODE+0&lt;br /&gt;
                                                  CurrentRelativeHumidity=1.HUMIDITY&lt;br /&gt;
&lt;br /&gt;
Dieses Mapping bezieht sich auf ein vorhandenes &#039;&#039;userReading&#039;&#039; mit dem Namen &amp;lt;code&amp;gt;heatingState&amp;lt;/code&amp;gt;, womit Homekit die einzelnen Status nachher unterscheidet.&lt;br /&gt;
 attr &amp;lt;HmIP_BWTH_Thermostat&amp;gt; userReadings heatingState {(ReadingsVal($NAME,&amp;quot;10.STATE&amp;quot;,0) eq 1 &amp;amp;&amp;amp; ReadingsVal($NAME,&amp;quot;1.HEATING_COOLING&amp;quot;,0) eq 0) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;1.SET_POINT_TEMPERATURE&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;1.SET_POINT_MODE&amp;quot;,&amp;quot;-&amp;quot;) eq 0 ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;10.STATE&amp;quot;,0) eq 1 &amp;amp;&amp;amp; ReadingsVal($NAME,&amp;quot;1.HEATING_COOLING&amp;quot;,0) eq 1) ? &amp;quot;COOL&amp;quot; : &amp;quot;OFF&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
== Homematic Wetterstation OC3 HM-WDS100-C6-O-2 ==&lt;br /&gt;
[[Datei: homebridge-wetter.jpg|mini|Wetterstation in EVE]]&lt;br /&gt;
Mit der EVE und den hier: [https://github.com/naofireblade/homebridge-weather-plus/blob/master/util/characteristics.js] beschriebenen Characteristics lässt sich eine lokale Homematic OC3 Wetterstation aus FHEM einbinden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear&lt;br /&gt;
CurrentTemperature:temperature&lt;br /&gt;
CurrentRelativeHumidity:humidity&lt;br /&gt;
49C8AE5A-A3A5-41AB-BF1F-12D5654F9F41:windSpeed,name=WINDGESCHWINDIGKEIT,format=FLOAT,unit=kmh,maxValue=250,minValue=0,minStep=1&lt;br /&gt;
46f1284c-1912-421b-82f5-eb75008b167e:windDirection,name=WINDRICHTUNG,format=UINT8,unit=ARC_DEGREE,maxValue=360,minValue=0,minStep=1&lt;br /&gt;
StatusLowBattery:battery,values=ok:BATTERY_LEVEL_NORMAL;/^.*/:BATTERY_LEVEL_LOW &lt;br /&gt;
ccc04890-565b-4376-b39a-3113341d9e0f:RegenmengeLast24Hours:state,name=REGEN_24h,format=FLOAT,unit=mm,maxValue=100,minValue=0,minStep=1 &lt;br /&gt;
10c88f40-7ec4-478c-8d5a-bd0c3cce14b7:RegenmengeLast1Hours:state,name=REGEN_1h,format=FLOAT,unit=mm,maxValue=100,minValue=0,minStep=1 &lt;br /&gt;
0000006B-0000-1000-8000-0026BB765291:brightness,name=BRIGHTNESS,format=FLOAT,unit=LUX,maxValue=10000,minValue=0,minStep=.0001 &lt;br /&gt;
cd65a9ab-85ad-494a-b2bd-2f380084134c:isRaining,name=BEDINGUNGKATEGORIE,values=0:0;1:2,format=UINT8,maxValue=3,minValue=0,minStep=1 &lt;br /&gt;
cd65a9ab-85ad-494a-b2bd-2f380084134d:isRaining,name=BEDINGUNG,format=STRING,values=0:-;/.*/:Regen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off,nocache=1 ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
== Vallox Belüftungsanlage ==&lt;br /&gt;
Die Steuerung der Lüftungsgeschwindigkeit ist nur in Prozent möglich. Die Umrechnung erfolgt im [[Vallox]] Modul.&lt;br /&gt;
Hierzu wurde das Reading &#039;&#039;FanSpeedPct&#039;&#039; hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;Vallox&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;Vallox&amp;gt; homebridgeMapping clear&lt;br /&gt;
                      model=Vallox&lt;br /&gt;
                      On=PowerState,valueOn=1,readOnly=1&lt;br /&gt;
                      RotationSpeed=FanSpeedPct,minValue=1,maxValue=100,cmd=FanSpeedPct,delay=1&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Vacuum Cleaner 1. Generation ==&lt;br /&gt;
[[Datei:XIAOMI_VACUUM_CLEANER-Gen1.jpg|mini|XIAOMI VACUUM 1. GEN in EVE]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Staubsauger mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping On=state,valueOn=Cleaning,cmdOn=start,cmdOff=charge&lt;br /&gt;
                      RotationSpeed=fan_power,minValue=0,maxValue=90,cmd=fan_power,delay=1&lt;br /&gt;
                      BatteryLevel=batteryLevel,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=state,values=Docked:NOT_CHARGING;;Charging:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      OccupancyDetected=state,values=/Docked|Charging/:OCCUPANCY_DETECTED;;/.*/:OCCUPANCY_NOT_DETECTED&lt;br /&gt;
                      FilterLifeLevel=consumables_filter,minValue=0,maxValue=100&lt;br /&gt;
                      FilterChangeIndication=consumables_filter,values=0:CHANGE_FILTER&lt;br /&gt;
&lt;br /&gt;
== Roborock S50 (2. Generation des Xiaomi Vacuum Cleaners) ==&lt;br /&gt;
[[Datei:Roborock S50.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Staubsauger mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Mapping für den Roborook S50 beinhaltet neben den Characteristics der 1. Genration des Xiaomi Vacuum Cleaners weitere Custom Mappings. Diese werden auch auf dem Bild dargestellt. Falls das einem zu viele Informationen sind, können diese beim Einfügen einfach weggelassen oder in EVE ausgeblendet werden.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping On=state,valueOn=Cleaning,cmdOn=start,cmdOff=charge&lt;br /&gt;
                      RotationSpeed=fan_power,minValue=0,maxValue=90,cmd=fan_power,delay=1&lt;br /&gt;
                      BatteryLevel=batteryPercent,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=batteryState,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=state,values=Docked:NOT_CHARGING;;Charging:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      OccupancyDetected=state,values=/Docked|Charging/:OCCUPANCY_DETECTED;;/.*/:OCCUPANCY_NOT_DETECTED&lt;br /&gt;
                      2af6d0d0-3691-4f0d-9c9c-c1098295b1cb=consumables_sensors,name=Reinigung+Sensoren,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      fd11b965-052e-430f-b08f-206287d8bc00=consumables_filter,name=Austausch+Filter,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      fe7a8dac-dff3-4a07-8a5e-0d6abbf0df0c=consumables_main_brush,name=Austausch+Hauptbürste,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      4f9b2a22-b764-4fc1-8cd2-99383924394c=consumables_side_brush,name=Austausch+Seitenbürste,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      FilterLifeLevel=consumables_filter,minValue=0,maxValue=100&lt;br /&gt;
                      FilterChangeIndication=consumables_filter,values=0:CHANGE_FILTER&lt;br /&gt;
                      4896763a-26f7-400b-9734-2ce6564ceba2=total_clean_time,name=Lebenszeitersparnis,format=FLOAT,minStep=1,unit=h&lt;br /&gt;
                      82af5fd7-50a3-4ab3-81d3-1f7903de612a=total_clean_area,name=Gereinigte+Fläche,format=FLOAT,minStep=1,unit=m²&lt;br /&gt;
                      00d2ef14-b429-4569-8af3-c342d41cf383=total_cleans,name=Reinigungsvorgänge,format=FLOAT,minStep=1&lt;br /&gt;
                      e8d1027e-b068-40d5-9efd-f161b1b52774=device_firmware,name=Firmware,format=STRING&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Fan (ältere Generationen mit Luftfeuchtigkeits- und Temperatursensor und Battery-Readings) ==&lt;br /&gt;
[[Datei:Xiaomi DC Pedestal Fan.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Ventilator mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Die ältere Generation enthält Sensoren und somit Readings für Luftfeuchtigkeit, Temperatur und auch Batteriestatus. Diese fehlen bei den neueren Generation dieses Ventilators, siehe Bilder. Da anscheinend jedes Jahr neue Generationen dieses Ventilators herausgekommen sind, ist nicht klar bis zu welcher Generation diese Sensoren enthalten waren.&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - Xiaomi DC Pedestal Fan (FHEM model fehlt, Default Hostname am Router: zhimi-fan-v3)&lt;br /&gt;
 - Liste bitte ergänzen!&lt;br /&gt;
&lt;br /&gt;
Um möglichst viele Funktionen bereitzustellen, wurden auch Characteristics von anderen DeviceTypes verwendet. Erklärung zu den Characteristics:&lt;br /&gt;
&lt;br /&gt;
 - Die Kindersicherung (LockPhysicalControls) ist in Eve über das kleine Einstellungssymbol zu finden. &lt;br /&gt;
 - Mit AudioFeedback/Audio-Bestätigung werden die Töne des Lüfters ein bzw. ausgeschaltet.&lt;br /&gt;
 - Mit NightVision/Nachtsicht werden die LEDs ein (bright) bzw. ausgeschaltet (off).&lt;br /&gt;
 - Mit Mute/Audio wird der Windmodus von Straight zu Natural geschaltet.&lt;br /&gt;
 - Mit TargetTiltAngle/Neigung kann der Schwenkwinkel justiert werden.&lt;br /&gt;
 - Mit SwingMode/Schwenken kann der Schwenkmodus ein bzw. ausgeschaltet werden.&lt;br /&gt;
 - Der Rest ist selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
homebridgeMapping:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping&lt;br /&gt;
                      clear&lt;br /&gt;
                      On:power,cmdOn=on,cmdOff=off,valueOn=on,valueOff=off&lt;br /&gt;
                      LockPhysicalControls=child_lock,values=on:CONTROL_LOCK_ENABLED;;off:CONTROL_LOCK_DISABLED,cmds=CONTROL_LOCK_ENABLED:child_lock+on;CONTROL_LOCK_DISABLED:child_lock+off&lt;br /&gt;
                      RotationSpeed=level,minValue=0,maxValue=100,cmd=level,delay=1&lt;br /&gt;
                      TargetTiltAngle=angle,minValue=30,maxValue=120,minStep=30,cmd=angle&lt;br /&gt;
                      SwingMode=angle_enable,values=on:SWING_ENABLED;;off:SWING_DISABLED,cmdOn=angle_enable+on,cmdOff=angle_enable+off&lt;br /&gt;
                      CurrentRelativeHumidity=humidity&lt;br /&gt;
                      CurrentTemperature=temperature&lt;br /&gt;
                      BatteryLevel=batteryPercent,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=batteryState,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=charging,values=complete:NOT_CHARGING;;progress:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      AudioFeedback:buzzer,cmdOn=buzzer+on,cmdOff=buzzer+off,valueOn=on,valueOff=off&lt;br /&gt;
                      NightVision:led,cmdOn=led+off,cmdOff=led+bright,valueOn=off,valueOff=bright&lt;br /&gt;
                      Mute:mode,cmdOn=mode+straight,cmdOff=mode+natural,valueOn=straight,valueOff=natural&lt;br /&gt;
                      CurrentFanState:power,values=on:BLOWING_AIR;;off:INACTIVE;;/.*/:IDLE&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Fan (neuere Generationen ohne Luftfeuchtigkeits- und Temperatursensor und Battery-Readings) ==&lt;br /&gt;
[[Datei:Xiaomi Standing Fan 2 bzw. 2S.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Ventilator mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Den neueren Generationen dieses Ventilators fehlen Sensoren und somit Readings für Luftfeuchtigkeit, Temperatur und auch Batteriestatus. Diese sind bei der älteren Generation dieses Ventilators enthalten, siehe vorangegangenes Beispiel.&lt;br /&gt;
&lt;br /&gt;
Dieses Mapping wurde mit dem &amp;quot;2S&amp;quot; erstellt. Es sollte aber mindestens auch mit einem &amp;quot;Xiaomi Standing Fan 2&amp;quot; (ohne Akku) funktionieren, da auch der &amp;quot;Xiaomi Standing Fan 2S&amp;quot; (mit Akku) kein Reading für die Batterie bereitstellt. Ansonsten gibt es wohl auch noch Generationen zwischen dem &amp;quot;Xiaomi DC Pedestal Fan&amp;quot; und den &amp;quot;Xiaomi Standing Fan 2/2S&amp;quot;. Es ist davon auszugehen, dass dieses Beispiel genauso auch bei diesen Modellen funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - 2019 Xiaomi Standing Fan 2S (FHEM model bzw. Default Hostname am Router: zhimi-fan-za4)&lt;br /&gt;
 - 2018 Xiaomi ZhiMiDCVariableFrequencyFan ZRFFS01ZM (FHEM model bzw. Default Hostname am Router: zhimi-fan-za1)&lt;br /&gt;
 - Liste bitte ergänzen!&lt;br /&gt;
&lt;br /&gt;
Um möglichst viele Funktionen bereitzustellen, wurden auch Characteristics von anderen DeviceTypes verwendet. Erklärung zu den Characteristics:&lt;br /&gt;
&lt;br /&gt;
 - Die Kindersicherung (LockPhysicalControls) ist in Eve über das kleine Einstellungssymbol zu finden. &lt;br /&gt;
 - Mit AudioFeedback/Audio-Bestätigung werden die Töne des Lüfters ein bzw. ausgeschaltet.&lt;br /&gt;
 - Mit NightVision/Nachtsicht werden die LEDs ein (bright) bzw. ausgeschaltet (off).&lt;br /&gt;
 - Mit Mute/Audio wird der Windmodus von Straight zu Natural geschaltet.&lt;br /&gt;
 - Mit TargetTiltAngle/Neigung kann der Schwenkwinkel justiert werden.&lt;br /&gt;
 - Mit SwingMode/Schwenken kann der Schwenkmodus ein bzw. ausgeschaltet werden.&lt;br /&gt;
 - Der Rest ist selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
homebridgeMapping:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping &lt;br /&gt;
                      clear&lt;br /&gt;
                      On:power,cmdOn=on,cmdOff=off,valueOn=on,valueOff=off&lt;br /&gt;
                      LockPhysicalControls=child_lock,values=on:CONTROL_LOCK_ENABLED;;off:CONTROL_LOCK_DISABLED,cmds=CONTROL_LOCK_ENABLED:child_lock+on;CONTROL_LOCK_DISABLED:child_lock+off&lt;br /&gt;
                      RotationSpeed=level,minValue=0,maxValue=100,cmd=level,delay=1&lt;br /&gt;
                      TargetTiltAngle=angle,minValue=30,maxValue=120,minStep=30,cmd=angle&lt;br /&gt;
                      SwingMode=angle_enable,values=on:SWING_ENABLED;;off:SWING_DISABLED,cmdOn=angle_enable+on,cmdOff=angle_enable+off&lt;br /&gt;
                      AudioFeedback:buzzer,cmdOn=buzzer+on,cmdOff=buzzer+off,valueOn=on,valueOff=off&lt;br /&gt;
                      NightVision:led,cmdOn=led+off,cmdOff=led+bright,valueOn=off,valueOff=bright&lt;br /&gt;
                      Mute:mode,cmdOn=mode+straight,cmdOff=mode+natural,valueOn=straight,valueOff=natural&lt;br /&gt;
                      CurrentFanState:power,values=on:BLOWING_AIR;;off:INACTIVE;;/.*/:IDLE&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
== Garagentorsteuerung und Schließzustandserkennung mit einem Shelly Plus 1 anhand eines Sommer S9080 base+ Antriebs ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Konfiguration und Installation des Shellys ===&lt;br /&gt;
[[Datei:Shelly Input Output.jpg|mini|alternativtext=|Änderung des Relay Types]]&lt;br /&gt;
[[Datei:Shelly AutoOff.jpg|mini|alternativtext=|Shelly als Taster konfigurieren]]&lt;br /&gt;
[[Datei:Shelly-Verkableung.jpg|mini|alternativtext=|Shelly, Garagentor Platine und Relay]]&lt;br /&gt;
Da der Shelly hierbei zwei verschiedene Aufgaben übernehmen soll, müssen zunächst die nachfolgenden Einstellungen am Shelly vorgenommen werden:&lt;br /&gt;
# Im Webend des Shellys (unter seiner IP-Adresse zu erreichen)  in den Einstellungen &#039;&#039;Channel Settings &amp;gt; Input output settings&#039;&#039; den relay type auf &amp;quot;&#039;&#039;Detached&#039;&#039;&amp;quot; stellen. Dies hat zur Folge, dass die Eingänge für den Schalter (also da wo normalerweise z. B. der Lichtschalter angeschlossen und vom Shelly ausgewertet wird) vom internen Relay des Shellys (das z.B. den Strom zur Lampe schaltet) losgelöst wird. Somit lässt sich später der Zustand des des angeschlossenen Schalters (in diesem Beispiel der Schließzustand des Garagentors) separat auswerten ohne, dass etwas geschaltet wird.&lt;br /&gt;
# Da der Shelly zum Öffnen des Tors nur ein kurzen Stromstoß, wie beispielsweise ein Tastschalter, an die Garagentor-Elektronik schicken soll, müssen wir in den Einstellungen &#039;&#039;Timers &amp;gt; Auto&#039;&#039; off einen Aus-Timer einstellen. Der Shelly funktioniert somit als Taster. &lt;br /&gt;
Gemäß der Anleitung benötigt man beim besagten Garagentorantrieb der Firma Sommer ein weiteres Relay (als Zubehörteil erhältlich), welches einfach auf die Hauptplatine aufgesteckt wird, um den Schließzustand des Tors auszuwerten. Das Relay zieht an, sobald das Tor nicht geschlossen ist.&lt;br /&gt;
&lt;br /&gt;
=== 2. FHEM + Homebridge-Mapping ===&lt;br /&gt;
Der Shelly wird per Autocreate des MQTT2 Moduls selbstständig angelegt. In diesem Beispiel mit dem Namen shellyplus1_a8032abd6100. Das Reading &amp;quot;&#039;&#039;params_input_0_state&#039;&#039;&amp;quot; liefert uns hierbei den Wert des losgelösten Schaltereingangs (also den Schließzustand des Garagentors). Hierbei ist zu beachten, dass das Reading erst auftaucht sobald der Schalter das erste mal geschlossen (also das Garagentor geöffnet) wurde. &lt;br /&gt;
&lt;br /&gt;
Die weitere Konfiguration erfolgte mit: &lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 alias Garagentor&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 webCmd auf:zu&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 devStateIcon 1.open:fts_garage_door_10 1.closed:fts_garage_door_100\&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 eventMap on:auf on:zu&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 genericDeviceType garage&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 group Garage&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 homebridgeMapping CurrentDoorState=homebridgestate,values=0:CLOSED;;1:OPEN TargetDoorState=CurrentDoorState,cmds=OPEN:on;;CLOSED:on&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 icon fts_garage&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 room Homekit&lt;br /&gt;
 attr MQTT2_shellyplus1_a8032abd6100 stateFormat 1:TOR\&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt; FGStatus&lt;br /&gt;
   attr MQTT2_shellyplus1_a8032abd6100 userReadings TOR {(ReadingsVal($name,&amp;quot;params_input_0_state&amp;quot;,&amp;quot;true&amp;quot;) eq &amp;quot;true&amp;quot;)?&amp;quot;open&amp;quot;:&amp;quot;closed&amp;quot;},\&lt;br /&gt;
   FGStatus {if (ReadingsVal($name,&amp;quot;params_input_0_state&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;true&amp;quot;) {ReadingsTimestamp($name,&amp;quot;params_input_0_state&amp;quot;,&amp;quot;&amp;quot;) =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;; return &amp;quot;Letzte Öffnung: am $3.$2.$1 um $4 Uhr&amp;quot;} else {ReadingsTimestamp($name,&amp;quot;params_input_0_state&amp;quot;,&amp;quot;&amp;quot;) =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;; return &amp;quot;Letzte Schließung: am $3.$2.$1 um $4 Uhr&amp;quot;}},\&lt;br /&gt;
   homebridgestate {(ReadingsVal($name,&amp;quot;params_input_0_state&amp;quot;,&amp;quot;true&amp;quot;) eq &amp;quot;true&amp;quot;)?1:0}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ergänzt wurde das MQTT2-Modul automatisch angelegt Attribut um die letzten beiden Zeilen (auf, zu):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;attr MQTT2_shellyplus1_a8032abd6100 setList toggle:noArg $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Switch.Toggle&amp;quot;,&amp;quot;params&amp;quot;: {&amp;quot;id&amp;quot;:0}}\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt; off:noArg $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Switch.Set&amp;quot;,&amp;quot;params&amp;quot;: {&amp;quot;id&amp;quot;:0,&amp;quot;on&amp;quot;:false}}\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt; on:noArg $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Switch.Set&amp;quot;,&amp;quot;params&amp;quot;: {&amp;quot;id&amp;quot;:0,&amp;quot;on&amp;quot;:true}}\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt; on-for-timer $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Switch.Set&amp;quot;,&amp;quot;params&amp;quot;: {&amp;quot;id&amp;quot;:0,&amp;quot;on&amp;quot;:true,&amp;quot;toggle_after&amp;quot;:$EVTPART1}}\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt; x_update:noArg $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Shelly.Update&amp;quot;,&amp;quot;params&amp;quot;: {&amp;quot;stage&amp;quot;:&amp;quot;stable&amp;quot;}}\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; x_reboot:noArg $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Shelly.Reboot&amp;quot;}\&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt; auf:noArg $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Switch.Set&amp;quot;,&amp;quot;params&amp;quot;: {&amp;quot;id&amp;quot;:0,&amp;quot;on&amp;quot;:true}}\&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt; zu:noArg $DEVICETOPIC/rpc {&amp;quot;id&amp;quot;:0,&amp;quot;src&amp;quot;:&amp;quot;fhem&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Switch.Set&amp;quot;,&amp;quot;params&amp;quot;: {&amp;quot;id&amp;quot;:0,&amp;quot;on&amp;quot;:false}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Datei:IOs.png|mini|alternativtext=|Ansicht in HomeKit]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM.jpg|mini|alternativtext=|Ergebnis in FHEM]]&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 6.1 Rev. 25376&lt;br /&gt;
 homebridge 1.4.0&lt;br /&gt;
 homebridge-fhem 0.5.33      &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-SecuSignal-Fenstergriff&amp;diff=38425</id>
		<title>EnOcean-SecuSignal-Fenstergriff</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-SecuSignal-Fenstergriff&amp;diff=38425"/>
		<updated>2023-06-28T14:25:44Z</updated>

		<summary type="html">&lt;p&gt;50watt: Homebridge Attribute hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=FHF-al.jpg&lt;br /&gt;
|Bildbeschreibung=Eltako FHF-al&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=&lt;br /&gt;
|HWVoltage=&lt;br /&gt;
|HWPowerConsumption=&lt;br /&gt;
|HWPoweredBy=Bewegungsenergie bei Positonsänderung&lt;br /&gt;
|HWSize=&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Hoppe&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-SecuSignal-Fenstergriff&#039;&#039;&#039; ist ein Fenstergriff mit integrierten Funk-Sendemodul&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Fenstergriff mit integriertem EnOcean-Funkmodul, der als nicht abschließbare und abschließbare Variante in verschiedenen Farben erhältlich ist. Funktelegramme werden beim Öffnen, Kippen und Schließen erzeugt.&lt;br /&gt;
Der Fenstergriff wird auch unter anderen Bezeichnungen vermarktet (beispielsweise als Eltako FHF)&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
Der Fenstergriff wird bei Empfang des ersten Funktelegramms durch Änderung der Griffposition vollständig von FHEM im &amp;lt;code&amp;gt;learningMode&amp;lt;/code&amp;gt; erkannt. Definition das FHEM-Device für den Fenstergriff nebst [[FileLog]] und [[SVG]] für einen Plot erfolgt dann automatisch durch [[autocreate]].&lt;br /&gt;
&lt;br /&gt;
Anlernvorgang:&lt;br /&gt;
# FHEM in Lernmodus schalten: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;set &amp;lt;IODev&amp;gt; teach &amp;lt;time/s&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Funktelegramm durch Drehen des Fenstergiffes auslösen. Das Anlegen in der Konfiguration erfolgt dann automatisch per autocreate.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Kuechenfenster EnOcean FF010101&lt;br /&gt;
attr Kuechenfenster IODev TCM310_0&lt;br /&gt;
attr Kuechenfenster eep F6-10-00&lt;br /&gt;
attr Kuechenfenster room EnOcean&lt;br /&gt;
attr Kuechenfenster subType windowHandle&lt;br /&gt;
define FileLog_Kuechenfenster FileLog ./log/EnO_switch_Kuechenfenster-%Y.log Kuechenfenster&lt;br /&gt;
attr FileLog_Kuechenfenster logtype text&lt;br /&gt;
attr FileLog_Kuechenfenster room EnOcean&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logbeispiel ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2014-08-11_12:03:02 Kuechenfenster open_from_tilted&lt;br /&gt;
2014-08-11_12:03:03 Kuechenfenster closed&lt;br /&gt;
2014-08-11_12:03:05 Kuechenfenster open&lt;br /&gt;
2014-08-11_12:03:05 Kuechenfenster tilted&lt;br /&gt;
2014-08-11_12:03:07 Kuechenfenster open_from_tilted&lt;br /&gt;
2014-08-11_12:03:08 Kuechenfenster closed&lt;br /&gt;
2014-08-11_12:03:10 Kuechenfenster open&lt;br /&gt;
2014-08-11_12:03:11 Kuechenfenster tilted&lt;br /&gt;
2014-08-11_12:03:13 Kuechenfenster open_from_tilted&lt;br /&gt;
2014-08-11_12:03:14 Kuechenfenster closed&lt;br /&gt;
2014-08-11_12:03:15 Kuechenfenster open&lt;br /&gt;
2014-08-11_12:03:15 Kuechenfenster tilted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== Anzeige Fensterstatus im WebFrontend ===&lt;br /&gt;
Durch folgendes Attribut wird der Fensterstatus im WebFrontend bildlich dargestellt:&lt;br /&gt;
 attr Kuechenfenster devStateIcon closed:fts_window_2w open:fts_window_2w_open_l tilted:fts_window_2w_tilt_l open_from_tilted:fts_window_2w_open_l&lt;br /&gt;
&lt;br /&gt;
aus {{Link2Forum|Topic=25990|Message=190198|LinkText=Forenbeitrag}}&lt;br /&gt;
&lt;br /&gt;
=== Plot des Fenstergriffstatus ===&lt;br /&gt;
In aktuellen FHEM-Versionen wird ein Plot nebst FileLog für den EnOcean-Fensterkontakt automatisch beim Anlernen angelegt. Eine manuelle Anlage ist nicht mehr notwendig. Bei alten FHEM-Installationen kann das von FHEM mitgeliefert Plot nachträglich durch folgende Vorgehensweise erzeugt werden: im DEF der Detailansicht des FHEM-Devices hinter der SenderID des Fenstergriffes (hier im Config-Auszug: FF010101) nach einem Leerzeichen das EEP &amp;lt;code&amp;gt;F6.10.00&amp;lt;/code&amp;gt; eintragen und den Button {{Taste|modify &amp;lt;device&amp;gt;}} anklicken. Das Filelog und der Plot werden automatisch angelegt. &lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Angaben sind für manuelle Anlage und Bearbeitung von Plots weiterhin noch aktuell. &lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;function&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;$fld[2]=~&amp;quot;ope.*&amp;quot;?1:($fld[2]=~&amp;quot;tilted&amp;quot;?0.8:0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Als &amp;quot;Tics as&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;(&amp;quot;offen&amp;quot; 1,&amp;quot;gekippt&amp;quot; 0.8,&amp;quot;zu&amp;quot; 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Image:Plot tuergriff 1.png]]&lt;br /&gt;
&lt;br /&gt;
== HomeBridge Integration ==&lt;br /&gt;
Die Integration in HomeKit via HomeBridge erfordert zwei weitere Attribute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Kuechenfenster genericDeviceType window&lt;br /&gt;
attr Kuechenfenster homebridgeMapping CurrentPosition=state,values=closed:0;open:100;tilted:75;open_from_tilted:100; TargetPosition=state,values=open:100;closed:0;tilted:75;open_from_tilted:100;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt: [http://www.eltako.com/fileadmin/downloads/de/Datenblatt/FUNK_datenblatt_FHF.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Schalter (Sender)]]&lt;br /&gt;
[[Kategorie:Zustandssensoren]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_und_Wettervorhersagen&amp;diff=38359</id>
		<title>Wetter und Wettervorhersagen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_und_Wettervorhersagen&amp;diff=38359"/>
		<updated>2023-05-11T05:00:27Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Deutscher Wetterdienst (DWD) */ national versus international&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wetterdaten und Wettervorhersagen können auf verschiedene Weise in FHEM eingebunden werden.&lt;br /&gt;
== Modul Weather ==&lt;br /&gt;
Das Modul [[Weather]] extrahiert Wetterdaten via API von den Wetterdatenanbietern&lt;br /&gt;
* [https://openweathermap.org/ Openweathermap]&lt;br /&gt;
** Vorschauzeitraum: 5 Tage (zeitliche Auflösung: 3 Stunden)&lt;br /&gt;
** Aktuelle Daten (minütlich)&lt;br /&gt;
** 1000 Abrufe pro Tag mit dem Gratis-API-Key (Stand: Juni 2021)&lt;br /&gt;
* [https://www.wunderground.com/ wunderground]&lt;br /&gt;
** API-KEY nur für Gerätebesitzer&lt;br /&gt;
* [https://darksky.net/ DarkSky]&lt;br /&gt;
** API soll Ende 2022 abgeschaltet werden&lt;br /&gt;
** Es können keine neuen API-Key erstellt werden (Stand: Juni 2021)&lt;br /&gt;
&lt;br /&gt;
Da die Yahoo Weather API zum 03.01.2019 abgeschaltet wurde, kann Weather keine Wetterdaten von Yahoo mehr beziehen.&lt;br /&gt;
&lt;br /&gt;
== Unwetterzentrale ==&lt;br /&gt;
Informationen der Seite(n) Unwetterzentrale.de können mit Hilfe des Moduls [[UWZ]] eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
== Modul OPENWEATHER ==&lt;br /&gt;
Das Modul [[OPENWEATHER]] extrahiert Wetterdaten über die &amp;quot;openweather&amp;quot;-Schnittstelle (API) von www.wetter.com. &lt;br /&gt;
*Vorschau-Zeitraum: 3 Tage&lt;br /&gt;
*Vorschau-Interval: 6:00, 11:00, 17:00, 23:00&lt;br /&gt;
*Aktuelle Daten: keine&lt;br /&gt;
&lt;br /&gt;
== Modul PROPLANTA ==&lt;br /&gt;
Das Modul [[PROPLANTA]] extrahiert Wetterdaten von der Website www.proplanta.de. (keine API)&lt;br /&gt;
*Vorschau-Zeitraum: 12 Tage&lt;br /&gt;
*Vorschau-Interval: 3 h&lt;br /&gt;
*Aktuelle Daten: jede volle Stunde&lt;br /&gt;
&lt;br /&gt;
== Modul WWO ==&lt;br /&gt;
Das {{Link2CmdRef|Anker=WWO|Label=Modul WWO}} extrahiert Wetterdaten über die (alte) API von worldweatheronline.com&lt;br /&gt;
*Vorschau-Zeitraum: ?? Tage&amp;lt;BR&amp;gt;&lt;br /&gt;
*Vorschau-Interval: ??&amp;lt;br&amp;gt;&lt;br /&gt;
*Aktuelle Daten: ??&lt;br /&gt;
&lt;br /&gt;
== Deutscher Wetterdienst (DWD) ==&lt;br /&gt;
&lt;br /&gt;
=== Modul DWD_OpenData ===&lt;br /&gt;
Das Modul [[DWD_OpenData]] stellt einen Teil der frei verfügbaren Daten des Deutschen Wetterdienstes (DWD) bereit, die über den [https://www.dwd.de/DE/leistungen/opendata/opendata.html Open Data Server] abgerufen werden können (diverse Datenformate, keine API). &lt;br /&gt;
*Vorschau-Zeitraum: 10 Tage&lt;br /&gt;
*Vorschau-Interval: datenabhängig, viele mit 3 h&lt;br /&gt;
*Vorschau-Orte: national und international (weniger Daten, z.B. keine Radiation)&lt;br /&gt;
*Aktuelle Daten: nicht implementiert&lt;br /&gt;
*Wetterwarnungen: national für Deutschland für Landkreise und Gemeinden in deutsch oder englisch&lt;br /&gt;
&lt;br /&gt;
Es gibt zum Modul auch einen Weblink für [[FHEMWEB]], der zwei Icons pro Tag in horizontaler Form darstellt. Die Anzahl der insgesamt dargestellten Icons ist konfigurierbar. Liegen Wetterwarnungen vor, wird zusätzlich ein Warnsymbol angezeigt, über das man per Klick weitere Details zur Wetterwarnung abrufen kann.&lt;br /&gt;
&lt;br /&gt;
[[DWD_OpenData|Weitere Details und Installationsbeschreibung]]&lt;br /&gt;
&lt;br /&gt;
=== Wetterwarnungen als Karte ===&lt;br /&gt;
Der Deutsche Wetterdienst [http://www.dwd.de DWD] stellt neben diversen Wetterdaten auch Wetterwarnungen in Bildform bereit. Diese können sehr einfach via [http://fhem.de/commandref_DE.html#weblink weblink iframe] in FHEM eingebunden werden - das ist zwar nicht die schönste Form, aber die schnellste.&lt;br /&gt;
&lt;br /&gt;
Dazu sucht man sich zuerst auf der [http://www.dwd.de/bvbw/appmanager/bvbw/dwdwwwDesktop?_nfpb=true&amp;amp;_pageLabel=_dwdwww_wetter_warnungen_warnungen&amp;amp;T92053gsbDocumentPath=BEA__Navigation%2FWetter__Warnungen%2FWarnungen.html%3F__nnn%3Dtrue&amp;amp;lastPageLabel=dwdwww_wetter_warnungen Warnungsseite des DWD] die eigene Region heraus (in der Karte durchklicken). Die gewünschte URL für Berlin Stadt ist z.B. &amp;lt;code&amp;gt;http://www.dwd.de/dyn/app/ws/html/reports/BXX_warning_de.html#WS_ANCHOR_0&amp;lt;/code&amp;gt;. Das Anhängsel &amp;lt;code&amp;gt;#WS_ANCHOR_0&amp;lt;/code&amp;gt; kann man in der Konfiguration auch weglassen.&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in FHEM sieht dann wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dwd_warnmeldung weblink iframe http://www.dwd.de/dyn/app/ws/html/reports/BXX_warning_de.html&lt;br /&gt;
attr dwd_warnmeldung group Wetterwarnungen (DWD)&lt;br /&gt;
attr dwd_warnmeldung htmlattr width=&amp;quot;100%&amp;quot; height=&amp;quot;300&amp;quot; frameborder=&amp;quot;0&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot;&lt;br /&gt;
attr dwd_warnmeldung room Wettervorhersage,Startseite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vorhersage-Diagramm von YR ==&lt;br /&gt;
[http://www.yr.no YR] ist die Seite des norwegischen Wetterdiensts. Er ist zwar nur in Teilen auf Englisch (und gar nicht auf Deutsch) verfügbar, bietet aber sehr gute Wettervorhersagen - auch mit eigenen Vorhersagen für kleine Dörfer. Neben etlichen Detailinfos bietet YR eine sehr schicke 48h-Vorhersage-Grafik. Diese kann sehr einfach via [http://fhem.de/commandref_DE.html#weblink weblink iframe] in FHEM eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
Dazu geht man auf die [http://www.yr.no Startseite von YR] und gibt in das Suchfeld den Namen seines Dörfchens ein - die Ergebnissliste kann ziemlich lang werden, sodass man evtl. sehr genau schauen muss, welches das eigene Kaff ist - bei mir war es an 29. Stelle... ;-) Auf der gewünschten Seite gibt es einen Unterpunkt &amp;quot;Forecast as SVG&amp;quot;, wo sich die besagte Grafik findet. Hier kopiert man sich einfach die URL der Grafik.&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in FHEM sieht dann bspw. wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Wetter_yr_Vorhersage weblink iframe https://www.yr.no/en/content/2-2950159/meteogram.svg&lt;br /&gt;
attr Wetter_yr_Vorhersage group Wettervorhersage (yr)&lt;br /&gt;
attr Wetter_yr_Vorhersage htmlattr width=&amp;quot;782&amp;quot; height=&amp;quot;391&amp;quot; frameborder=&amp;quot;0&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot;&lt;br /&gt;
attr Wetter_yr_Vorhersage room Wettervorhersage,Start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wetter von Weather Underground ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Das (&amp;quot;offene&amp;quot;) API von Weather Underground wird derzeit (März 2019) &amp;quot;retired&amp;quot; = abgestellt, ist also künftig nicht mehr nutzbar! Den benötigten API-Key bekommen &amp;quot;nur noch&amp;quot; Betreiber einer Wetterstation, die diese bei wundergound registrieren und ihre Daten hochladen.}}&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die hier beschriebene Vorgehensweise ist etwas anspruchsvoller und somit eher für erfahrene FHEM-User geeignet.&lt;br /&gt;
&lt;br /&gt;
[http://www.wunderground.com/ Weather Underground] bietet eine sehr umfassende Sammlung aller möglichen offiziellen und privaten (aber teils sehr professionellen) Wetterstationen weltweit. Es besteht eine recht hohe Wahrscheinlichkeit, dass es in der eigenen Umgebung schon eine Wetterstation gibt. Anstatt nun selbst eine komplette Wetterstation aufzubauen, kann man alternativ auf die Daten der Nachbarstation zugreifen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Neben dem hier vorgestellten Abruf der Weather Underground-Daten mit [[HTTPMOD]] kann auf Weather Underground-Daten auch mit dem darauf spezialisierten Modul [http://fhem.de/commandref.html#Wunderground Wunderground] zugegriffen werden.}}&lt;br /&gt;
&lt;br /&gt;
Dazu sind grundsätzlich die folgenden Schritte notwendig:&lt;br /&gt;
* Finden der geeigneten Station&lt;br /&gt;
* Auswerten der XML-Daten&lt;br /&gt;
* Erstellen passender gplot-Dateien&lt;br /&gt;
&lt;br /&gt;
=== Finden der geeigneten Station ===&lt;br /&gt;
Als erstes geht man auf die [http://www.wunderground.com Startseite von Weather Underground] und gibt in das Suchfeld den Namen seines Dörfchens oder der nächsten Stadt ein - für Berlin landet man bspw. auf Seite für &amp;quot;Berlin Alexanderplatz&amp;quot;. Es gibt aber manchmal sehr viele Wetterstationen in der direkten Umgebung. Diese findet man indem am auf &amp;quot;Change Station&amp;quot; klickt und sich eine passende Station aussucht. Nähere Infos (zB. zur verwendeten Hard- und Software) zu der gewählten Wetterstation erhält man, wenn man auf den Namen der Station klickt und dann auf &amp;quot;About this PWS&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Weather Underground stellt die Daten der Wetterstation auch über eine API als XML bereit, die wir auswerten können. Die entsprechende URL findet sich ebenfalls unter &amp;quot;About this PWS&amp;quot; unter &amp;quot;Download current conditions XML&amp;quot;. Für Berlin Prenzlauer Berg wäre dies z.B. &lt;br /&gt;
&amp;lt;code&amp;gt;http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBERLIN15&amp;amp;format=XML&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Entscheidend für die jeweilige Station ist der Teil nach &amp;quot;?=ID&amp;quot;, also in diesem Fall &amp;quot;IBERLIN15&amp;quot;. Dieser Teil des Links lässt sich leicht durch die ID einer anderen Station ersetzen und die Suche nach dem entsprechenden Link auf der Seite der Station bleibt erspart.&lt;br /&gt;
&lt;br /&gt;
=== Auswerten der XML-Daten ===&lt;br /&gt;
Die Auswertung der XML-Daten erfolgt via [[HTTPMOD]]. Da dies nicht ganz trivial ist, sind im Folgenden zuerst die wesentlichen Konfigurationsschritte exemplarisch beschrieben. Weiter unten findet sich dann die fertige vollständige Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Es erstes wird das Device HTTPMOD definiert (die 600 am Schluss ist der Aktualisierungszyklus in Sekunden, also alle 10 min):&lt;br /&gt;
:&amp;lt;code&amp;gt;define wetter_prenzelberg HTTPMOD http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=IBERLIN15 600 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden Attribute für alle Readings definiert:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg userattr readingsName_cloudiness readingsName_date ... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird jedem Attribut ein Name zugewiesen (unter diesem Namen wird der Wert ins Log geschrieben):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg readingsName_cloudiness cloudiness &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss wird das Reading selbst definiert:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg readingsRegex_cloudiness cloudiness id=&amp;quot;NN&amp;quot; percent=&amp;quot;([\d\.]+) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration für alle von der API angebotenen Wetterwerte sieht dann wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define wetter_prenzelberg HTTPMOD http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=IBERLIN15 600&lt;br /&gt;
attr wetter_prenzelberg userattr readingsName_cloudiness readingsName_date readingsName_dewpointTemperature readingsName_fog readingsName_heatindex readingsName_humidity readingsName_pressure readingsName_solarRadiation readingsName_solarUV readingsName_temperature readingsName_time readingsName_windChill readingsName_windDegrees readingsName_windDirection readingsName_windGust readingsName_windSpeed readingsRegex_cloudiness readingsRegex_date readingsRegex_dewpointTemperature readingsRegex_fog readingsRegex_heatindex readingsRegex_humidity readingsRegex_pressure readingsRegex_solarRadiation readingsRegex_solarUV readingsRegex_temperature readingsRegex_time readingsRegex_windChill readingsRegex_windDegrees readingsRegex_windDirection readingsRegex_windGust readingsRegex_windSpeed&lt;br /&gt;
attr wetter_prenzelberg readingsName_cloudiness cloudiness&lt;br /&gt;
attr wetter_prenzelberg readingsName_date date&lt;br /&gt;
attr wetter_prenzelberg readingsName_dewpointTemperature dewpointTemperature&lt;br /&gt;
attr wetter_prenzelberg readingsName_fog fog&lt;br /&gt;
attr wetter_prenzelberg readingsName_heatindex heatindex&lt;br /&gt;
attr wetter_prenzelberg readingsName_humidity humidity&lt;br /&gt;
attr wetter_prenzelberg readingsName_pressure pressure&lt;br /&gt;
attr wetter_prenzelberg readingsName_solarRadiation solarRadiation&lt;br /&gt;
attr wetter_prenzelberg readingsName_solarUV solarUV&lt;br /&gt;
attr wetter_prenzelberg readingsName_temperature temperature&lt;br /&gt;
attr wetter_prenzelberg readingsName_time time&lt;br /&gt;
attr wetter_prenzelberg readingsName_windChill windChill&lt;br /&gt;
attr wetter_prenzelberg readingsName_windDegrees windDegrees&lt;br /&gt;
attr wetter_prenzelberg readingsName_windDirection windDirection&lt;br /&gt;
attr wetter_prenzelberg readingsName_windGust windGust&lt;br /&gt;
attr wetter_prenzelberg readingsName_windSpeed windSpeed&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_cloudiness cloudiness id=&amp;quot;NN&amp;quot; percent=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_date date date&amp;quot; content=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_dewpointTemperature &amp;lt;dewpoint_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_fog fog id=&amp;quot;FOG&amp;quot; percent=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_heatindex &amp;lt;heat_index_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_humidity &amp;lt;relative_humidity&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_pressure &amp;lt;pressure_mb&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_solarRadiation &amp;lt;solar_radiation&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_solarUV &amp;lt;UV&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_temperature &amp;lt;temp_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_time time Zeit([\d\:]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windChill &amp;lt;windchill_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windDegrees &amp;lt;wind_degrees&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windDirection &amp;lt;wind_dir&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windGust &amp;lt;wind_gust_mph&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windSpeed &amp;lt;wind_mph&amp;gt;([\d\.]+)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Nicht immer werden alle Werte geliefert (wenn keine Sonne, dann kein UV-Wert...). Im System-Log kann das als Fehler auftauchen, ist aber kein Problem.&lt;br /&gt;
&lt;br /&gt;
=== Erstellen passender gplot-Dateien ===&lt;br /&gt;
Um die ausgelesenen Werte als Graphen darstellen zu können müssen eigene gplot-Dateien erstellt werden. Eine grundsätzliche Anleitung dazu findet sich unter [[Creating Plots]]. Deshalb sollen hier nur Beispiele für die eigentlichen gplot-Dateien vorgestellt werden. Beispiele sollten sowohl für [[FileLog]] wie [[DbLog]] funktionieren.&lt;br /&gt;
&lt;br /&gt;
Temperatur und Luftfeuchte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics &lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics&lt;br /&gt;
set ylabel &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Humidity (%)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:temperature\x3a::&lt;br /&gt;
#FileLog 4:windChill\x3a::&lt;br /&gt;
#FileLog 4:humidity\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:temperature::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windChill::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:humidity::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur (C)&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Gefühlte Temperatur (C)&#039; ls l1 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftfeuchtigkeit (%)&#039; ls l2fill lw 0.2 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wind und Windrichtung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
set ytics&lt;br /&gt;
set y2tics (&amp;quot;Nord&amp;quot; 0, &amp;quot;Ost&amp;quot; 80, &amp;quot;S&amp;amp;#252;d&amp;quot; 180, &amp;quot;West&amp;quot; 270, &amp;quot;Nord&amp;quot; 360)&lt;br /&gt;
&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
set grid xtics ytics&lt;br /&gt;
&lt;br /&gt;
set yrange [0:20]&lt;br /&gt;
set y2range [0:360]&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Wind (mph)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Richtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:windSpeed:0:&lt;br /&gt;
#FileLog 4:windGust:0:&lt;br /&gt;
#FileLog 4:windDegrees:0:&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windSpeed::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windGust::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windDegrees::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Wind (mph)&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Böen (mph)&#039; ls l1 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Windrichtung (°)&#039; ls l2fill lw 0.2 with points&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sonnenintensität und UV-Werte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
set ytics&lt;br /&gt;
set y2tics&lt;br /&gt;
&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
set grid xtics ytics&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Sonnenstrahlung (W/qm)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;UV&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:solarRadiation:0:&lt;br /&gt;
#FileLog 4:solarUV:0:&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:solarRadiation::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:solarUV::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Strahlung&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;UV&#039; ls l1 lw 1.5 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weitere TBD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Vergangene Daten abfragen ===&lt;br /&gt;
Ein konkretes vergangenes Datum der Wetterstation kann man übrigens auch abrufen - für den 28.11.2014 wäre dies bspw. &lt;br /&gt;
&amp;lt;code&amp;gt;http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBERLIN15&amp;amp;day=28&amp;amp;month=11&amp;amp;year=2014&amp;amp;graphspan=day&amp;amp;format=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Wetterdaten hochladen ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Unterstützung für das Modul gibt es im dazugehörigen {{Link2Forum|Topic=65587|LinkText=Forumsthread }}.}}&lt;br /&gt;
Wer eigene Wetterdaten hochladen will, kann hierzu das {{Link2CmdRef|Anker=WUup|Label=Modul WUup}} verwenden. Dazu benötigt man die Zugangsdaten (stationID und Paßwort) für eine eigene Wetterstation. Mit dem Modul können die meisten vom [http://web.archive.org/web/20180815041359/http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol PWS Upload Protocol] unterstützten Daten hochgeladen werden:&lt;br /&gt;
* Winddir - [0-360 momentane Windrichtung]&lt;br /&gt;
* Windspeedmph - [mph momentane Windgeschwindigkeit]&lt;br /&gt;
* Windgustmph - [mph aktuellen Böe, mit Software-spezifischem Zeitraum]&lt;br /&gt;
* Windgustdir - [0-360 mit Software-spezifischer Zeit]&lt;br /&gt;
* Windspdmph_avg2m - [mph durchschnittliche Windgeschwindigkeit innerhalb 2 Minuten]&lt;br /&gt;
* Winddir_avg2m - [0-360 durchschnittliche Windrichtung innerhalb 2 Minuten]&lt;br /&gt;
* Windgustmph_10m - [mph Böen der vergangenen 10 Minuten]&lt;br /&gt;
* Windgustdir_10m - [0-360 Richtung der Böen der letzten 10 Minuten]&lt;br /&gt;
* Feuchtigkeit - [% Außenfeuchtigkeit 0-100%]&lt;br /&gt;
* Dewptf- [F Taupunkt im Freien]&lt;br /&gt;
* Tempf - [F Außentemperatur]&lt;br /&gt;
* Rainin - [in Regen in der vergangenen Stunde]&lt;br /&gt;
* Dailyrainin - [in Regenmenge bisher heute]&lt;br /&gt;
* Baromin - [inHg barometrischer Druck]&lt;br /&gt;
* Soiltempf - [F Bodentemperatur]&lt;br /&gt;
* Bodenfeuchtigkeit - [%]&lt;br /&gt;
* Solarradiation - [W/m²]&lt;br /&gt;
* UV - [Index]&lt;br /&gt;
* AqPM2.5 - Feinstaub PM2,5 [µg/m³]&lt;br /&gt;
* AqPM10 - Feinstaub PM10 [µg/m³]&lt;br /&gt;
&lt;br /&gt;
Die Werte werden im Modul für Wunderground ins anglo-amerikanische System umgerechnet. Temperaturen werden also automatisch von °Celsius in Fahrenheit, Windgeschwindigkeiten von km/h in mph, mm in Inch und der barometrische Druck von hPa in inHg umgerechnet.&lt;br /&gt;
&lt;br /&gt;
== Wetternetzwerk auf wetter.com ==&lt;br /&gt;
Ein vollständiges Beispiel zur Nutzung der Informationen über die Regenmenge (Station 1445, Weinheim) von wetter.com ist in {{Link2Forum|Topic=39600|Message=332837|LinkText=diesem Forenbeitrag}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Wetter von netatmo ==&lt;br /&gt;
Das FHEM-Modul [[netatmo]] ermöglicht den Datenimport von privaten und öffentlichen netatmo Wetterstationen sowie den Abruf der in der Netatmo App verfügbaren Wettervorhersage. Eine Übersicht über die verfügbaren öffentlichen Stationen findet sich auf der Seite [http://www.netatmo.com/de-DE/weathermap Weathermap]. Die meisten öffentlichen Stationen liefern Temperatur, Luftfeuchte und Luftdruck, einige auch Wind, Regen und Daten zur Luftqualität (CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=33610|LinkText=Forenthema}} mit Sammlung und Beipielen von Internet-Links für die Anzeige von teilweise animierten Wetterbildern&lt;br /&gt;
* [http://bloglich.de/art/rpi/wetterdaten-auf-dem-raspberry-pi-in-fhem/ Beispiel in Blog(de)]&lt;br /&gt;
* [[HTTPMOD]]       &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]   &lt;br /&gt;
[[Kategorie:HOWTOS]]   &lt;br /&gt;
[[Kategorie:Wetterstationen]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37921</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37921"/>
		<updated>2023-01-06T13:03:23Z</updated>

		<summary type="html">&lt;p&gt;50watt: Formatierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set alias=Büro play&amp;lt;/code&amp;gt;&lt;br /&gt;
Oder alle Player&lt;br /&gt;
:&amp;lt;code&amp;gt;set model=sonos2mqtt_speaker leaveGroup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der Player ==&lt;br /&gt;
Mit dem Template sonos_bridge_comfort wird aus dem contrib Ordner eine Datei 99_sonos2mqttUtils.pm nachgeladen und aktiviert. Darin befindet sich der wesentliche Code, die sonos2mqtt Geräte selbst enthalten nur rudimentäre Aufrufe. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man diese Datei jederzeit selbst gestalten (FHEM Menu:Edit Files) aber man sollte beachten, dass eine erneute Anwendung des Templates die Datei überschreibt.&lt;br /&gt;
&lt;br /&gt;
Man kann auch jederzeit diese Datei aus dem SVN neu laden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;contrib/AttrTemplate/99_sonos2mqttUtils.pm&amp;quot;, &amp;quot;FHEM/99_sonos2mqttUtils.pm&amp;quot;, sub(){ CommandReload(undef, &amp;quot;99_sonos2mqttUtils&amp;quot;) }) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hauptroutine ist sonos2mqtt die mit zwei Parametern aufgerufen wird. &amp;lt;code&amp;gt;{sonos2mqtt($NAME,$EVENT)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Optik des Players wird mit der Routine &amp;lt;code&amp;gt;sonos2mqtt_devStateIcon&amp;lt;/code&amp;gt; bestimmt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Player mittels &amp;lt;code&amp;gt;attr a:model=sonos2mqtt_speaker webCmd volume&amp;lt;/code&amp;gt; mit einem Slider in der Übersicht ausstatten.&lt;br /&gt;
&lt;br /&gt;
Ändert man die Sonoslandschaft, kann man auch alles einreißen und neu erzeugen lassen. Zunächst alles löschen (für die FHEM Kommandozeile):&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{fhem(&amp;quot;delete a:model=sonos2mqtt_speaker;;delete FileLog_MQTT2_RINCON.*&amp;quot;);;qx(rm ./log/MQTT2_RINCON_*);;return &amp;quot;&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach muss man sonos2mqtt einfach neu starten: pm2 start ... bzw den docker container neu starten.&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle in der setList / getList / readingList  nachzurüsten gibt es die Routine &amp;lt;code&amp;gt;sonos2mqtt_mod_list(devspec,attrName,line)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil bis zum &amp;quot;:&amp;quot;. Beispiel für die Komandozeile: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_bridge&#039;,&#039;readingList&#039;,&#039;sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply&#039;)}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Sprachausgabe ==&lt;br /&gt;
Man hat zwei Möglichkeiten, dies umzusetzen: &lt;br /&gt;
# Text2Speech FHEM intern&lt;br /&gt;
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/&lt;br /&gt;
&lt;br /&gt;
=== Text2Speech Variante einrichten ===&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. &amp;lt;code&amp;gt;apt install mp3wrap&amp;lt;/code&amp;gt;). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!&lt;br /&gt;
&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS TTS_Language Deutsch&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host &amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Sprachausgabe Befehle im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit &amp;lt;code&amp;gt;set Player notify volume uri&amp;lt;/code&amp;gt; abgespielt.&lt;br /&gt;
Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt.&lt;br /&gt;
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
Es sind zwei Befehle zur Sprachausgabe eingebaut: &lt;br /&gt;
&lt;br /&gt;
=== sayText Befehl ===&lt;br /&gt;
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt &amp;quot;gleichzeitig&amp;quot; eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.&lt;br /&gt;
&lt;br /&gt;
Die Lautstärke wird separat in SonosTTS gesetzt: &amp;lt;code&amp;gt;setreading SonosTTS vol 15&amp;lt;/code&amp;gt;,  ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) &amp;lt;code&amp;gt;attr SonosTTS TTS_Language Deutsch&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis: Der Befehl &amp;lt;code&amp;gt;set SonosTTS volume xx&amp;lt;/code&amp;gt; hat im Servermodus des Devices keine Wirkung!&#039;&#039;&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:&lt;br /&gt;
:&amp;lt;code&amp;gt;set Player speak &amp;lt;volume&amp;gt; text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set EG.KU.Sonos speak de-DE Vicki 25 Test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Volume Befehl ===&lt;br /&gt;
Der Befehl akzeptiert einen zweiten Wert als Startwert d.h. set volume 25 10 setzt sofort auf 10 und startet dann fading auf 25. Ein zweiter Wert -1 erzeugt ein fading vom aktuellen Wert auf den angegebenen.&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann auch den setter im Gerät erweitern &amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,q(playSound:textField ....))}&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit sind dann dieser Syntax möglich:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder ohne Dateiendung (wird auf mp3 gesetzt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge ===&lt;br /&gt;
Die SonsoBridge enthält bereits ein paar zentrale Funktionen und Readings, z.B. wird beim Laden der Favoritenliste ein Reading favlist und grouplist erzeugt, welches zur Erweiterung der Player mit Auswahllisten dienen kann.&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste und Gruppenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
get SonosBridge Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist, kann man allen Playern die Favoritenliste zum Auswählen eintragen. Beide Zeile sind für die FHEM Kommandozeile und verwenden die Routine aus der 99_sonos2mqttUtils.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;joinGroup:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;grouplist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;playFav:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;favlist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Listen der Favoriten Radios und Playlist erstellen ===&lt;br /&gt;
Im Sonos System kann man an (mindestens) drei Stellen Favoriten hinterlegen: Sonos-Favoriten, Sonos-Playlisten, TuneIn: Meine Radiosender&lt;br /&gt;
&lt;br /&gt;
Diese drei Listen kann man einlesen und für die einfache Suche und Auswahl verwenden. Der play Befehl akzeptiert dazu zwei weitere Parameter und sucht in den entsprechenden Listen.&lt;br /&gt;
&lt;br /&gt;
Diese play Befehle starten nicht sofort, sondern erst nach einem folgenden set ... play. Damit kann man etwas vorbereiten und gezielt starten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Favorite Deutschlandfunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Radio HitRadio&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Playlist Meine Hits&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sonos-Favoriten-, TuneIn: Meine Radiosender- und Sonos-Playlisten dazu vom Sonos System einmalig (bzw. bei Veränderungen) einlesen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein Guten Morgen Radio:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set alias=BadWanne,alias=Kueche joinGroup Bad;&lt;br /&gt;
set alias=BadWanne,alias=Bad volume 13 6;&lt;br /&gt;
set alias=Bad play Favorite Deutschlandfunk.Kultur.RP;&lt;br /&gt;
set alias=Kueche volume 18 8;&lt;br /&gt;
sleep 0.2;set alias=Bad play&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostation mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Das oben erwähnte &amp;lt;code&amp;gt;99_sonos2mqttUtils.pm&amp;lt;/code&amp;gt; (ab 6.1.2023) schreibt die Radios aus dem Reading &amp;lt;code&amp;gt;Favoriten&amp;lt;/code&amp;gt; in das userReading &amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt; im SonosBridge Device und aktualisiert das auch.&lt;br /&gt;
&lt;br /&gt;
==== Der Befehl zum weiterschalten ====&lt;br /&gt;
Jedes Mal wenn dieser Befehl ausgeführt wird, wird der nächste &amp;quot;Radio-Favorit&amp;quot; (aus dem userReading &amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt; des SonosBridge Devices) gestartet.&lt;br /&gt;
&lt;br /&gt;
Wird eine Radiosender gespielt wird bei einem &amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; next&amp;lt;/code&amp;gt; auf den nächsten Sender in dieser Liste geschaltet und der &amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt; wird beibehalten.&lt;br /&gt;
&lt;br /&gt;
==== Name der Radiostation vor dem Umschalten ansagen ====&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem &amp;lt;code&amp;gt;speak&amp;lt;/code&amp;gt; Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste: &amp;lt;code&amp;gt;my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;))&amp;lt;/code&amp;gt; &lt;br /&gt;
* ermitteln des Namens des &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; Devices anhand des &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; Attributes: &amp;lt;code&amp;gt;my $play = (devspec2array(&#039;alias=Büro&#039;))[0]&amp;lt;/code&amp;gt;&lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;: &amp;lt;code&amp;gt;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r&amp;lt;/code&amp;gt;&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist: &amp;lt;code&amp;gt;sleep $tts:playing:.0&amp;lt;/code&amp;gt;, wird sie mit dem Befehl playUri an den oben ermittelten &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; gesendet: &amp;lt;code&amp;gt;set $play playUri [$tts:httpName]&amp;lt;/code&amp;gt;&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED: &amp;lt;code&amp;gt;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED&amp;lt;/code&amp;gt;&lt;br /&gt;
* danach wird der Radiosender gestartet: &amp;lt;code&amp;gt;set $play playFav $r&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen (&amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; toggleRadio&amp;lt;/code&amp;gt;). Dazu den Text unten in das Attribut &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; des &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; Devices hinzufügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
Erweiterung um Alarmhandling siehe [https://forum.fhem.de/index.php/topic,111711.msg1162031.html#msg1162031 Forum]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37920</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37920"/>
		<updated>2023-01-06T12:59:20Z</updated>

		<summary type="html">&lt;p&gt;50watt: &amp;quot;Erklärung zum Code&amp;quot; ausgebaut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set alias=Büro play&amp;lt;/code&amp;gt;&lt;br /&gt;
Oder alle Player&lt;br /&gt;
:&amp;lt;code&amp;gt;set model=sonos2mqtt_speaker leaveGroup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der Player ==&lt;br /&gt;
Mit dem Template sonos_bridge_comfort wird aus dem contrib Ordner eine Datei 99_sonos2mqttUtils.pm nachgeladen und aktiviert. Darin befindet sich der wesentliche Code, die sonos2mqtt Geräte selbst enthalten nur rudimentäre Aufrufe. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man diese Datei jederzeit selbst gestalten (FHEM Menu:Edit Files) aber man sollte beachten, dass eine erneute Anwendung des Templates die Datei überschreibt.&lt;br /&gt;
&lt;br /&gt;
Man kann auch jederzeit diese Datei aus dem SVN neu laden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;contrib/AttrTemplate/99_sonos2mqttUtils.pm&amp;quot;, &amp;quot;FHEM/99_sonos2mqttUtils.pm&amp;quot;, sub(){ CommandReload(undef, &amp;quot;99_sonos2mqttUtils&amp;quot;) }) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hauptroutine ist sonos2mqtt die mit zwei Parametern aufgerufen wird. &amp;lt;code&amp;gt;{sonos2mqtt($NAME,$EVENT)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Optik des Players wird mit der Routine &amp;lt;code&amp;gt;sonos2mqtt_devStateIcon&amp;lt;/code&amp;gt; bestimmt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Player mittels &amp;lt;code&amp;gt;attr a:model=sonos2mqtt_speaker webCmd volume&amp;lt;/code&amp;gt; mit einem Slider in der Übersicht ausstatten.&lt;br /&gt;
&lt;br /&gt;
Ändert man die Sonoslandschaft, kann man auch alles einreißen und neu erzeugen lassen. Zunächst alles löschen (für die FHEM Kommandozeile):&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{fhem(&amp;quot;delete a:model=sonos2mqtt_speaker;;delete FileLog_MQTT2_RINCON.*&amp;quot;);;qx(rm ./log/MQTT2_RINCON_*);;return &amp;quot;&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach muss man sonos2mqtt einfach neu starten: pm2 start ... bzw den docker container neu starten.&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle in der setList / getList / readingList  nachzurüsten gibt es die Routine &amp;lt;code&amp;gt;sonos2mqtt_mod_list(devspec,attrName,line)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil bis zum &amp;quot;:&amp;quot;. Beispiel für die Komandozeile: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_bridge&#039;,&#039;readingList&#039;,&#039;sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply&#039;)}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Sprachausgabe ==&lt;br /&gt;
Man hat zwei Möglichkeiten, dies umzusetzen: &lt;br /&gt;
# Text2Speech FHEM intern&lt;br /&gt;
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/&lt;br /&gt;
&lt;br /&gt;
=== Text2Speech Variante einrichten ===&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. &amp;lt;code&amp;gt;apt install mp3wrap&amp;lt;/code&amp;gt;). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!&lt;br /&gt;
&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS TTS_Language Deutsch&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host &amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Sprachausgabe Befehle im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit &amp;lt;code&amp;gt;set Player notify volume uri&amp;lt;/code&amp;gt; abgespielt.&lt;br /&gt;
Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt.&lt;br /&gt;
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
Es sind zwei Befehle zur Sprachausgabe eingebaut: &lt;br /&gt;
&lt;br /&gt;
=== sayText Befehl ===&lt;br /&gt;
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt &amp;quot;gleichzeitig&amp;quot; eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.&lt;br /&gt;
&lt;br /&gt;
Die Lautstärke wird separat in SonosTTS gesetzt: &amp;lt;code&amp;gt;setreading SonosTTS vol 15&amp;lt;/code&amp;gt;,  ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) &amp;lt;code&amp;gt;attr SonosTTS TTS_Language Deutsch&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis: Der Befehl &amp;lt;code&amp;gt;set SonosTTS volume xx&amp;lt;/code&amp;gt; hat im Servermodus des Devices keine Wirkung!&#039;&#039;&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:&lt;br /&gt;
:&amp;lt;code&amp;gt;set Player speak &amp;lt;volume&amp;gt; text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set EG.KU.Sonos speak de-DE Vicki 25 Test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Volume Befehl ===&lt;br /&gt;
Der Befehl akzeptiert einen zweiten Wert als Startwert d.h. set volume 25 10 setzt sofort auf 10 und startet dann fading auf 25. Ein zweiter Wert -1 erzeugt ein fading vom aktuellen Wert auf den angegebenen.&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann auch den setter im Gerät erweitern &amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,q(playSound:textField ....))}&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit sind dann dieser Syntax möglich:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder ohne Dateiendung (wird auf mp3 gesetzt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge ===&lt;br /&gt;
Die SonsoBridge enthält bereits ein paar zentrale Funktionen und Readings, z.B. wird beim Laden der Favoritenliste ein Reading favlist und grouplist erzeugt, welches zur Erweiterung der Player mit Auswahllisten dienen kann.&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste und Gruppenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
get SonosBridge Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist, kann man allen Playern die Favoritenliste zum Auswählen eintragen. Beide Zeile sind für die FHEM Kommandozeile und verwenden die Routine aus der 99_sonos2mqttUtils.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;joinGroup:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;grouplist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;playFav:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;favlist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Listen der Favoriten Radios und Playlist erstellen ===&lt;br /&gt;
Im Sonos System kann man an (mindestens) drei Stellen Favoriten hinterlegen: Sonos-Favoriten, Sonos-Playlisten, TuneIn: Meine Radiosender&lt;br /&gt;
&lt;br /&gt;
Diese drei Listen kann man einlesen und für die einfache Suche und Auswahl verwenden. Der play Befehl akzeptiert dazu zwei weitere Parameter und sucht in den entsprechenden Listen.&lt;br /&gt;
&lt;br /&gt;
Diese play Befehle starten nicht sofort, sondern erst nach einem folgenden set ... play. Damit kann man etwas vorbereiten und gezielt starten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Favorite Deutschlandfunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Radio HitRadio&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Playlist Meine Hits&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sonos-Favoriten-, TuneIn: Meine Radiosender- und Sonos-Playlisten dazu vom Sonos System einmalig (bzw. bei Veränderungen) einlesen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein Guten Morgen Radio:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set alias=BadWanne,alias=Kueche joinGroup Bad;&lt;br /&gt;
set alias=BadWanne,alias=Bad volume 13 6;&lt;br /&gt;
set alias=Bad play Favorite Deutschlandfunk.Kultur.RP;&lt;br /&gt;
set alias=Kueche volume 18 8;&lt;br /&gt;
sleep 0.2;set alias=Bad play&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostation mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Das oben erwähnte &amp;lt;code&amp;gt;99_sonos2mqttUtils.pm&amp;lt;/code&amp;gt; (ab 6.1.2023) schreibt die Radios aus dem Reading &amp;quot;Favoriten&amp;quot; in das userReading &amp;quot;&amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt;&amp;quot; im SonosBridge Device und aktualisiert das auch.&lt;br /&gt;
&lt;br /&gt;
==== Der Befehl zum weiterschalten ====&lt;br /&gt;
Jedes Mal wenn dieser Befehl ausgeführt wird, wird der nächste &amp;quot;Radio-Favorit&amp;quot; (aus dem userReading &amp;quot;&amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt;&amp;quot; des SonosBridge Devices) gestartet.&lt;br /&gt;
&lt;br /&gt;
Wird eine Radiosender gespielt wird bei einem &amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; next&amp;lt;/code&amp;gt; auf den nächsten Sender in dieser Liste geschaltet und der &amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt; wird beibehalten.&lt;br /&gt;
&lt;br /&gt;
==== Name der Radiostation vor dem Umschalten ansagen ====&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste: &amp;lt;code&amp;gt;my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;))&amp;lt;/code&amp;gt; &lt;br /&gt;
* ermitteln des Namens des &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; Devices anhand des &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; Attributes: &amp;lt;code&amp;gt;my $play = (devspec2array(&#039;alias=Büro&#039;))[0]&amp;lt;/code&amp;gt;&lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;: &amp;lt;code&amp;gt;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r&amp;lt;/code&amp;gt;&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist: &amp;lt;code&amp;gt;sleep $tts:playing:.0&amp;lt;/code&amp;gt;, wird sie mit dem Befehl playUri an den oben ermittelten &amp;lt;code&amp;gt;&#039;&#039;sonos2mqtt_speaker&#039;&#039;&amp;lt;/code&amp;gt; gesendet: &amp;lt;code&amp;gt;set $play playUri [$tts:httpName]&amp;lt;/code&amp;gt;&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED: &amp;lt;code&amp;gt;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED&amp;lt;/code&amp;gt;&lt;br /&gt;
* danach wird der Radiosender gestartet: &amp;lt;code&amp;gt;set $play playFav $r&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen (&amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; toggleRadio&amp;lt;/code&amp;gt;). Dazu den Text unten in das Attribut &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; des Sonos Player Device hinzufügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
Erweiterung um Alarmhandling siehe [https://forum.fhem.de/index.php/topic,111711.msg1162031.html#msg1162031 Forum]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37919</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37919"/>
		<updated>2023-01-06T12:46:17Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Radioliste durchtasten */ Änderungen von 99_sonos2mqttUtils.pm eingearbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set alias=Büro play&amp;lt;/code&amp;gt;&lt;br /&gt;
Oder alle Player&lt;br /&gt;
:&amp;lt;code&amp;gt;set model=sonos2mqtt_speaker leaveGroup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der Player ==&lt;br /&gt;
Mit dem Template sonos_bridge_comfort wird aus dem contrib Ordner eine Datei 99_sonos2mqttUtils.pm nachgeladen und aktiviert. Darin befindet sich der wesentliche Code, die sonos2mqtt Geräte selbst enthalten nur rudimentäre Aufrufe. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man diese Datei jederzeit selbst gestalten (FHEM Menu:Edit Files) aber man sollte beachten, dass eine erneute Anwendung des Templates die Datei überschreibt.&lt;br /&gt;
&lt;br /&gt;
Man kann auch jederzeit diese Datei aus dem SVN neu laden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;contrib/AttrTemplate/99_sonos2mqttUtils.pm&amp;quot;, &amp;quot;FHEM/99_sonos2mqttUtils.pm&amp;quot;, sub(){ CommandReload(undef, &amp;quot;99_sonos2mqttUtils&amp;quot;) }) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hauptroutine ist sonos2mqtt die mit zwei Parametern aufgerufen wird. &amp;lt;code&amp;gt;{sonos2mqtt($NAME,$EVENT)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Optik des Players wird mit der Routine &amp;lt;code&amp;gt;sonos2mqtt_devStateIcon&amp;lt;/code&amp;gt; bestimmt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Player mittels &amp;lt;code&amp;gt;attr a:model=sonos2mqtt_speaker webCmd volume&amp;lt;/code&amp;gt; mit einem Slider in der Übersicht ausstatten.&lt;br /&gt;
&lt;br /&gt;
Ändert man die Sonoslandschaft, kann man auch alles einreißen und neu erzeugen lassen. Zunächst alles löschen (für die FHEM Kommandozeile):&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{fhem(&amp;quot;delete a:model=sonos2mqtt_speaker;;delete FileLog_MQTT2_RINCON.*&amp;quot;);;qx(rm ./log/MQTT2_RINCON_*);;return &amp;quot;&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach muss man sonos2mqtt einfach neu starten: pm2 start ... bzw den docker container neu starten.&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle in der setList / getList / readingList  nachzurüsten gibt es die Routine &amp;lt;code&amp;gt;sonos2mqtt_mod_list(devspec,attrName,line)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil bis zum &amp;quot;:&amp;quot;. Beispiel für die Komandozeile: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_bridge&#039;,&#039;readingList&#039;,&#039;sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply&#039;)}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Sprachausgabe ==&lt;br /&gt;
Man hat zwei Möglichkeiten, dies umzusetzen: &lt;br /&gt;
# Text2Speech FHEM intern&lt;br /&gt;
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/&lt;br /&gt;
&lt;br /&gt;
=== Text2Speech Variante einrichten ===&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. &amp;lt;code&amp;gt;apt install mp3wrap&amp;lt;/code&amp;gt;). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!&lt;br /&gt;
&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS TTS_Language Deutsch&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host &amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Sprachausgabe Befehle im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit &amp;lt;code&amp;gt;set Player notify volume uri&amp;lt;/code&amp;gt; abgespielt.&lt;br /&gt;
Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt.&lt;br /&gt;
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
Es sind zwei Befehle zur Sprachausgabe eingebaut: &lt;br /&gt;
&lt;br /&gt;
=== sayText Befehl ===&lt;br /&gt;
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt &amp;quot;gleichzeitig&amp;quot; eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.&lt;br /&gt;
&lt;br /&gt;
Die Lautstärke wird separat in SonosTTS gesetzt: &amp;lt;code&amp;gt;setreading SonosTTS vol 15&amp;lt;/code&amp;gt;,  ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) &amp;lt;code&amp;gt;attr SonosTTS TTS_Language Deutsch&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis: Der Befehl &amp;lt;code&amp;gt;set SonosTTS volume xx&amp;lt;/code&amp;gt; hat im Servermodus des Devices keine Wirkung!&#039;&#039;&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:&lt;br /&gt;
:&amp;lt;code&amp;gt;set Player speak &amp;lt;volume&amp;gt; text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set EG.KU.Sonos speak de-DE Vicki 25 Test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Volume Befehl ===&lt;br /&gt;
Der Befehl akzeptiert einen zweiten Wert als Startwert d.h. set volume 25 10 setzt sofort auf 10 und startet dann fading auf 25. Ein zweiter Wert -1 erzeugt ein fading vom aktuellen Wert auf den angegebenen.&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann auch den setter im Gerät erweitern &amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,q(playSound:textField ....))}&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit sind dann dieser Syntax möglich:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder ohne Dateiendung (wird auf mp3 gesetzt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge ===&lt;br /&gt;
Die SonsoBridge enthält bereits ein paar zentrale Funktionen und Readings, z.B. wird beim Laden der Favoritenliste ein Reading favlist und grouplist erzeugt, welches zur Erweiterung der Player mit Auswahllisten dienen kann.&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste und Gruppenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
get SonosBridge Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist, kann man allen Playern die Favoritenliste zum Auswählen eintragen. Beide Zeile sind für die FHEM Kommandozeile und verwenden die Routine aus der 99_sonos2mqttUtils.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;joinGroup:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;grouplist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;playFav:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;favlist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Listen der Favoriten Radios und Playlist erstellen ===&lt;br /&gt;
Im Sonos System kann man an (mindestens) drei Stellen Favoriten hinterlegen: Sonos-Favoriten, Sonos-Playlisten, TuneIn: Meine Radiosender&lt;br /&gt;
&lt;br /&gt;
Diese drei Listen kann man einlesen und für die einfache Suche und Auswahl verwenden. Der play Befehl akzeptiert dazu zwei weitere Parameter und sucht in den entsprechenden Listen.&lt;br /&gt;
&lt;br /&gt;
Diese play Befehle starten nicht sofort, sondern erst nach einem folgenden set ... play. Damit kann man etwas vorbereiten und gezielt starten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Favorite Deutschlandfunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Radio HitRadio&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Playlist Meine Hits&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sonos-Favoriten-, TuneIn: Meine Radiosender- und Sonos-Playlisten dazu vom Sonos System einmalig (bzw. bei Veränderungen) einlesen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein Guten Morgen Radio:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set alias=BadWanne,alias=Kueche joinGroup Bad;&lt;br /&gt;
set alias=BadWanne,alias=Bad volume 13 6;&lt;br /&gt;
set alias=Bad play Favorite Deutschlandfunk.Kultur.RP;&lt;br /&gt;
set alias=Kueche volume 18 8;&lt;br /&gt;
sleep 0.2;set alias=Bad play&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostation mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Das oben erwähnte &amp;lt;code&amp;gt;99_sonos2mqttUtils.pm&amp;lt;/code&amp;gt; (ab 6.1.2023) schreibt die Radios aus dem Reading &amp;quot;Favoriten&amp;quot; in das userReading &amp;quot;&amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt;&amp;quot; im SonosBridge Device und aktualisiert das auch.&lt;br /&gt;
&lt;br /&gt;
==== Der Befehl zum weiterschalten ====&lt;br /&gt;
Jedes Mal wenn dieser Befehl ausgeführt wird, wird der nächste &amp;quot;Radio-Favorit&amp;quot; (aus dem userReading &amp;quot;&amp;lt;code&amp;gt;favlist&amp;lt;/code&amp;gt;&amp;quot; des SonosBridge Devices) gestartet.&lt;br /&gt;
&lt;br /&gt;
Wird eine Radiosender gespielt wird bei einem &amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; next&amp;lt;/code&amp;gt; auf den nächsten Sender in dieser Liste geschaltet und der &amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt; wird beibehalten.&lt;br /&gt;
&lt;br /&gt;
==== Name der Radiostation vor dem Umschalten ansagen ====&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste: &amp;lt;code&amp;gt;my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;))&amp;lt;/code&amp;gt; &lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;,&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist, wird sie mit dem Befehl playUri an den Player gesendet,&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED,&lt;br /&gt;
* danach wird der Radiosender gestartet.&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen (&amp;lt;code&amp;gt;set &#039;&#039;sonos2mqtt_speaker&#039;&#039; toggleRadio&amp;lt;/code&amp;gt;). Dazu den Text unten in das Attribut &amp;lt;code&amp;gt;setList&amp;lt;/code&amp;gt; des Sonos Player Device hinzufügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favlist&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
Erweiterung um Alarmhandling siehe [https://forum.fhem.de/index.php/topic,111711.msg1162031.html#msg1162031 Forum]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37399</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=37399"/>
		<updated>2022-04-10T18:46:33Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Player mit Favoritenliste und Gruppenliste ausstatten */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set alias=Büro play&amp;lt;/code&amp;gt;&lt;br /&gt;
Oder alle Player&lt;br /&gt;
:&amp;lt;code&amp;gt;set model=sonos2mqtt_speaker leaveGroup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der Player ==&lt;br /&gt;
Mit dem Template sonos_bridge_comfort wird aus dem contrib Ordner eine Datei 99_sonos2mqttUtils.pm nachgeladen und aktiviert. Darin befindet sich der wesentliche Code, die sonos2mqtt Geräte selbst enthalten nur rudimentäre Aufrufe. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man diese Datei jederzeit selbst gestalten (FHEM Menu:Edit Files) aber man sollte beachten, dass eine erneute Anwendung des Templates die Datei überschreibt.&lt;br /&gt;
&lt;br /&gt;
Man kann auch jederzeit diese Datei aus dem SVN neu laden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;contrib/AttrTemplate/99_sonos2mqttUtils.pm&amp;quot;, &amp;quot;FHEM/99_sonos2mqttUtils.pm&amp;quot;, sub(){ CommandReload(undef, &amp;quot;99_sonos2mqttUtils&amp;quot;) }) }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Hauptroutine ist sonos2mqtt die mit zwei Parametern aufgerufen wird. &amp;lt;code&amp;gt;{sonos2mqtt($NAME,$EVENT)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Optik des Players wird mit der Routine &amp;lt;code&amp;gt;sonos2mqtt_devStateIcon&amp;lt;/code&amp;gt; bestimmt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Player mittels &amp;lt;code&amp;gt;attr a:model=sonos2mqtt_speaker webCmd volume&amp;lt;/code&amp;gt; mit einem Slider in der Übersicht ausstatten.&lt;br /&gt;
&lt;br /&gt;
Ändert man die Sonoslandschaft, kann man auch alles einreißen und neu erzeugen lassen. Zunächst alles löschen (für die FHEM Kommandozeile):&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{fhem(&amp;quot;delete a:model=sonos2mqtt_speaker;;delete FileLog_MQTT2_RINCON.*&amp;quot;);;qx(rm ./log/MQTT2_RINCON_*);;return &amp;quot;&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Danach muss man sonos2mqtt einfach neu starten: pm2 start ... bzw den docker container neu starten.&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle in der setList / getList / readingList  nachzurüsten gibt es die Routine &amp;lt;code&amp;gt;sonos2mqtt_mod_list(devspec,attrName,line)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil bis zum &amp;quot;:&amp;quot;. Beispiel für die Komandozeile: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_bridge&#039;,&#039;readingList&#039;,&#039;sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply&#039;)}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Sprachausgabe ==&lt;br /&gt;
Man hat zwei Möglichkeiten, dies umzusetzen: &lt;br /&gt;
# Text2Speech FHEM intern&lt;br /&gt;
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/&lt;br /&gt;
&lt;br /&gt;
=== Text2Speech Variante einrichten ===&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. &amp;lt;code&amp;gt;apt install mp3wrap&amp;lt;/code&amp;gt;). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!&lt;br /&gt;
&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS TTS_Language Deutsch&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host &amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Sprachausgabe Befehle im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit &amp;lt;code&amp;gt;set Player notify volume uri&amp;lt;/code&amp;gt; abgespielt.&lt;br /&gt;
Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt.&lt;br /&gt;
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
Es sind zwei Befehle zur Sprachausgabe eingebaut: &lt;br /&gt;
&lt;br /&gt;
=== sayText Befehl ===&lt;br /&gt;
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt &amp;quot;gleichzeitig&amp;quot; eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.&lt;br /&gt;
&lt;br /&gt;
Die Lautstärke wird separat in SonosTTS gesetzt: &amp;lt;code&amp;gt;setreading SonosTTS vol 15&amp;lt;/code&amp;gt;,  ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) &amp;lt;code&amp;gt;attr SonosTTS TTS_Language Deutsch&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis: Der Befehl &amp;lt;code&amp;gt;set SonosTTS volume xx&amp;lt;/code&amp;gt; hat im Servermodus des Devices keine Wirkung!&#039;&#039;&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:&lt;br /&gt;
:&amp;lt;code&amp;gt;set Player speak &amp;lt;volume&amp;gt; text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set EG.KU.Sonos speak de-DE Vicki 25 Test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Volume Befehl ===&lt;br /&gt;
Der Befehl akzeptiert einen zweiten Wert als Startwert d.h. set volume 25 10 setzt sofort auf 10 und startet dann fading auf 25. Ein zweiter Wert -1 erzeugt ein fading vom aktuellen Wert auf den angegebenen.&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann auch den setter im Gerät erweitern &amp;lt;code&amp;gt;{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,q(playSound:textField ....))}&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit sind dann dieser Syntax möglich:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder ohne Dateiendung (wird auf mp3 gesetzt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge ===&lt;br /&gt;
Die SonsoBridge enthält bereits ein paar zentrale Funktionen und Readings, z.B. wird beim Laden der Favoritenliste ein Reading favlist und grouplist erzeugt, welches zur Erweiterung der Player mit Auswahllisten dienen kann.&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste und Gruppenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
get SonosBridge Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist, kann man allen Playern die Favoritenliste zum Auswählen eintragen. Beide Zeile sind für die FHEM Kommandozeile und verwenden die Routine aus der 99_sonos2mqttUtils.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;joinGroup:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;grouplist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
{sonos2mqtt_mod_list(&#039;a:model=sonos2mqtt_speaker&#039;,&#039;setList&#039;,&#039;playFav:&#039;.ReadingsVal((devspec2array(&#039;a:model=sonos2mqtt_bridge&#039;))[0],&#039;favlist&#039;,&#039;&#039;).q( {sonos2mqtt($NAME,$EVENT)}))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Listen der Favoriten Radios und Playlist erstellen ===&lt;br /&gt;
Im Sonos System kann man an (mindestens) drei Stellen Favoriten hinterlegen: Sonos-Favoriten, Sonos-Playlisten, TuneIn: Meine Radiosender&lt;br /&gt;
&lt;br /&gt;
Diese drei Listen kann man einlesen und für die einfache Suche und Auswahl verwenden. Der play Befehl akzeptiert dazu zwei weitere Parameter und sucht in den entsprechenden Listen.&lt;br /&gt;
&lt;br /&gt;
Diese play Befehle starten nicht sofort, sondern erst nach einem folgenden set ... play. Damit kann man etwas vorbereiten und gezielt starten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Favorite Deutschlandfunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Radio HitRadio&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set alias=Büro play Playlist Meine Hits&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sonos-Favoriten-, TuneIn: Meine Radiosender- und Sonos-Playlisten dazu vom Sonos System einmalig (bzw. bei Veränderungen) einlesen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]&lt;br /&gt;
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein Guten Morgen Radio:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set alias=BadWanne,alias=Kueche joinGroup Bad;&lt;br /&gt;
set alias=BadWanne,alias=Bad volume 13 6;&lt;br /&gt;
set alias=Bad play Favorite Deutschlandfunk.Kultur.RP;&lt;br /&gt;
set alias=Kueche volume 18 8;&lt;br /&gt;
sleep 0.2;set alias=Bad play&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostation mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Eine eigene Radio Liste in ein Reading schreiben (Die Namen müssen zumindest in Teilen mit den Favoriten Titeln übereinstimmen)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig,Radio Station 3 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Template wird durch ein userReading die Liste beim Auslesen der Favoriten vorbelegt.&lt;br /&gt;
&lt;br /&gt;
Der Befehl zum weiterschalten. Jedes Mal wenn dieser Befehl ausgeführt wird, wird der nächste Favorit gestartet.&lt;br /&gt;
&lt;br /&gt;
Wird eine Radiosender gespielt wird bei einem set ... next auf den nächsten Sender in dieser Liste geschaltet und der transportState wird beibehalten.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Ideen ===&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste,&lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;,&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist, wird sie mit dem Befehl playUri an den Player gesendet,&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED,&lt;br /&gt;
* danach wird der Radiosender gestartet.&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen (set ... toggleRadio). Dazu den Text unten in das Attribut setList des Sonos Player Device hinzufügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
Erweiterung um Alarmhandling siehe [https://forum.fhem.de/index.php/topic,111711.msg1162031.html#msg1162031 Forum]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_und_Wettervorhersagen&amp;diff=36201</id>
		<title>Wetter und Wettervorhersagen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_und_Wettervorhersagen&amp;diff=36201"/>
		<updated>2021-11-16T14:24:10Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Vorhersage-Diagramm von YR */ YR hat das Format des Links zum Meteogram leicht geändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wetterdaten und Wettervorhersagen können auf verschiedene Weise in FHEM eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
== Modul Weather ==&lt;br /&gt;
Das Modul [[Weather]] extrahiert Wetterdaten via API von den Wetterdatenanbietern&lt;br /&gt;
* [https://openweathermap.org/ Openweathermap]&lt;br /&gt;
** Vorschauzeitraum: 5 Tage (zeitliche Auflösung: 3 Stunden)&lt;br /&gt;
** Aktuelle Daten (minütlich)&lt;br /&gt;
** 1000 Abrufe pro Tag mit dem Gratis-API-Key (Stand: Juni 2021)&lt;br /&gt;
* [https://www.wunderground.com/ wunderground]&lt;br /&gt;
** API-KEY nur für Gerätebesitzer&lt;br /&gt;
* [https://darksky.net/ DarkSky]&lt;br /&gt;
** API soll Ende 2022 abgeschaltet werden&lt;br /&gt;
** Es können keine neuen API-Key erstellt werden (Stand: Juni 2021)&lt;br /&gt;
&lt;br /&gt;
Da die Yahoo Weather API zum 03.01.2019 abgeschaltet wurde, kann Weather keine Wetterdaten von Yahoo mehr beziehen.&lt;br /&gt;
&lt;br /&gt;
== Unwetterzentrale ==&lt;br /&gt;
Informationen der Seite(n) Unwetterzentrale.de können mit Hilfe des Moduls [[UWZ]] eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
== Modul OPENWEATHER ==&lt;br /&gt;
Das Modul [[OPENWEATHER]] extrahiert Wetterdaten über die &amp;quot;openweather&amp;quot;-Schnittstelle (API) von www.wetter.com. &lt;br /&gt;
*Vorschau-Zeitraum: 3 Tage&lt;br /&gt;
*Vorschau-Interval: 6:00, 11:00, 17:00, 23:00&lt;br /&gt;
*Aktuelle Daten: keine&lt;br /&gt;
&lt;br /&gt;
== Modul PROPLANTA ==&lt;br /&gt;
Das Modul [[PROPLANTA]] extrahiert Wetterdaten von der Website www.proplanta.de. (keine API)&lt;br /&gt;
*Vorschau-Zeitraum: 12 Tage&lt;br /&gt;
*Vorschau-Interval: 3 h&lt;br /&gt;
*Aktuelle Daten: jede volle Stunde&lt;br /&gt;
&lt;br /&gt;
== Modul WWO ==&lt;br /&gt;
Das {{Link2CmdRef|Anker=WWO|Label=Modul WWO}} extrahiert Wetterdaten über die (alte) API von worldweatheronline.com&lt;br /&gt;
*Vorschau-Zeitraum: ?? Tage&amp;lt;BR&amp;gt;&lt;br /&gt;
*Vorschau-Interval: ??&amp;lt;br&amp;gt;&lt;br /&gt;
*Aktuelle Daten: ??&lt;br /&gt;
&lt;br /&gt;
== Deutscher Wetterdienst (DWD) ==&lt;br /&gt;
&lt;br /&gt;
=== Modul DWD_OpenData ===&lt;br /&gt;
Das Modul [[DWD_OpenData]] stellt einen Teil der frei verfügbaren Daten des Deutschen Wetterdienstes (DWD) bereit, die über den [https://www.dwd.de/DE/leistungen/opendata/opendata.html Open Data Server] abgerufen werden können (diverse Datenformate, keine API). &lt;br /&gt;
*Vorschau-Zeitraum: 10 Tage&lt;br /&gt;
*Vorschau-Interval: datenabhängig, viele mit 3 h&lt;br /&gt;
*Vorschau-Orte: national und international&lt;br /&gt;
*Aktuelle Daten: nicht implementiert&lt;br /&gt;
*Wetterwarnungen: für Landkreise und Gemeinden in deutsch oder englisch&lt;br /&gt;
&lt;br /&gt;
Es gibt zum Modul auch einen Weblink für [[FHEMWEB]], der zwei Icons pro Tag in horizontaler Form darstellt. Die Anzahl der insgesamt dargestellten Icons ist konfigurierbar. Liegen Wetterwarnungen vor, wird zusätzlich ein Warnsymbol angezeigt, über das man per Klick weitere Details zur Wetterwarnung abrufen kann.&lt;br /&gt;
&lt;br /&gt;
[[DWD_OpenData|Weitere Details und Installationsbeschreibung]]&lt;br /&gt;
&lt;br /&gt;
=== Wetterwarnungen als Karte ===&lt;br /&gt;
Der Deutsche Wetterdienst [http://www.dwd.de DWD] stellt neben diversen Wetterdaten auch Wetterwarnungen in Bildform bereit. Diese können sehr einfach via [http://fhem.de/commandref_DE.html#weblink weblink iframe] in FHEM eingebunden werden - das ist zwar nicht die schönste Form, aber die schnellste.&lt;br /&gt;
&lt;br /&gt;
Dazu sucht man sich zuerst auf der [http://www.dwd.de/bvbw/appmanager/bvbw/dwdwwwDesktop?_nfpb=true&amp;amp;_pageLabel=_dwdwww_wetter_warnungen_warnungen&amp;amp;T92053gsbDocumentPath=BEA__Navigation%2FWetter__Warnungen%2FWarnungen.html%3F__nnn%3Dtrue&amp;amp;lastPageLabel=dwdwww_wetter_warnungen Warnungsseite des DWD] die eigene Region heraus (in der Karte durchklicken). Die gewünschte URL für Berlin Stadt ist z.B. &amp;lt;code&amp;gt;http://www.dwd.de/dyn/app/ws/html/reports/BXX_warning_de.html#WS_ANCHOR_0&amp;lt;/code&amp;gt;. Das Anhängsel &amp;lt;code&amp;gt;#WS_ANCHOR_0&amp;lt;/code&amp;gt; kann man in der Konfiguration auch weglassen.&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in FHEM sieht dann wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dwd_warnmeldung weblink iframe http://www.dwd.de/dyn/app/ws/html/reports/BXX_warning_de.html&lt;br /&gt;
attr dwd_warnmeldung group Wetterwarnungen (DWD)&lt;br /&gt;
attr dwd_warnmeldung htmlattr width=&amp;quot;100%&amp;quot; height=&amp;quot;300&amp;quot; frameborder=&amp;quot;0&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot;&lt;br /&gt;
attr dwd_warnmeldung room Wettervorhersage,Startseite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vorhersage-Diagramm von YR ==&lt;br /&gt;
[http://www.yr.no YR] ist die Seite des norwegischen Wetterdiensts. Er ist zwar nur in Teilen auf Englisch (und gar nicht auf Deutsch) verfügbar, bietet aber sehr gute Wettervorhersagen - auch mit eigenen Vorhersagen für kleine Dörfer. Neben etlichen Detailinfos bietet YR eine sehr schicke 48h-Vorhersage-Grafik. Diese kann sehr einfach via [http://fhem.de/commandref_DE.html#weblink weblink iframe] in FHEM eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
Dazu geht man auf die [http://www.yr.no Startseite von YR] und gibt in das Suchfeld den Namen seines Dörfchens ein - die Ergebnissliste kann ziemlich lang werden, sodass man evtl. sehr genau schauen muss, welches das eigene Kaff ist - bei mir war es an 29. Stelle... ;-) Auf der gewünschten Seite gibt es einen Unterpunkt &amp;quot;Forecast as SVG&amp;quot;, wo sich die besagte Grafik findet. Hier kopiert man sich einfach die URL der Grafik.&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in FHEM sieht dann bspw. wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Wetter_yr_Vorhersage weblink iframe https://www.yr.no/en/content/2-2950159/meteogram.svg&lt;br /&gt;
attr Wetter_yr_Vorhersage group Wettervorhersage (yr)&lt;br /&gt;
attr Wetter_yr_Vorhersage htmlattr width=&amp;quot;782&amp;quot; height=&amp;quot;391&amp;quot; frameborder=&amp;quot;0&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot;&lt;br /&gt;
attr Wetter_yr_Vorhersage room Wettervorhersage,Start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wetter von Weather Underground ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Das (&amp;quot;offene&amp;quot;) API von Weather Underground wird derzeit (März 2019) &amp;quot;retired&amp;quot; = abgestellt, ist also künftig nicht mehr nutzbar! Den benötigten API-Key bekommen &amp;quot;nur noch&amp;quot; Betreiber einer Wetterstation, die diese bei wundergound registrieren und ihre Daten hochladen.}}&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die hier beschriebene Vorgehensweise ist etwas anspruchsvoller und somit eher für erfahrene FHEM-User geeignet.&lt;br /&gt;
&lt;br /&gt;
[http://www.wunderground.com/ Weather Underground] bietet eine sehr umfassende Sammlung aller möglichen offiziellen und privaten (aber teils sehr professionellen) Wetterstationen weltweit. Es besteht eine recht hohe Wahrscheinlichkeit, dass es in der eigenen Umgebung schon eine Wetterstation gibt. Anstatt nun selbst eine komplette Wetterstation aufzubauen, kann man alternativ auf die Daten der Nachbarstation zugreifen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Neben dem hier vorgestellten Abruf der Weather Underground-Daten mit [[HTTPMOD]] kann auf Weather Underground-Daten auch mit dem darauf spezialisierten Modul [http://fhem.de/commandref.html#Wunderground Wunderground] zugegriffen werden.}}&lt;br /&gt;
&lt;br /&gt;
Dazu sind grundsätzlich die folgenden Schritte notwendig:&lt;br /&gt;
* Finden der geeigneten Station&lt;br /&gt;
* Auswerten der XML-Daten&lt;br /&gt;
* Erstellen passender gplot-Dateien&lt;br /&gt;
&lt;br /&gt;
=== Finden der geeigneten Station ===&lt;br /&gt;
Als erstes geht man auf die [http://www.wunderground.com Startseite von Weather Underground] und gibt in das Suchfeld den Namen seines Dörfchens oder der nächsten Stadt ein - für Berlin landet man bspw. auf Seite für &amp;quot;Berlin Alexanderplatz&amp;quot;. Es gibt aber manchmal sehr viele Wetterstationen in der direkten Umgebung. Diese findet man indem am auf &amp;quot;Change Station&amp;quot; klickt und sich eine passende Station aussucht. Nähere Infos (zB. zur verwendeten Hard- und Software) zu der gewählten Wetterstation erhält man, wenn man auf den Namen der Station klickt und dann auf &amp;quot;About this PWS&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Weather Underground stellt die Daten der Wetterstation auch über eine API als XML bereit, die wir auswerten können. Die entsprechende URL findet sich ebenfalls unter &amp;quot;About this PWS&amp;quot; unter &amp;quot;Download current conditions XML&amp;quot;. Für Berlin Prenzlauer Berg wäre dies z.B. &lt;br /&gt;
&amp;lt;code&amp;gt;http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBERLIN15&amp;amp;format=XML&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Entscheidend für die jeweilige Station ist der Teil nach &amp;quot;?=ID&amp;quot;, also in diesem Fall &amp;quot;IBERLIN15&amp;quot;. Dieser Teil des Links lässt sich leicht durch die ID einer anderen Station ersetzen und die Suche nach dem entsprechenden Link auf der Seite der Station bleibt erspart.&lt;br /&gt;
&lt;br /&gt;
=== Auswerten der XML-Daten ===&lt;br /&gt;
Die Auswertung der XML-Daten erfolgt via [[HTTPMOD]]. Da dies nicht ganz trivial ist, sind im Folgenden zuerst die wesentlichen Konfigurationsschritte exemplarisch beschrieben. Weiter unten findet sich dann die fertige vollständige Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Es erstes wird das Device HTTPMOD definiert (die 600 am Schluss ist der Aktualisierungszyklus in Sekunden, also alle 10 min):&lt;br /&gt;
:&amp;lt;code&amp;gt;define wetter_prenzelberg HTTPMOD http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=IBERLIN15 600 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden Attribute für alle Readings definiert:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg userattr readingsName_cloudiness readingsName_date ... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird jedem Attribut ein Name zugewiesen (unter diesem Namen wird der Wert ins Log geschrieben):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg readingsName_cloudiness cloudiness &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss wird das Reading selbst definiert:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg readingsRegex_cloudiness cloudiness id=&amp;quot;NN&amp;quot; percent=&amp;quot;([\d\.]+) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration für alle von der API angebotenen Wetterwerte sieht dann wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define wetter_prenzelberg HTTPMOD http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=IBERLIN15 600&lt;br /&gt;
attr wetter_prenzelberg userattr readingsName_cloudiness readingsName_date readingsName_dewpointTemperature readingsName_fog readingsName_heatindex readingsName_humidity readingsName_pressure readingsName_solarRadiation readingsName_solarUV readingsName_temperature readingsName_time readingsName_windChill readingsName_windDegrees readingsName_windDirection readingsName_windGust readingsName_windSpeed readingsRegex_cloudiness readingsRegex_date readingsRegex_dewpointTemperature readingsRegex_fog readingsRegex_heatindex readingsRegex_humidity readingsRegex_pressure readingsRegex_solarRadiation readingsRegex_solarUV readingsRegex_temperature readingsRegex_time readingsRegex_windChill readingsRegex_windDegrees readingsRegex_windDirection readingsRegex_windGust readingsRegex_windSpeed&lt;br /&gt;
attr wetter_prenzelberg readingsName_cloudiness cloudiness&lt;br /&gt;
attr wetter_prenzelberg readingsName_date date&lt;br /&gt;
attr wetter_prenzelberg readingsName_dewpointTemperature dewpointTemperature&lt;br /&gt;
attr wetter_prenzelberg readingsName_fog fog&lt;br /&gt;
attr wetter_prenzelberg readingsName_heatindex heatindex&lt;br /&gt;
attr wetter_prenzelberg readingsName_humidity humidity&lt;br /&gt;
attr wetter_prenzelberg readingsName_pressure pressure&lt;br /&gt;
attr wetter_prenzelberg readingsName_solarRadiation solarRadiation&lt;br /&gt;
attr wetter_prenzelberg readingsName_solarUV solarUV&lt;br /&gt;
attr wetter_prenzelberg readingsName_temperature temperature&lt;br /&gt;
attr wetter_prenzelberg readingsName_time time&lt;br /&gt;
attr wetter_prenzelberg readingsName_windChill windChill&lt;br /&gt;
attr wetter_prenzelberg readingsName_windDegrees windDegrees&lt;br /&gt;
attr wetter_prenzelberg readingsName_windDirection windDirection&lt;br /&gt;
attr wetter_prenzelberg readingsName_windGust windGust&lt;br /&gt;
attr wetter_prenzelberg readingsName_windSpeed windSpeed&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_cloudiness cloudiness id=&amp;quot;NN&amp;quot; percent=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_date date date&amp;quot; content=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_dewpointTemperature &amp;lt;dewpoint_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_fog fog id=&amp;quot;FOG&amp;quot; percent=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_heatindex &amp;lt;heat_index_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_humidity &amp;lt;relative_humidity&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_pressure &amp;lt;pressure_mb&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_solarRadiation &amp;lt;solar_radiation&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_solarUV &amp;lt;UV&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_temperature &amp;lt;temp_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_time time Zeit([\d\:]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windChill &amp;lt;windchill_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windDegrees &amp;lt;wind_degrees&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windDirection &amp;lt;wind_dir&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windGust &amp;lt;wind_gust_mph&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windSpeed &amp;lt;wind_mph&amp;gt;([\d\.]+)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Nicht immer werden alle Werte geliefert (wenn keine Sonne, dann kein UV-Wert...). Im System-Log kann das als Fehler auftauchen, ist aber kein Problem.&lt;br /&gt;
&lt;br /&gt;
=== Erstellen passender gplot-Dateien ===&lt;br /&gt;
Um die ausgelesenen Werte als Graphen darstellen zu können müssen eigene gplot-Dateien erstellt werden. Eine grundsätzliche Anleitung dazu findet sich unter [[Creating Plots]]. Deshalb sollen hier nur Beispiele für die eigentlichen gplot-Dateien vorgestellt werden. Beispiele sollten sowohl für [[FileLog]] wie [[DbLog]] funktionieren.&lt;br /&gt;
&lt;br /&gt;
Temperatur und Luftfeuchte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics &lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics&lt;br /&gt;
set ylabel &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Humidity (%)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:temperature\x3a::&lt;br /&gt;
#FileLog 4:windChill\x3a::&lt;br /&gt;
#FileLog 4:humidity\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:temperature::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windChill::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:humidity::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur (C)&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Gefühlte Temperatur (C)&#039; ls l1 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftfeuchtigkeit (%)&#039; ls l2fill lw 0.2 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wind und Windrichtung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
set ytics&lt;br /&gt;
set y2tics (&amp;quot;Nord&amp;quot; 0, &amp;quot;Ost&amp;quot; 80, &amp;quot;S&amp;amp;#252;d&amp;quot; 180, &amp;quot;West&amp;quot; 270, &amp;quot;Nord&amp;quot; 360)&lt;br /&gt;
&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
set grid xtics ytics&lt;br /&gt;
&lt;br /&gt;
set yrange [0:20]&lt;br /&gt;
set y2range [0:360]&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Wind (mph)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Richtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:windSpeed:0:&lt;br /&gt;
#FileLog 4:windGust:0:&lt;br /&gt;
#FileLog 4:windDegrees:0:&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windSpeed::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windGust::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windDegrees::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Wind (mph)&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Böen (mph)&#039; ls l1 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Windrichtung (°)&#039; ls l2fill lw 0.2 with points&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sonnenintensität und UV-Werte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
set ytics&lt;br /&gt;
set y2tics&lt;br /&gt;
&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
set grid xtics ytics&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Sonnenstrahlung (W/qm)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;UV&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:solarRadiation:0:&lt;br /&gt;
#FileLog 4:solarUV:0:&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:solarRadiation::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:solarUV::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Strahlung&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;UV&#039; ls l1 lw 1.5 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weitere TBD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Vergangene Daten abfragen ===&lt;br /&gt;
Ein konkretes vergangenes Datum der Wetterstation kann man übrigens auch abrufen - für den 28.11.2014 wäre dies bspw. &lt;br /&gt;
&amp;lt;code&amp;gt;http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBERLIN15&amp;amp;day=28&amp;amp;month=11&amp;amp;year=2014&amp;amp;graphspan=day&amp;amp;format=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Wetterdaten hochladen ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Unterstützung für das Modul gibt es im dazugehörigen {{Link2Forum|Topic=65587|LinkText=Forumsthread }}.}}&lt;br /&gt;
Wer eigene Wetterdaten hochladen will, kann hierzu das {{Link2CmdRef|Anker=WUup|Label=Modul WUup}} verwenden. Dazu benötigt man die Zugangsdaten (stationID und Paßwort) für eine eigene Wetterstation. Mit dem Modul können die meisten vom [http://web.archive.org/web/20180815041359/http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol PWS Upload Protocol] unterstützten Daten hochgeladen werden:&lt;br /&gt;
* Winddir - [0-360 momentane Windrichtung]&lt;br /&gt;
* Windspeedmph - [mph momentane Windgeschwindigkeit]&lt;br /&gt;
* Windgustmph - [mph aktuellen Böe, mit Software-spezifischem Zeitraum]&lt;br /&gt;
* Windgustdir - [0-360 mit Software-spezifischer Zeit]&lt;br /&gt;
* Windspdmph_avg2m - [mph durchschnittliche Windgeschwindigkeit innerhalb 2 Minuten]&lt;br /&gt;
* Winddir_avg2m - [0-360 durchschnittliche Windrichtung innerhalb 2 Minuten]&lt;br /&gt;
* Windgustmph_10m - [mph Böen der vergangenen 10 Minuten]&lt;br /&gt;
* Windgustdir_10m - [0-360 Richtung der Böen der letzten 10 Minuten]&lt;br /&gt;
* Feuchtigkeit - [% Außenfeuchtigkeit 0-100%]&lt;br /&gt;
* Dewptf- [F Taupunkt im Freien]&lt;br /&gt;
* Tempf - [F Außentemperatur]&lt;br /&gt;
* Rainin - [in Regen in der vergangenen Stunde]&lt;br /&gt;
* Dailyrainin - [in Regenmenge bisher heute]&lt;br /&gt;
* Baromin - [inHg barometrischer Druck]&lt;br /&gt;
* Soiltempf - [F Bodentemperatur]&lt;br /&gt;
* Bodenfeuchtigkeit - [%]&lt;br /&gt;
* Solarradiation - [W/m²]&lt;br /&gt;
* UV - [Index]&lt;br /&gt;
* AqPM2.5 - Feinstaub PM2,5 [µg/m³]&lt;br /&gt;
* AqPM10 - Feinstaub PM10 [µg/m³]&lt;br /&gt;
&lt;br /&gt;
Die Werte werden im Modul für Wunderground ins anglo-amerikanische System umgerechnet. Temperaturen werden also automatisch von °Celsius in Fahrenheit, Windgeschwindigkeiten von km/h in mph, mm in Inch und der barometrische Druck von hPa in inHg umgerechnet.&lt;br /&gt;
&lt;br /&gt;
== Wetternetzwerk auf wetter.com ==&lt;br /&gt;
Ein vollständiges Beispiel zur Nutzung der Informationen über die Regenmenge (Station 1445, Weinheim) von wetter.com ist in {{Link2Forum|Topic=39600|Message=332837|LinkText=diesem Forenbeitrag}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Wetter von netatmo ==&lt;br /&gt;
Das FHEM-Modul [[netatmo]] ermöglicht den Datenimport von privaten und öffentlichen netatmo Wetterstationen sowie den Abruf der in der Netatmo App verfügbaren Wettervorhersage. Eine Übersicht über die verfügbaren öffentlichen Stationen findet sich auf der Seite [http://www.netatmo.com/de-DE/weathermap Weathermap]. Die meisten öffentlichen Stationen liefern Temperatur, Luftfeuchte und Luftdruck, einige auch Wind, Regen und Daten zur Luftqualität (CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=33610|LinkText=Forenthema}} mit Sammlung und Beipielen von Internet-Links für die Anzeige von teilweise animierten Wetterbildern&lt;br /&gt;
* [http://bloglich.de/art/rpi/wetterdaten-auf-dem-raspberry-pi-in-fhem/ Beispiel in Blog(de)]&lt;br /&gt;
* [[HTTPMOD]]       [[Kategorie:Code Snippets]]   [[Kategorie:HOWTOS]]   [[Kategorie:Wetterstationen]] &amp;lt;!-- eigentlich eine &amp;quot;Hardware-Kategorie&amp;quot;, passt aber trotzdem --&amp;gt;&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35834</id>
		<title>AutoShuttersControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=35834"/>
		<updated>2021-06-19T19:14:30Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Bedingungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Rollläden&lt;br /&gt;
|ModCategory=Automatisierung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=73_AutoShuttersControl.pm&lt;br /&gt;
|ModOwner=CoolTux ({{Link2FU|13684|Forum}}/[[Benutzer Diskussion:CoolTux|Wiki]])}}&lt;br /&gt;
Mit [[AutoShuttersControl]] oder kurz &#039;&#039;&#039;ASC&#039;&#039;&#039; können Rollläden automatisch hoch und herunter gefahren werden. Zum Beispiel Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang, Beschatten abhängig vom Sonnenstand oder Anfahren von Lüftungspositionen nach Öffnen des zugehörigen Fensters. &lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
{{Hinweis|Das Modul befindet sich derzeit noch in der Entwicklung; der derzeit aktuelle Stand ist  diesem {{Link2Forum|Topic=112325|LinkText=&amp;quot;Thread im Forum&amp;quot;}} zu entnehmen.}}&lt;br /&gt;
Als Voraussetzung sollten folgende FHEM-Devices bereits vorhanden sein:&lt;br /&gt;
* Rollläden,&lt;br /&gt;
* Fensterkontakte,&lt;br /&gt;
* Bewohnerstatus auf Basis von Residents/Roomates in englisch. Ersatzweise andere Devices, z.B. Dummys, welche als &#039;&#039;state&#039;&#039; &#039;&#039;home&#039;&#039;, &#039;&#039;absent&#039;&#039;, &#039;&#039;asleep&#039;&#039;, &#039;&#039;gotosleep&#039;&#039; und &#039;&#039;awoken&#039;&#039; setzen sowie ein Reading &#039;&#039;lastState&#039;&#039;.&lt;br /&gt;
* Helligkeitssensor (Steuerung nach Helligkeit für Beschattung)&lt;br /&gt;
* Ein Device zur Bestimmung des Sonnenstands (nur für Beschattung). Unterstützt werden derzeit [[Modul Astro|Astro]] und [[Twilight]]&amp;lt;ref&amp;gt;Dabei müssen ggf. in [[Global|global]] auch Angaben zu &#039;&#039;longitude&#039;&#039; und &#039;&#039;latitude&#039;&#039; vorhanden sein&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* Wenn Feiertage berücksichtigt werden sollen: Ein oder mehrere {{Link2CmdRef|Anker=holiday2we|Lang=en|Label=holiday2we}}-Angaben in [[Global|global]] samt entsprechender [[Wochenende, Feiertage und Schulferien#Feiertage mittels holiday-Datei|holiday]]-Dateien&amp;lt;ref&amp;gt;Es kann auch z.B. ein Dummy-Device verwendet werden, dieses sollte dann aber neben dem eigentlichen Feiertags-&#039;&#039;state&#039;&#039; auch in einem Reading &#039;&#039;tomorrow&#039;&#039; Angaben zu anstehenden Feiertagen enthalten.&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;Bitte verfahren Sie entsprechend, wenn Urlaubs- oder Ferientage wie Feiertage behandelt werden sollen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Moduls bzw. dessen Funktionalität erfolgt in mehreren Schritten:&lt;br /&gt;
* Definition des ASC-Devices&lt;br /&gt;
* Einstellung zentraler Vorgaben am ASC-Device&lt;br /&gt;
* Markieren der zukünftig zu steuernden Rollladen-Devices&lt;br /&gt;
* Einbinden der Rollladen-Devices in das ASC-Device&lt;br /&gt;
* Einstellen der individuellen Vorgaben je Rollladen (am Rollladen-Device)&lt;br /&gt;
Dabei geht man am einfachsten schrittweise vor und erweitert die Funktionalität nach und nach um die gewünschten Funktionen. Dann benötigt man jeweils nur einen kleinen Teil der vielen per Attribut einstellbaren Optionen, und kann die Auswirkungen der jeweiligen Änderung besser nachvollziehen. &lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
{{Hinweis|ASC kann auch verwendet werden, um lediglich Teilaufgaben der Rollladensteuerung zu erfüllen, also z.B. nur das morgendliche Öffnen der Rollläden. Allerdings geht dabei ein erheblicher Teil des Komforts verloren, der dadurch entsteht, dass die Steuerung innerhalb der vollintegrierten Lösung jeweils nachvollzieht, aus welchem Grund eine Fahrt erfolgt war und dies ggf. bei der nächsten Aktion berücksichtigt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Zunächst sollten die in den [[#Basics|Basics]] beschriebenen Geräte vorhanden und funktionsfähig sein. &lt;br /&gt;
&lt;br /&gt;
=== Define des ASC-Devices ===&lt;br /&gt;
Es genügt ein einfaches define ohne weitere Parameter.&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt neben der Anlage des Devices selbst auch, dass als weiteres globales Attribut &#039;&#039;ASC&#039;&#039; verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung zentraler Vorgaben ===&lt;br /&gt;
Mit Attributen am ASC-Device wird das Verhalten des ASC-Devices eingestellt, z.B. Vermeiden von morgendlichen oder abendlichen Fahrten, Frostschutzfunktion bei Gefahr von festgefrorenen Rollläden oder die Reaktion auf Fensterkontakte. Details sind der Commandref zu entnehmen.&lt;br /&gt;
Diese Attribute können jederzeit geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Auswählen zu steuernder Rollladen-Devices ===&lt;br /&gt;
Für jeden vom ASC-Device kontrollierten Rollladen muss das globale Attribut &#039;&#039;ASC&#039;&#039; gesetzt werden. Das steht nach dem Definieren des ASC-Devices zur Verfügung. Das Attribut ist mit 1 oder 2 festzulegen: &lt;br /&gt;
# Je &#039;&#039;kleiner&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert um so weiter ist der Rollladen geschlossen. Typischerweise ist dann 0 &#039;&#039;offen&#039;&#039; und 100 &#039;&#039;geschlossen&#039;&#039;. Dies ist z.B. die  passende Wahl für ROLLO-Devices&lt;br /&gt;
# Je &#039;&#039;größer&#039;&#039; der &amp;lt;code&amp;gt;pct&amp;lt;/code&amp;gt; Wert desto weiter ist der Rollladen geschlossen, also &#039;&#039;offen&#039;&#039; für &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; pct 100&amp;lt;/code&amp;gt;. Typische Vertreter dieses Typs sind HomeMatic (CUL_HM-) Geräte oder die Shelly2-Aktoren.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dem Parameter leitet das Modul bestimmte Voreinstellungen (&#039;&#039;defaults&#039;&#039;) für den Rollladen ab. Es genügt daher, nur jeweils die Einstellungen zu verändern, die anders gewünscht werden oder für den Rollladenaktortyp anders sein müssen (z.B. &#039;&#039;dim 99&#039;&#039; für vollständiges Öffnen eines ZWave-Aktors).&lt;br /&gt;
{{Hinweis|Das Vorstehende gilt jeweils für den nicht-invertierten Modus! Wer z.B. ein HomeMatic-Gerät mit &#039;&#039;levelinverse&#039;&#039; betreibt, sollte &#039;&#039;ASC&#039;&#039; auf &amp;quot;1&amp;quot; setzen usw.. Maßgeblich ist letztlich nur die Frage, ob die Offen-Positionsangabe nummerisch kleiner oder größer als die Geschlossen-Positionsangabe ist; die konkreten Zahlenwerte spielen dabei keine Rolle, die Angabe &#039;&#039;position&#039;&#039; oder &#039;&#039;pct&#039;&#039; kann auch später über ein weiteres Attribut passend eingestellt werden.}}&lt;br /&gt;
&lt;br /&gt;
=== Einbinden in das ASC-Device ===&lt;br /&gt;
Nachdem das ASC Attribut für die betreffenden Rollladen-Devices gesetzt ist, muss mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; scanForShutters&amp;lt;/code&amp;gt; ein Suchlauf gestartet werden, mit dem diese Rollläden in die Steuerungslogik eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellen der individuellen Vorgaben ===&lt;br /&gt;
Die gefundenen Rollladen-Devices erhalten weitere Attribute, mit denen für den jeweiligen Rollladen benötigte Einstellungen vorgenommen werden. &lt;br /&gt;
Diese Attribute sind in der commandref beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
===Readings im zentralen ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|..._nextAstroTimeEvent || || Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up/ASC_Time_Down angezeigt. Bei &#039;&#039;astro&#039;&#039; die Uhrzeit des  Sonnenauf- oder Sonnenuntergang, bei &#039;&#039;time&#039;&#039; und &#039;&#039;brightness&#039;&#039; die Zeit aus ASC_Time_Up_Early/ASC_Time_Down_Late pro Rollonamen&lt;br /&gt;
|-&lt;br /&gt;
|..._lastPosValue || || Position pro Rollonamen, bevor ASC die Rollläden verfahren hat.&lt;br /&gt;
|-&lt;br /&gt;
|..._PosValue || ||aktuelle Position pro Rollonamen.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||globale ASC Steuerung bei den Rollläden aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||globale Beschattungsfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut || on, off ||Status des hardwareseitigen Aussperrschutzes / gilt nur für Rollläden mit dem Attribut bei denen das Attributs ASC_LockOut entsprechend auf hard gesetzt ist.&lt;br /&gt;
|-&lt;br /&gt;
|selfDefense || on, off ||globale Selbstschutzfunktion aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off || globaler Partymodus aktiv oder inaktiv&lt;br /&gt;
|-&lt;br /&gt;
|state || ||Status des ASC-Devices: active, enabled, disabled oder weitere Statusinformationen wie z.B. Grund der letzen Fahrt.&lt;br /&gt;
|-&lt;br /&gt;
|room_... || ||Auflistung aller Rollläden, welche in den jeweiligen Räumen gefunden wurden, Bsp.: room_Schlafzimmer,Terrasse.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday|| on,off ||globale Wochenendunterstützung aktiv oder inaktiv.&lt;br /&gt;
|-&lt;br /&gt;
|userAttrList || rolled out ||Das ASC-Modul verteilt an die gesteuerten Rollladen-Geräte diverse Benutzerattribute (userattr). In diesem Reading kann der Status dieser Verteilung geprüft werden.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings in den Rolllädendevices ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Enable ||Status von ASC_Enable (on,off).&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersLastDrive ||Grund der letzten Fahrt des Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveDown ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Down angezeigt. Bei astro die Uhrzeit des Sonnenuntergangs, bei time und brightness die Zeit aus /ASC_Time_Down_Late &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveUp ||Zeit wird abhängig von der eingestellten Attribute ASC_Time_Up angezeigt. Bei astro die Uhrzeit des Sonnenaufgangs, bei time und brightness die Zeit aus /ASC_Time_Up_Early&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==set- und get-Befehle für das ASC-Device==&lt;br /&gt;
=== set-Anweisungen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Beschreibung  &lt;br /&gt;
|-&lt;br /&gt;
|advDriveDown ||on, off ||Nachholen der durch ASC_Adv on ausgesetzten Fahrten.&lt;br /&gt;
|-&lt;br /&gt;
|ascEnable||on, off ||Aktiviert oder deaktiviert die globale ASC-Steuerung.&lt;br /&gt;
|-&lt;br /&gt;
|controlShading||on, off ||Aktiviert oder deaktiviert die globale Beschattungssteuerung.&lt;br /&gt;
|-&lt;br /&gt;
|createNewNotifyDev || ||Legt die interne Struktur für NOTIFYDEV neu an. (Diese Funktion steht nur zur Verfügung, wenn Attribut ASC_expert auf 1 gesetzt ist.)&lt;br /&gt;
|-&lt;br /&gt;
|hardLockOut ||on, off ||Aktiviert den hardwareseitigen Aussperrschutz für die Rollläden, bei denen das Attributs ASC_LockOut auf hard gesetzt ist. Mehr Informationen in der Beschreibung bei den Attributen für die Rollladengeräten.&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off ||Aktiviert den globalen Partymodus. Alle Rollladen-Geräten, in welchen das Attribut ASC_Partymode auf on gesetzt ist, werden durch ASC nicht mehr gesteuert. Der letzte Schaltbefehl, der bspw. durch ein Fensterevent oder Wechsel des Bewohnerstatus an die Rollläden gesendet wurde, wird beim Deaktivieren des Partymodus ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|renewAllTimer || ||Erneuert bei allen Rollläden die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|renewTimer || ||Erneuert bei dem ausgewählten Rollladen die Zeiten gemäß ASC_UP/ASC_DOWN und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|scanForShutters || ||Sucht alle FHEM Devices mit dem Attribut &#039;&#039;ASC&#039;&#039; &#039;&#039;1&#039;&#039; oder &#039;&#039;2&#039;&#039; und legt diese im ASC-Modul an&lt;br /&gt;
|-&lt;br /&gt;
|selfDefence ||on, off||Aktiviert bzw. deaktiviert die Selbstschutzfunktion. Beispiel 1: Wenn das Residents-Gerät &#039;&#039;gone&#039;&#039; meldet, alle Rollläden dann heruntergefahren.  Beispiel 2 : Wenn das Residents-Gerät &#039;&#039;absent&#039;&#039; meldet, das Attribut ASC_ShuttersPlace=terrace ist und ein Fenster im Haus noch geöffnet ist, so wird an diesem Fenster der Rollladen  dann heruntergefahren.&lt;br /&gt;
|-&lt;br /&gt;
|shutterASCenableToggle ||  ||Aktivieren oder deaktivieren der ASC Kontrolle des einzelnen Rollladens.&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday || on,off ||Aktiviert die Wochenendunterstützung. Dann wird das Attribut ASC_Time_Up_WE_Holiday am Rollladen-Device beachtet.&lt;br /&gt;
|-&lt;br /&gt;
|wiggle ||||Bewegt einen oder mehrere Rollläden um einen definierten Wert (Default: 5%) und nach einer Minute wieder zurück in die Ursprungsposition. Diese Funktion könnte bspw. zur Abschreckung in einem Alarmsystem eingesetzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get-Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| showNotifyDevsInformations ||Zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Diese Funktion wird für das Debugging genutzt. Hierzu ist das Attribut ASC_expert = 1 zu setzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
{{Hinweis|Die Attributnamen haben sich teilweise geändert, nachfolgend ist der Stand von Modulversion v0.8.x wiedergegeben.}}&lt;br /&gt;
{{Hinweis|In der commandref findet sich häufig die Schreibweise &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;ASC_BrightnessSensor Sensorname[:brightness [400:800]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Dabei sind die Angaben in den eckigen Klammern optional. Dies müssen also nicht angegeben werden, stattdessen verwendet das Modul dann Standardwerte (siehe cref), die in der cref zu findenden Angaben entsprechen dabei den defaults. Werden Werte angegeben, sind die eckigen Klammern &#039;&#039;&#039;wegzulassen&#039;&#039;&#039;! Beispiel: &amp;lt;code&amp;gt;ASC_BrightnessSensor hm_motion_1 70:100&amp;lt;/code&amp;gt; würde das brightness-Reading des Sensors hm_motion_1 verwenden und einen morgendlichen Schwellenwert von 70 bzw. 100 für abends.}}&lt;br /&gt;
===Attribute direkt am ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning || ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlComfort ||on, off || off ||schaltet die Komfortfunktion an. Bedeutet, dass ein Rollladen mit einem threestate-Sensor am Fenster beim Öffnen in eine Offenposition fährt. Hierzu muss beim Rollladen das Attribut ASC_ComfortOpen_Pos entsprechend konfiguriert sein. &lt;br /&gt;
|- &lt;br /&gt;
|ASC_autoShuttersControlEvening ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Abend.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlMorning ||on, off || ||Aktiviert die automatische Steuerung durch das ASC-Modul am Morgen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_blockASCDrivesAfterManual ||0, 1 || ||wenn dieser Wert auf 1 gesetzt ist, dann werden Rollläden vom ASC-Modul nicht mehr gesteuert, wenn zuvor manuell eingegriffen wurde. Voraussetzung hierfür ist jedoch, dass im Reading ASC_ShuttersLastDrive der Status manual enthalten ist und sich der Rollladen auf eine unbekannte (nicht in den Attributen anderweitig konfigurierte) Position befindet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessDriveUpDown || || || Werte (z.B. Lux) bei dem Schaltbedingungen für Sonnenauf- und -untergang geprüft werden sollen. Diese globale Einstellung kann durch die WERT-MORGENS:WERT-ABENDS Einstellung von ASC_BrightnessSensor im Rollladen selbst überschrieben werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_debug ||0, 1 || 0||Aktiviert die erweiterte Logausgabe für Debugausgaben (nur nach Aufforderung nutzen) &lt;br /&gt;
|-&lt;br /&gt;
|ASC_expert ||0, 1 ||0 ||ist der Wert 1, so werden erweiterte Informationen bezüglich des NotifyDevs unter &#039;&#039;set und get&#039;&#039; angezeigt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_freezeTemp ||-5 bis 5 || ||Temperatur, ab welcher der Frostschutz greifen soll und der Rollladen nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensor || || ||DEVICENAME[:READINGNAME] MAXTRIGGER[:HYSTERESE] [CLOSEDPOS] - der Inhalt ist eine Kombination aus Devicename, Readingname, Wert ab dem getriggert werden soll, Hysterese Wert ab dem der Status Regenschutz aufgehoben werden soll und der &amp;quot;wegen Regen geschlossen Position&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDev  || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Devicenamen und Readingnamen des Residents-Device der obersten Ebene (z.B. rgr_Residents:state)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_shuttersDriveDelay  || || ||maximale Zufallsverzögerung in Sekunden bei der Berechnung der Fahrzeiten. 0 bedeutet keine Verzögerung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_tempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_twilightDevice || || ||das Device, welches die Informationen zum Sonnenstand liefert. Wird unter anderem für die Beschattung verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_windSensor || || ||DEVICE[:READING] - Sensor für die Windgeschwindigkeit. Kombination aus Device und Reading.&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Attribute in den Rolllädendevices===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR /&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC || 0, 1, 2|| ||&amp;quot;kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles&amp;quot;,1 = &amp;quot;Inverse oder Rollo - Bsp.: Rollo oben 0, Rollo unten 100 und der Befehl zum prozentualen Fahren ist position&amp;quot;,2 = &amp;quot;Homematic Style - Bsp.: Rollo oben 100, Rollo unten 0 und der Befehl zum prozentualen Fahren ist pct&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Adv || on, off||||bei on wird das runterfahren des Rollos während der Weihnachtszeit (1. Advent bis 6. Januar) ausgesetzt! Durch set &amp;lt;ASCDEVICE&amp;gt; advDriveDown werden alle ausgesetzten Fahrten nachgeholt.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze ||off, soft, hard, am, pm || ||Frostschutz, wenn soft fährt der Rollladen in die ASC_Antifreeze_Pos, bei hard/am/pm wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze_Pos || || ||Position des Rolllades die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || ||nach welchem ASTRO-Modus soll die Abendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || - 9 bis 9 || 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeEvening der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning ||REAL, CIVIL, NAUTIC, ASTRONOMIC oder HORIZON || || nach welchem ASTRO-Modus soll die Morgendfahrt berechnet werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || - 9 bis 9|| 0|| Höhe über dem Horizont. Wird nur berücksichtigt, wenn im Attribut ASC_autoAstroModeMorning der Wert HORIZON ausgewählt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_afterManual || ||1200 ||wie viel Sekunden soll die Automatik nach einer manuellen Fahrt aussetzen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeDayOpen || ||3600 ||wie viel Sekunden vor dem morgendlichen öffnen soll keine schließen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforeNightClose || ||3600 ||ie viel Sekunden vor dem nächtlichen schließen soll keine öffnen Fahrt mehr stattfinden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessSensor || ||none ||DEVICE[:READING] WERT-MORGENS:WERT-ABENDS / &#039;Sensorname[:brightness [400:800]]&#039; Angaben zum Helligkeitssensor mit (Readingname, optional) für die Beschattung und dem Fahren der Rollladen nach brightness und den optionalen Brightnesswerten für Sonnenauf- und Sonnenuntergang &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Closed_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100 &lt;br /&gt;
wird angefahren wenn SelfDefense aktiv ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ComfortOpen_Pos || || || in 10er Schritten von 0 bis 100 !!! Die eingestellte Position wird bei einem threestate Sensor angefahren. Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Down || time, astro, brightness, roommate || astro||bei &#039;&#039;astro&#039;&#039; wird Sonnenuntergang berechnet, bei time wird der Wert aus ASC_Time_Down_Early als Fahrzeit verwendet und bei brightness muss ASC_Time_Down_Early und ASC_Time_Down_Late korrekt gesetzt werden. Der Timer läuft dann nach ASC_Time_Down_Late Zeit, es wird aber in der Zeit zwischen ASC_Time_Down_Early und ASC_Time_Down_Late geschaut, ob die als Attribut im Moduldevice hinterlegte ASC_brightnessDriveUpDown der Down Wert erreicht wurde. Wenn ja, wird der Rollladen runter gefahren.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_DiveUpMaxDuration || || 60||die Dauer des Hochfahrens des Rollladens plus 5 Sekunden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_Delay || || -1|| maximaler Wert für einen zufällig ermittelte Verzögerungswert in Sekunden bei der Berechnung der Fahrzeiten, 0 bedeutet keine Verzögerung, -1 bedeutet, dass das ??gleichwertige Attribut?? aus dem ASC Device ausgewertet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_DelayStart || || -1|| in Sekunden verzögerter Wert ab welchen dann erst das Offset startet und dazu addiert wird. Funktioniert nur wenn gleichzeitig ASC_DriveDelay gesetzt wird.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ExternalTrigger || |||| DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE, Beispiel: &amp;quot;WohnzimmerTV:state on:off 66:100&amp;quot; bedeutet das wenn ein &amp;quot;state:on&amp;quot; Event kommt soll das Rollo in Position 66 fahren, kommt ein &amp;quot;state:off&amp;quot; Event soll es in Position 100 fahren. Es ist möglich die POSINACTIVE weg zu lassen dann fährt das Rollo in LastStatus Position.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_GuestRoom || on, off |||| aktuell noch nicht umgesetzt...&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut || soft, hard, off ||off || stellt entsprechend den Aussperrschutz ein. Bei global aktivem Aussperrschutz (set ASC-Device lockOut soft) und einem Fensterkontakt open bleibt dann der Rollladen oben. Dies gilt nur bei Steuerbefehlen über das ASC Modul. Stellt man global auf hard, wird bei entsprechender Möglichkeit versucht den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut_Cmd || inhibit, blocked, protection ||none|| set Befehl für das Rollladen-Device zum Hardware sperren. Dieser Befehl wird gesetzt werden, wenn man &amp;quot;ASC_LockOut&amp;quot; auf hard setzt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Down ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Up ||absent, always, off, home || always ||Wann darf die Automatik steuern. immer, niemals, bei Abwesenheit des Roommate (ist kein Roommate und absent eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Open_Pos || ||default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;||in 10er-Schritten von 0 bis 100&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Partymode || on, off || off ||schaltet den Partymodus an oder aus. Wird am ASC Device set ASC-DEVICE partyMode on geschalten, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf on haben, zwischengespeichert und später erst ausgeführ&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_Reading || || ||Name des Readings, welches die Position des Rollladen in Prozent angibt. Wird bei unbekannten Device-Typen auch als &#039;&#039;set&#039;&#039; Befehl zum Fahren verwendet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDownValue_beforNightClose || || -1||wie viele Sekunden vor dem abendlichen schließen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:300 bedeutet 30 min vor night close oder bei unter einem Brightnesswert von 300&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDown_Pos || ||50||Position den Rollladens für den abendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUpValue_beforDay || || -1||wie viele Sekunden vor dem morgendlichen öffnen soll der Rollladen in die Sichtschutzposition fahren, oder bei Brightness ab welchem minimum Brightnesswert soll das Rollo in die Privacy Position fahren. Bei Brightness muss zusätzlich zum Zeitwert der Brightnesswert mit angegeben werden 1800:600 bedeutet 30 min vor day open oder bei über einem Brightnesswert von 600&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyUp_Pos || ||50||Position den Rollladens für den morgendlichen Sichtschutz!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_RainProtection ||on, off || ||soll der Rollladen beim Regenschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Device || || none ||mit Komma getrennte Namen des/der Roommate-Device/s welche den/die Bewohner des Rollladen-Raumes wiedergibt. Macht nur Sinn in Schlaf- oder Kinderzimmern&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Reading || || ||Reading des Roommate-Device, welches den Status wieder gibt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_AbsentDelay || || 300||um wie viele Sekunden soll das fahren in Selfdefense bei Residents absent verzögert werden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_Mode || || gone||ab welchen Residents Status soll Selfdefense aktiv werden ohne das Fenster auf sind&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_InOutAzimuth || ||95:265 ||Azimut Wert ab dem bei Überschreiten Beschattet und bei Unterschreiten Endschattet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinMax_Elevation || ||25.0:100.0 ||ab welcher min Höhe des Sonnenstandes soll beschattet und ab welcher max Höhe wieder beendet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_MinOutsideTemperature_ || ||18 ||ab welcher Temperatur soll Beschattet werden, immer in Abhängigkeit der anderen einbezogenen Sensorwert&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShadingMode ||absent, always, off, home || off||wann soll die Beschattung nur stattfinden&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Pos || || ||Position des Rollladens für die Beschattung !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss eine positive Zahl/Dezimalzahl sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_SunnyCloudy || ||35000:20000 ||Brightness Wert ab welchen die Beschattung stattfinden und aufgehoben werden soll, immer in Abhängigkeit der anderen einbezogenen Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_WaitingPeriod || ||1200 ||wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung stattfinden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shutter_IdleDetection || ||||READING:VALUE gibt das Reading an welches Auskunft über den Fahrstatus des Rollos gibt, sowie als zweites den Wert im Reading welcher aus sagt das das Rollo nicht fährt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersPlace || window, terrace || ||wenn dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist und das Residents-Device in den Status &#039;&#039;absent&#039;&#039; geht, &#039;&#039;selfDefence&#039;&#039; aktiv ist und das Fenster geöffnet ist, wird das Rollo  geschlossen. Wenn ein twostate Senso genutzt wird und dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos ignoriert und das Rollo wird beim öffnen des Fenster komplett geöffnet. Wenn dieses Attribut auf &#039;&#039;window&#039;&#039; gesetzt ist wird ASC_Ventilate_Pos berücksichtigt und das Rollo wird entsprechend der ASC_Ventilate_Pos geöffnet. Wenn das Fenster wieder geschlossen wird, dann wird das Rollo unabhängig von &#039;&#039;windows oder terrace&#039;&#039; vollständig geschlossen.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Sleep_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC.&#039;&#039; Position wird angefahren wenn Bedingung für modeDown aktiv ist. Hiermit kann z.B. das komplette abendliche Schließen des Rollos begrenzt werden.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_TempSensor || || ||DEVICENAME[:READINGNAME] - der Inhalt ist eine Kombination aus Device und Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Early || ||16:00 ||Sonnenuntergang frühste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Late || ||22:00 ||Sonnenuntergang späteste Zeit zum Runterfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Early || || 05:00||Sonnenaufgang frühste Zeit zum Hochfahren !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Late || ||08:30 ||Sonnenaufgang späteste Zeit zum Hochfahren  !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!!&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_WE_Holiday || ||08:00 ||Sonnenaufgang frühste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet).ACHTUNG!!! in Verbindung mit Brightness für ASC_Up muss die Uhrzeit kleiner sein wie die Uhrzeit aus ASC_Time_Up_Late !!!Verwendung von Perlcode ist möglich, dieser muss in {} eingeschlossen sein. Rückgabewert muss ein Zeitformat in Form HH:MM[:SS] sein!!! &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Window_Open ||on, off ||on||auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WiggleValue || ||5 ||Wert, um welchen sich die Position des Rollladens bei &#039;&#039;Wiggle&#039;&#039; ändern soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindParameters || ||5 ||TRIGGERMAX[:HYSTERESE] [DRIVEPOSITION] / Angabe von Max Wert ab dem für Wind getriggert werden soll, Hytsrese Wert ab dem der Windschutz aufgehoben werden soll TRIGGERMAX - HYSTERESE / Ist es bei einigen Rollläden nicht gewünscht das gefahren werden soll, so ist der TRIGGERMAX Wert mit -1 an zu geben. (default: &#039;50:20 ClosedPosition&#039;)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindProtection ||on, off || ||soll der Rollladen beim Windschutz beachtet werden. on=JA, off=NEIN.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec || ||none ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. WINDOWREC:[READING], Name des Fensterkontaktes, an dessen Fenster der Rollladen angebracht ist. Reading ist optional&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_PosAfterDayClosed ||open, lastManual ||open ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. Sein Reading &#039;&#039;state&#039;&#039; muss die Werte &#039;&#039;open&#039;&#039;, &#039;&#039;closed&#039;&#039; oder &#039;&#039;tilted&#039;&#039; enthalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_subType ||twostate, threestate ||twostate||Typ des verwendeten Fensterkontaktes: twostate (optisch oder magnetisch) oder threestate (Drehgriffkontakt)&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||    &lt;br /&gt;
|-  &lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hilfsmittel ==&lt;br /&gt;
{{Hinweis|Die Device-Namen sind auf die eigene Installation anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Codezeilen sind im [[Import von Code Snippets|RAW]]-Format.}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText= Stand 2019-05-03&lt;br /&gt;
* Erfolgreich getestet mit Homematic Devices, Beta-User&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;light&#039;&#039; gewählt wird.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Level ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Schliessen bis&amp;gt;,&amp;lt;Öffnen auf&amp;gt;,&amp;lt;Beschattung&amp;gt;,&amp;lt;Komfort&amp;gt;,&amp;lt;Lüften&amp;gt;,&amp;lt;Privacy&amp;gt; (Rollladen_.*|Jalousie_.*)..:level,!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_Shading_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos&lt;br /&gt;
attr rg_ASC_Rolllaeden_Level commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:selectnumbers,0,5,100,0,lin&#039;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Zeiten ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC times.png|thumb|right|ReadingsGroup - Zeitenbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Up_WE/Hol&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; \&lt;br /&gt;
 (.*Rollo.*|.*Rollladen|Jalousie_.*):level,!?ASC_Time_Up_Early,!?ASC_Time_Up_Late,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, \&lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;, \&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,\&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:55,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,  \&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt; &#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;, \&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;, \&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039; }&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC RG Zeiten HM ZWave Siro.png|thumb|right|ReadingsGroup - CUL_HM+ZWave+Siro mit widgets]]Neue Version mit time-Widgets und pct/dim/position-widget (5-er Schritte), passend für CUL_HM, ZWave und Siro-Geräte:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early  &amp;gt;,&amp;lt;Time_Up_WE  &amp;gt;,&amp;lt;Time_Up_Late  &amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; (Rollo_.*|Jalousie_.*)..:(level|dim|position),!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;, \&lt;br /&gt;
dim =&amp;gt; &#039;dim:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
position =&amp;gt; &#039;pct:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,\&lt;br /&gt;
ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,\&lt;br /&gt;
ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_WE_Holiday =&amp;gt;&#039;ASC_Time_Up_WE_Holiday:time&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für die Beschattung ===&lt;br /&gt;
[[Datei:Shading.png.png|alternativtext=|mini|ReadingsGroup - Beschattungsbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
defmod RG_test readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;InAzi&amp;gt;,&amp;lt;OutAzi&amp;gt;,&amp;lt;MinEle&amp;gt;,&amp;lt;MaxEle&amp;gt;,&amp;lt;Sunny&amp;gt;,&amp;lt;Cloudy&amp;gt;\&lt;br /&gt;
(Rollo|Jalousie)_.*..:&amp;lt;{ascAPIget(&#039;ShadingAzimuthLeft&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingAzimuthRight&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingMinElevation&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingMaxElevation&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingStateChangeSunny&#039;,$DEVICE)}&amp;gt;,&amp;lt;{ascAPIget(&#039;ShadingStateChangeCloudy&#039;,$DEVICE)}&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für FIBARO Roller Shutter FGR-222 Devices ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Getestet von majestro84, Stand 2019-01-28.&lt;br /&gt;
* {{Link2Forum|Topic=92628|Message=897099|LinkText=Forenbeitrag dazu}}&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;dark&#039;&#039; gewählt wird}}&lt;br /&gt;
[[Bild:ASC Jalousien Times.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;define ASC_Jalousien_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_WE&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt;,&amp;lt;PartyMode&amp;gt;,&amp;lt;LockOut&amp;gt; (.*_Jalousie.*):position,!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up,!?ASC_Partymode,!?ASC_LockOut&lt;br /&gt;
&lt;br /&gt;
 attr ASC_Jalousien_Times commands {position =&amp;gt; &#039;dim:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,&lt;br /&gt;
 ASC_Partymode =&amp;gt; &#039;ASC_Partymode:on,off&#039;,&lt;br /&gt;
 ASC_LockOut =&amp;gt; &#039;ASC_LockOut:soft,hard,off&#039;,&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, &lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;,&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;}&lt;br /&gt;
 attr ASC_Jalousien_Times room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Level.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt; define Jalousien_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;Comfort_Pos&amp;gt;,&amp;lt;Ventilate_Pos&amp;gt;,&amp;lt;PrivacyDown_Pos&amp;gt;,&amp;lt;Shading_Pos&amp;gt; (.*_Jalousie.*):!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos,!?ASC_Shading_Pos&lt;br /&gt;
 attr Jalousien_Level commands { ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;}&lt;br /&gt;
 attr Jalousien_Level room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtungsbeispiel (nach Sonnenstand) ==&lt;br /&gt;
=== Ziel und Vorgaben ===&lt;br /&gt;
Es sollen die Rollläden und Jalousien innerhalb bestimmter zeitlicher Perioden sonnenstandsabhängig geöffnet und geschlossen werden. An den Wochenenden und an Ferientagen soll etwas später geöffnet werden. Es sind Tür- und Fensterkontakte vorhanden (Türkontakte: twoState, Fensterkontakte: threeState), wobei bei jeder Öffnung ein eventuell geschlossener Rollladen geöffnet werden soll. Bei allen Rollladenaktoren, Tür- und Fensterkontakten handelt es sich um CUL_HM-Geräte.&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
Im global-Device sind Angaben zu latitude und longitude vorhanden, holiday2we wie folgt&amp;lt;ref&amp;gt;&#039;&#039;ferien&#039;&#039; ist eine automatisiert erstellte holiday-Datei nach diesem {{Link2Forum|Topic=85759|Message=885883|LinkText=Foren-Beitrag}}.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr global holiday2we bw,ferien&lt;br /&gt;
Weitere Angaben werden zunächst nicht benötigt, das Astro-Device wird erst in der Beschattungskonfiguration definiert. &lt;br /&gt;
Dann erfolgt das &#039;&#039;Define des ASC-Devices&#039;&#039; wie oben beschrieben:&lt;br /&gt;
&amp;lt;code&amp;gt;define Rollladenautomatik AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Folgen die einzubindenden Rollladenaktoren einem einheitlichen Namensschema, können diese sodann z.B. mit &lt;br /&gt;
 attr (Jalousie|Rollladen)_.* ASC 2&lt;br /&gt;
auf einen Rutsch mit dem passenden ASC-Typ gekennzeichnet werden.  &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Achtung: Das AutoShuttersControl-Device selbst darf kein ASC-Attribut bekommen!}}&lt;br /&gt;
&lt;br /&gt;
Dann werden mit &lt;br /&gt;
 set Rollladenautomatik scanForShutters&lt;br /&gt;
die nachfolgend weiter zu bearbeitenden Attribute angelegt.&lt;br /&gt;
=== Schließen morgens und abends ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternative: Fahren nach brightness:&lt;br /&gt;
Soll insgesamt oder an einzelnen Rollläden helligkeitsgesteuert gefahren werden, muß zentral oder für jeden Rollladen ein Helligkeitssensor definiert und die Helligkeitsgrenzwerte festgelegt sein (&#039;&#039;ASC_BrightnessSensor&#039;&#039; etc.), bei deren Überschreitung geöffnet bzw. Unterschreitung geschlossen werden soll.}}&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Sonnenstandsabhängige Fahrzeiten werden wie folgt aktiviert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeEvening CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeMorning CIVIL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aus der Angabe &#039;&#039;CIVIL&#039;&#039; und den Vorgaben in den einzelnen Rollladen wird dabei mit Hilfe von [[SUNRISE_EL]] die effektive Fahrzeit berechnet, dort finden sich auch weitere Hinweise, zu den meisten anderen Optionen für die ersten beiden Attribute.&lt;br /&gt;
Bei allen Fensteröffnungen soll auf eine Lüften-Position gefahren werden, also schalten wir diese Funktion ebenfalls zentral an&amp;lt;ref&amp;gt;Sonst wird bei threeState-Sensoren nur bei &#039;&#039;tilted&#039;&#039; auf die in &#039;&#039;ASC_Ventilate_Pos&#039;&#039; gefahren.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladenautomatik ASC_autoShuttersControlComfort on &lt;br /&gt;
Zuletzt legen wir noch einen Temperatur-Sensor fest. Dieser wird beim Frostschutz sowie bei der Beschattung berücksichtigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_tempSensor Aussentemperatur_Nord:temperature&lt;br /&gt;
attr Rollladenautomatik ASC_freezeTemp 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{Hinweis|Achtung: Für jede weitere Sensor-Information (z.B. zu Regen oder Wind) muß ein eigenes Device verwendet werden. Sollen unterschiedliche Readings desselben Sensors ausgewertet werden, müssen diese in ein eigenes Device übertragen werden, z.B. über einen readingsProxy mit gesetztem event-on-update-reading-Attribut (sonst triggert dieser nicht bei Aktualisierung des Readings)!}} &lt;br /&gt;
&lt;br /&gt;
tbd: &lt;br /&gt;
* Rain&lt;br /&gt;
* Wind&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
{{Hinweis|Positionen dürfen sich innerhalb eines Rollos nicht überschneiden - Auch ASC_Closed_Pos 100 ASC_Shading_Pos 98 ASC_ComfortOpen_Pos 97 usw... sind bereits unterschiedliche Positionen.}}&lt;br /&gt;
&lt;br /&gt;
===== Fahrzeiten =====&lt;br /&gt;
Zur Konfiguration der Fahrzeiten bietet es sich an, eine ReadingsGroup zu nutzen, wie unter [[#Hilfsmittel|Hilfsmittel]] dargestellt. Alternativ kann man die Zeiten auch manuell in den einzelnen Rollläden hinterlegen.&lt;br /&gt;
===== Bewohner =====&lt;br /&gt;
Wird ein Raum von einer oder mehreren bestimmten Person/en bewohnt oder gibt es ein Sammel-Gerät für mehrere Bewohner, kann dies mit den Attributen &#039;&#039;ASC_Roommate_Device&#039;&#039; und &#039;&#039;ASC_Roommate_Reading&#039;&#039; einem Rollladen zugeordnet werden. Ist einer der Bewohner &#039;&#039;asleep&#039;&#039;, wird morgens erst geöffnet, wenn auch der letzte Roommate nicht mehr &#039;&#039;asleep&#039;&#039; ist.&lt;br /&gt;
===== Fensterkontakte  =====&lt;br /&gt;
Dann werden ggf. vorhandene Fensterkontakte mit &#039;&#039;ASC_WindowRec&#039;&#039; zugeordnet und der Sensortyp mit &#039;&#039;ASC_WindowRec_subType&#039;&#039; festgelegt. Im Falle von threeState-Sensoren wird das übergreifende &#039;&#039;ASC_autoShuttersControlComfort&#039;&#039; beachtet, wobei dann bei vollständiger Öffnung des Fensters auf den in &#039;&#039;ASC_ComfortOpen_Pos&#039;&#039; festgelegten Wert gefahren wird.&lt;br /&gt;
===== Frostschutz =====&lt;br /&gt;
Zuletzt können die Attribute &#039;&#039;ASC_Antifreeze&#039;&#039; und &#039;&#039;ASC_Antifreeze_Pos&#039;&#039; festgelegt werden, wenn die Frostschutzfunktion aktiviert werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Beschattung ===&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Im ASC DEVICE das Reading &amp;quot;controlShading&amp;quot; auf &#039;&#039;on&#039;&#039;, sowie ein Astro/Twilight Device im Attribut &amp;quot;ASC_twilightDevice&amp;quot; und das Attribut &amp;quot;ASC_tempSensor&amp;quot; definieren.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
Es wird ein Helligkeitssensor als Attribut &amp;quot;ASC_BrightnessSensor&amp;quot; benötigt. Wird der Sensor nur für die Beschattung verwendet, ist der Wert DEVICENAME[:READING] ausreichend.&lt;br /&gt;
Alle weiteren Attribute sind optional und wenn nicht gesetzt mit Default-Werten belegt. Sie sollten entsprechend der Gegebenheiten angepasst werden. Die Werte für die Fensterposition und den Vor-/Nachlaufwinkel &#039;&#039;(ASC_Shading_InOutAzimuth)&#039;&#039; sowie die Grenzwerte für &amp;lt;code&amp;gt;&#039;&#039;ASC_shading_StateChange_SunnyCloudy&#039;&#039;&amp;lt;/code&amp;gt; sind besonders wichtig. &lt;br /&gt;
&lt;br /&gt;
==== Bedingungen ====&lt;br /&gt;
Damit die Beschattung startet müssen &#039;&#039;&#039;alle&#039;&#039;&#039; Bedingungen erfüllt sein. Entschattet wird, sobald &#039;&#039;&#039;eine&#039;&#039;&#039; der Bedingungen wegfällt und die Zeit entsprechend &amp;lt;code&amp;gt;ASC_Shading_WaitingPeriod&amp;lt;/code&amp;gt; abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Der Sonnensensor &amp;lt;ASC_BrightnessSensor&amp;gt; muss mindestens zwei Messwerte geliefert haben, bevor das ASC-Modul in die Beschattungsposition fährt! Beim (zeitlich) ersten Messwert wird der Zustand &#039;&#039;in-reserved&#039;&#039; gesetzt. Erst beim zweiten Messwert wechselt der Zustand nach &#039;&#039;in shading&#039;&#039;. Die Anzahl der berücksichtigten Messwerte ist abhängig vom &amp;quot;moving average window&amp;quot;, der mit dem dritten Parameter des Attributs &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; konfiguriert wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Von Standardwerten ausgehend ist nachfolgender Ablauf angestrebt:&#039;&#039;&#039;&lt;br /&gt;
# Ein Event vom Astro oder Helligkeits Device kommt -&amp;gt; sind alle Werte innerhalb des Arbeitsbereiches, ändert sich der ASC Info-Zustand im Rollo von xx auf „in reserved“ (Beschattung vorbereitet)&lt;br /&gt;
# Ein erneutes Event vom Astro oder Helligkeits Device kommt -&amp;gt; Überprüfung der Werte -&amp;gt; sind diese weiterhin gegeben folgt der Wechsel von „in reserved“ auf „in“ (Beschattung aktiv)&lt;br /&gt;
# Bei Verwendung von &#039;&#039;ASC_Shading_StateChange_SunnyCloudy&#039;&#039; ist zu beachten, dass ein Durchschnitt über die letzten drei Brightness Events gerechnet wird. Möchte man das vermeiden muss man SUNNY:CLOUDY 1[2] setzen. &lt;br /&gt;
# Die Zeiten &#039;&#039;ASC_Shading_WaitingPeriod&#039;&#039; und &#039;&#039;ASC_BlockingTime_afterManual&#039;&#039; können hier zusätzlich für eine Verzögerung sorgen. &lt;br /&gt;
&#039;&#039;&#039;Wichtig zu beachten:&#039;&#039;&#039; Es müssen immer mehrere (mind. 2) Events für den Betrieb erfolgen. In den Standardeinstellungen vom Astro Modul erfolgt dieses z.B. nur 1 x pro Stunde. Kommt also ein Helligkeits-Event auch nur 1x pro Stunde, könnte es 2 Std dauern, bis die Beschattungsfunktion greift. &lt;br /&gt;
&lt;br /&gt;
Wenn das Rollo einmal aus der Beschattung manuell (im Rollo Device muss bei &#039;&#039;ASC_ShuttersLastDrive manuel&#039;&#039; stehen gefahren wurde wird das Rollo erst wieder nach einer Entschattung und erneuter Beschattung gefahren. Also es muss einmal shading out kommen und beim nächsten shading in fährt er dann wieder.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen ===&lt;br /&gt;
==== WeekendHoliday Funktion im Brightnessbetrieb ====&lt;br /&gt;
Am Wochenende oder Feiertag und wenn am ASC-Device sunriseTimeWeHoliday aktiviert sowie im Rollo das Attribut ASC_Time_Up_WE_Holiday gesetzt sind, wird zur angegebenen ASC_Time_Up_WE_Holiday Zeit das Rollo geöffnet, ungeachtet des Brightnesswertes.&lt;br /&gt;
&lt;br /&gt;
==== Privacy ====&lt;br /&gt;
Werden hierfür Werte festgelegt, werden die betreffenden Rollläden die festgelegte Zeit/Helligkeit vor dem abendlichen Schließen vorab teilweise geschlossen. Dies kann z.B. gewünscht sein, um Rollläden zur Straße hin mit viel Fußgängerverkehr zwar nicht vollständig abzudunkeln, aber gleichzeitig zu verhindern, dass von außen in Wohnräume geschaut werden kann, sobald dort das Licht angeschaltet wird&lt;br /&gt;
&lt;br /&gt;
==== BlockingTime====&lt;br /&gt;
Bewirkt, dass nach einer manuellen Fahrt, eine vom ASC Modul initiierte Fahrt zunächst ausgesetzt wird, bis die im Attribute angegebene Zeit überschritten ist. Erst dann wird eine vom ASC Modul initiierte Fahrt tatsächlich durchgeführt.&lt;br /&gt;
Genau so wird ein Hochfahren eines Rollos durch das ASC Modul nicht mehr ausgeführt, wenn es innerhalb der Zeit von ASC_BlockingTime_beforNightClose und das Runterfahren wird nicht mehr erfolgen, wenn es innerhalb von ASC_BlockingTime_beforDayOpen ist.&lt;br /&gt;
Beispiel: Meine Tochter geht früh außer Haus und Ihre Rollos sind nicht hochgefahren. Diese fahren auch nicht mehr hoch, da die ausschließlich bei home (anwesend) fahren sollen. Nun kommt sie am Nachmittag um 16:23 Uhr nach Hause. Eigentlich sollten nun die Rollos fahren. Doch die Sonnenuntergangsfahrt (schließen) wäre schon 16:51 Uhr und damit innerhalb der 3600 ASC_BlockingTime_beforNightClose. Die Rollos bleiben also unten. Es lohnt sich für die paar Minuten einfach nicht mehr.&lt;br /&gt;
&lt;br /&gt;
==== wiggle====&lt;br /&gt;
Mit einem &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; wiggle&amp;lt;/code&amp;gt; können alle Rollladen mit einem entsprechenden Attribut zu einer kurzen Fahrt veranlasst werden, nach Ablauf von einer Minute wieder um denselben Wert zurück. Dabei wird jeweils in die Richtung gefahren, die den weiteren Weg ermöglicht. Wenn also zu 70% geschlossen ist, wird der Rollladen hoch fahren.&lt;br /&gt;
==== Partymode ====&lt;br /&gt;
Dieser wird am ASC-Device selbst aktiviert mittels &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; partyMode on&amp;lt;/code&amp;gt;. Alle Rollladen-Devices, welche das Attribut &#039;&#039;ASC_Partymode&#039;&#039; auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, der durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, beim Beenden des Modus durch &amp;lt;code&amp;gt;set ASC-Device partyMode off&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
==== lock-out ====&lt;br /&gt;
Man kann mit dem Befehl &amp;lt;code&amp;gt; set &amp;lt;ASC-Device&amp;gt; hardLockOut&amp;lt;/code&amp;gt; auf einen Schlag alle Rollos sperren welche &amp;lt;code&amp;gt; attr &amp;lt;ROLLO-Device&amp;gt; ASC_LockOut hard&amp;lt;/code&amp;gt; gesetzt haben.&lt;br /&gt;
Das ist dafür gedacht, wenn Du eine gewisse Zeit den Rolloaktor sperren willst. Zum Beispiel das die Kinder nicht schalten sollen.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Hinweise und Problemlösungen ==&lt;br /&gt;
* Werden Attribute geändert, kann es vereinzelt vorkommen, dass das ASC-Modul dies nicht mitbekommt und das tatsächliche Verhalten nicht den Erwartungen entspricht. In so einem Fall empfielt es sich, das NOTIFYDEV nochmals aufbauen zu lassen. Dazu werden zunächst mit &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; expert 1&amp;lt;/code&amp;gt; erweiterte Informationen bezüglich des NotifyDevs unter set und get aktiviert und anschließend ein &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; createNewNotifyDev&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
* Hin und wieder berichten Nutzer davon, wenn Sie die &#039;&#039;Privacy Funktion&#039;&#039; nutzen, dass sich im NOTIFYDEV anstelle des Device Namen ein Raumname befindet. Diese Problem kann damit gelöst werden, dass in dem betroffenen &#039;&#039;&#039;Rollo Device&#039;&#039;&#039; das Atribut  &amp;lt;code&amp;gt;attr event-on-change .*&amp;lt;/code&amp;gt; gesetzt wird.&lt;br /&gt;
&#039;&#039;&#039;Wichtig!&#039;&#039;&#039; Nicht verwechseln mit dem ASC Device dort darf &amp;lt;code&amp;gt;attr event-on-change&amp;lt;/code&amp;gt; &#039;&#039;&#039;nicht&#039;&#039;&#039; gesetzt sein!&lt;br /&gt;
* Wenn mehrere Rollladen gleichzeitig den Fahrbefehl bekommen, kann es (z. B. bei zwave) dazu kommen, dass ein Rollladen seinen Befehl nicht bekommt. Dies kann durch eine zeitverzögerte Aussendung der Fahrbefehle vermieden werden. Dazu in den jeweiligen Rollo Devices das Attribut ASC_Drive_DelayStart wie folgt benutzen im: ersten Rollo Device braucht das Attribut nicht gesetzt werden, im zweiten Rollo Device im Attribut ASC_Drive_DelayStart dann 4 Sekunden eintragen, im dritten Rollo Device im Attribut ASC_Drive_DelayStart 8 Sekunden eintragen, usw. Ein Abstand von 3-4 Sekunden ist dabei zielführend.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hardware ====&lt;br /&gt;
{{Link2Forum|Topic=101182|LinkText=&amp;quot;Thread zu getesteter Hardware im Forum&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=92628|LinkText=&amp;quot;Thread zum Modul im Forum&amp;quot;}}&lt;br /&gt;
* {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread zur Entwicklung im Forum&amp;quot;}} &lt;br /&gt;
* {{Link2Forum|Topic=73964|LinkText=&amp;quot;Thread zu den Scripten von user cluni&amp;quot;}}, die der Entwicklung des Moduls zugrunde liegen&lt;br /&gt;
* Daten zum Sonnenstand z.B. hier https://www.sonnenverlauf.de/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SSFile_-_Integration_der_Synology_File_Station&amp;diff=35833</id>
		<title>SSFile - Integration der Synology File Station</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SSFile_-_Integration_der_Synology_File_Station&amp;diff=35833"/>
		<updated>2021-06-19T16:18:28Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Backup des FHEM Filesystems über Synology Kalendereinplanung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Modul 50_SSFile wird ab dem 26.05.2021 offiziell per Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Entwicklungsversion bzw. Testmodulversion  kann über den nachfolgenden Download bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Bitte den Befehl so komplett mit den Ausführungszeichen am Anfang und Ende in der FHEMWEB Kommandozeile eingeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;quot;wget -qO ./FHEM/50_SSFile.pm https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/50_SSFile.pm&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach FHEM restarten.&lt;br /&gt;
&lt;br /&gt;
FHEM muß aktuell sein, insbesondere die Files im Verzeichnis &#039;&#039;&#039;/opt/fhem/lib/FHEM/SynoModules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das Modul SSFile arbeitet mit der Synology File Station zusammen, d.h. das Paket File Station muß auf der Diskstation aktiviert sein. Für die Kommunikation mit der File Station, d.h. um Files/Ordner hoch- bzw. herunterzuladen, wird ein User der Diskstation verwendet. Dieser User muß natürlich die Rechte besitzen um die beabsichtigten Lese- und Schreiboperationen auszuführen.&lt;br /&gt;
&lt;br /&gt;
Alle Operationen des Moduls sind Queue gesteuert. Das bedeutet, alles durchzuführenden Aktivitäten werden zunächst in eine Queue gestellt und danach abgearbeitet. Bei den meisten Befehlen wird die Abarbeitung der Queue implizit gestartet. Aber z.B. die set-Befehle &#039;&#039;&#039;prepareDownload&#039;&#039;&#039; und &#039;&#039;&#039;prepareUpload&#039;&#039;&#039; erstellen lediglich die Queueeinträge. &lt;br /&gt;
Um die Abarbeitung zu starten, ist in diesen Fällen ein abschließer Befehl&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; startQueue&lt;br /&gt;
&lt;br /&gt;
nötig wenn nicht durch das gesetzte Attribut &#039;&#039;&#039;interval&#039;&#039;&#039; ein regelmäßiger Queue-Start automatisch erfolgt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Modul sind zum Beispiel regelmäßige Backups des gesamten FHEM-Systems möglich. Auch gezielte Restores von ausgewählten Dateien oder Verzeichnissen ohne Zippen oder Entzippen sind möglich.&lt;br /&gt;
&lt;br /&gt;
Durch die asynchrone Queue-Abarbeitung werden auch Ausfallzeiten der Diskstation toleriert. Ist die Diskstation zum Beipiel im Wartungsmodus oder im Sleep-Mode, bleiben die Einträge in der Queue erhalten und werden abgearbeitet sobald wieder eine Verbindung zur Diskstation hergestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
Das Modul benötigt keinerlei Mounts von freigegebenen Verzeichnissen der Diskstation auf dem FHEM-Server. Die Datenverarbeitung erfolgt komplett nicht-blockierend. Da die API-Schnittstelle genutzt wird, dauert die Datenübertragung länger als bei der Nutzung von Betriebsystem Kopierkommandos.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
&lt;br /&gt;
Die Definition ist sehr einfach, z.B.:&lt;br /&gt;
&lt;br /&gt;
 define SynFile SSFile 192.168.2.20&lt;br /&gt;
&lt;br /&gt;
Die IP-Adresse ist dabei die Adresse der Synology Diskstation. Sie kann auch ein DNS-Name sein. In diesem Fall bitte auch das globale Attribut &#039;&#039;&#039;dnsServer&#039;&#039;&#039; nicht vergessen zu setzen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfile1.PNG|right|thumb|300px|API Versionen Popup]]&lt;br /&gt;
Es kann ebenfalls das https-Protokoll oder ein vom default abweichender Port verwendet werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
 define SynFile SSFile 192.168.2.20 9001 https&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
 define SynFile SSFile 192.168.2.20 5010 http&lt;br /&gt;
&lt;br /&gt;
Nach der initialen Definition müssen zunächst die Credentials für die Verbindung zur Synology DS definiert werden:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; credentials &amp;lt;User&amp;gt; &amp;lt;Passwort&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind die Credentials gespeichert, kann die Funktion einfach getestet werden mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;Name&amp;gt; apiInfo&lt;br /&gt;
&lt;br /&gt;
Wird der Login erfolgreich ausgeführt, erscheint nach kurzer Zeit ein Popup mit den aktuell vorhandenen und verwendeten API-Versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Upload von Objekten zur Synology Diskstation (Backup) ==&lt;br /&gt;
&lt;br /&gt;
Es können ein oder mehrere Dateien, sowie ganze Ordner in einen Zielpfad auf der Synology Diskstation hochgeladen werden.&lt;br /&gt;
Zum Hochladen stehen zwei Set-Kommandos zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
; Upload: die angegebenen Dateien/Ordner werden durch das Modul bewertet und danach der Upload sofort gestartet&lt;br /&gt;
&lt;br /&gt;
; prepareUpload: die angegebenen Dateien/Ordener werden durch das Modul bewertet und nur in die interne Queue zur Abarbeitung gestellt.&amp;lt;br&amp;gt; Erst nach dem Kommando &#039;&#039;&#039;set &amp;lt;Name&amp;gt; startQueue&#039;&#039;&#039; wird die Abarbeitung gestartet. Alternativ kann auch das Attribut &#039;&#039;&#039;interval&#039;&#039;&#039; verwendet werden. Das triggert ebenfalls die Queue-Abarbeitung alle X Sekunden automatisch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Zielpfad wird mit dem Argument &#039;&#039;&#039;dest=&#039;&#039;&#039; bestimmt und beginnt immer mit einem auf der Synology angelegten &amp;quot;shared Folder&amp;quot;. In dem Zielpfad werden alle Objekte strukturerhaltend, d.h. inkl. ihrer Quellverzeichnisse, gespeichert. Das Verhalten ist mit dem Argument &#039;&#039;&#039;struc=&#039;&#039;&#039; veränderbar.&lt;br /&gt;
&lt;br /&gt;
Benötigte Unterverzeichnisse werden im Standard automatisch im Zielpfad angelegt.&lt;br /&gt;
&lt;br /&gt;
Die generelle Syntax für beide möglichen Upload-Befehle ist:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; Upload &amp;quot;&amp;lt;File&amp;gt;[,&amp;lt;File&amp;gt;,...]&amp;quot; | &amp;quot;&amp;lt;Ordner&amp;gt;[,&amp;lt;Ordner&amp;gt;,...]&amp;quot; &amp;lt;args&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; prepareUpload &amp;quot;&amp;lt;File&amp;gt;[,&amp;lt;File&amp;gt;,...]&amp;quot; | &amp;quot;&amp;lt;Ordner&amp;gt;[,&amp;lt;Ordner&amp;gt;,...]&amp;quot; &amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die hochzuladenden Dateien bzw. Ordner werden durch Komma getrennt angegeben. Dateien und Ordner können kombiniert im Set-Befehl angegeben werden. Die Arbeitsweise des Upload-Befehls wird durch Argumente (&amp;lt;args&amp;gt;) gesteuert, die kombiniert werden können:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;dest=: &#039;&#039;&#039;&amp;lt;Ordner&amp;gt;&#039;&#039;&#039;: Zielpfad zur Speicherung der Dateien im Synology Dateisystem (der Pfad beginnnt mit einem shared Folder und endet ohne &amp;quot;/&amp;quot;). Diese Angabe ist verpflichtend. Es können [https://metacpan.org/pod/POSIX::strftime::GNU POSIX %-Wildcards] als Bestandteil des Zielpfads verwendet werden. Prominente Vertreter sind:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; * %d Tag des Monats (01..31)&amp;lt;br&amp;gt; * %m Monat (01..12)&amp;lt;br&amp;gt; * %Y Jahr (1970...)&amp;lt;br&amp;gt; * %H Stunde im 24-Stunden Format (00..23)&amp;lt;br&amp;gt; * %M die Minute (00..59)&amp;lt;br&amp;gt; * %S die Sekunde (00..60), (Der Bereich ist bis zu 60, um gelegentliche Schaltsekunden zu ermöglichen)&lt;br /&gt;
&lt;br /&gt;
;ow=: 	&#039;&#039;&#039;true&#039;&#039;&#039;: die Datei wird überschrieben, wenn sie im Ziel-Pfad schon vorhanden ist (default), &#039;&#039;&#039;false&#039;&#039;&#039;: eine bereits vorhandene Datei wird nicht überschrieben&lt;br /&gt;
&lt;br /&gt;
;cdir=:	&#039;&#039;&#039;true&#039;&#039;&#039;: übergeordnete(n) Ordner erstellen, falls nicht vorhanden. (default), &#039;&#039;&#039;false&#039;&#039;&#039;: übergeordnete(n) Ordner nicht erstellen&lt;br /&gt;
&lt;br /&gt;
;mode=:	&#039;&#039;&#039;full&#039;&#039;&#039;: alle außer im Attribut excludeFromUpload angegebenen Objekte werden berücksichtigt (default)&amp;lt;br&amp;gt; &#039;&#039;&#039;inc&#039;&#039;&#039;: nur neue Objekte und Objekte die sich nach dem letzten Upload verändert haben werden berücksichtigt&amp;lt;br&amp;gt; &#039;&#039;&#039;nth:&amp;lt;Tage&amp;gt;&#039;&#039;&#039;: nur Objekte neuer als &amp;lt;Tage&amp;gt; werden berücksichtigt (gebrochene Zahlen sind erlaubt, z.B. 3.6) &lt;br /&gt;
&lt;br /&gt;
;struc=: &#039;&#039;&#039;true&#039;&#039;&#039;: alle Objekte werden inkl. ihrer Verzeichnisstruktur im Zielpfad gespeichert (default)&amp;lt;br&amp;gt;&#039;&#039;&#039;false&#039;&#039;&#039;: alle Objekte werden ohne die ursprüngliche Verzeichnisstruktur im Zielpfad gespeichert &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der lokale Pfad zur Datei bzw. zum Ordner kann entweder ein absoluter Pfad oder eine relativer Pfad zum FHEM-Wurzelverzeichnis (siehe globales Attribut modpath) sein. Alle Quellen, Dateien/Ordner, müssen insgesamt in Quotes (&amp;quot;) eingeschlossen werden.&lt;br /&gt;
 &lt;br /&gt;
Nachfolgend einige Beispiele (Upload kann auch durch pepareUpload ersetzt werden):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./text.txt&amp;quot; dest=/home/upload&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Datei &amp;quot;text.txt&amp;quot; aus dem FHEM-Wurzelverzeichnis wird in das Zielverzeichnis &amp;quot;/home/upload&amp;quot; übertragen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;/opt/fhem/old data.txt&amp;quot; dest=/home/upload ow=false&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Datei &amp;quot;old data.txt&amp;quot; im Verzeichnis &amp;quot;/opt/fhem&amp;quot; wird nach &amp;quot;/home/upload/opt/fhem&amp;quot; übertragen sofern sie dort noch nicht existiert &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./log&amp;quot; dest=/home/upload mode=inc&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Dateien im Verzeichnis &amp;quot;log&amp;quot; des FHEM-Wurzelverzeichnisses werden nach &amp;quot;/home/upload/log&amp;quot; inkrementell übertragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./log&amp;quot; dest=/home/upload mode=full struc=false&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Dateien im Verzeichnis &amp;quot;log&amp;quot; des FHEM-Wurzelverzeichnisses werden nach &amp;quot;/home/upload&amp;quot; übertragen, unabhängig davon, ob sie seit der letzten Übertragung geändert wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./log&amp;quot; dest=/home/upload/%Y_%m_%d_%H_%M_%S mode=full struc=false&amp;lt;/b&amp;gt;&lt;br /&gt;
::wie voriges Beispiel. Der Zielpfad wird dynamisch mit dem aktuellen Datum + Uhrzeit ergänzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./&amp;quot; dest=/home/upload mode=inc&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Dateien des gesamten FHEM-Systems werden nach &amp;quot;/home/upload&amp;quot; inkrementell und strukturerhaltend übertragen.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;/opt/fhem/fhem.pl,./www/images/PlotToChat.png,./log/fhem-2020-10-41.log&amp;quot; dest=/home/upload&amp;lt;/b&amp;gt; &lt;br /&gt;
::nur die angegebenen Dateien werden nach &amp;quot;/home/upload/&amp;lt;entsprechendes Unterverzeichnis&amp;gt;&amp;quot; übertragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Informationen über den Uploadstatus ===&lt;br /&gt;
&lt;br /&gt;
Das Reading QueueLength enthält die Anzahl der in der Queue befindlichen Befehle. Hier werden nicht nur Upload-Befehle berücksichtigt, sondern sämtliche noch offenen (oder mit Fehlerstatus behafteten) Einträge.&lt;br /&gt;
&lt;br /&gt;
Wird der Upload ausgeführt, erfolgt ein permanentes Herunterzählen dieses Readings bis auf &amp;quot;0&amp;quot; im Idealfall. Sollte nach Abarbeitung von Befehlen das Reading QueueLength noch den Wert größer &amp;quot;0&amp;quot; haben, konnten nicht alle Befehle abgearbeitet werden. Sätze mit permanenten Fehlerstatus werden zukünftig von der Abarbeitung ausgenommen, andere Einträge mit einem zeitlichen Versatz wiederholt, z.B. wenn die Synology Diskstation zum Zeitpunkt des Uploads nicht erreichbar war.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfile2.PNG|right|thumb|300px|Upload Historie]]&lt;br /&gt;
Die Ergebnisse der Uploads werden in einer internen Datenabank gespeichert. &lt;br /&gt;
Man kann sich die Upload-Historie ausgeben lassen mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; listUploadsDone &lt;br /&gt;
&lt;br /&gt;
Die Übersicht zeigt die übertragenen Quelldateien mit ihrem Ursprungspfad, dem Zielpfad sowie das Datum + Zeit der Übertragung.&lt;br /&gt;
Diese Informationen bleiben auch nach einem FHEM Restart erhalten und sind die Grundlage für die Bewertung einer inkrementellen Übertragung.&lt;br /&gt;
&lt;br /&gt;
Die Historie kann bei Bedarf gelöscht werden mit:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; deleteUploadsDone &lt;br /&gt;
&lt;br /&gt;
Die auf der Synology gespeicherten Dateien werden durch diesen Befehl aber nicht gelöscht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Download von Objekten zum FHEM-Server (Restore) =&lt;br /&gt;
&lt;br /&gt;
Zum Herunterladen von Dateien oder ganzen Ordnern stehen die Befehle &#039;&#039;&#039;Download&#039;&#039;&#039; bzw. &#039;&#039;&#039;prepareDownload&#039;&#039;&#039; zur Verfügung.&lt;br /&gt;
Die Syntax und das Ergebnis ist bei beiden Befehlen identisch, nur werden bei prepareDownload die herunterzuladenden Objekte zunächst nur in die Ausführungsqueue gestellt. Zum Starten ist dann der Befehl &lt;br /&gt;
[[Datei:ssfile3.PNG|right|thumb|300px|Ausgabe von set &amp;lt;&amp;gt; listQueue]]&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; startQueue&lt;br /&gt;
&lt;br /&gt;
auszuführen. Der Setter Download führt die Anweisung sofort aus.&lt;br /&gt;
Die mit &#039;&#039;&#039;prepareDownload&#039;&#039;&#039; erzeugten Queueeinträge können vor der Ausführung mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; listQueue&lt;br /&gt;
&lt;br /&gt;
anzeigt werden. Diese Liste könnte zum Beispiel so aussehen:&lt;br /&gt;
&lt;br /&gt;
 5 =&amp;gt; retryCount=&amp;gt;0, reqtype=&amp;gt;GET, params=&amp;gt;&amp;amp;path=&amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot;, opmode=&amp;gt;download, method=&amp;gt;download, header=&amp;gt;Accept: application/json, dest=&amp;gt;./Carport-20200625-1147065130.jpg, api=&amp;gt;DOWNLOAD&lt;br /&gt;
&lt;br /&gt;
Am Anfang steht immer der Index des Eintrags, hier ist es der Index 5.&lt;br /&gt;
Unerwünschte oder falsche Downloads können bei Bedarf noch gelöscht werden. Der Befehl&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; purgeQueue &amp;lt;Index&amp;gt; &lt;br /&gt;
&lt;br /&gt;
löscht den angegebenen Eintrag mit dem Index, z.B. 5.&lt;br /&gt;
&lt;br /&gt;
Beim Download von Dateien/Ordnern ist zu beachten, dass die Objekte immer in den FHEM root-Ordner, überlicherweise /opt/fhem, geladen werden. Allerdings kann der Zielordner auf dem FHEM-Server durch den Zusatz von &#039;&#039;&#039;dest=&#039;&#039;&#039; bestimmt werden.&lt;br /&gt;
&lt;br /&gt;
Als Argument von dest= kann angegeben werden:&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;Filename&amp;gt;: das Objekt wird mit neuem Namen im default Pfad gespeichert&lt;br /&gt;
::* &amp;lt;Pfad/Filename&amp;gt;: das Objekt wird mit neuem Namen im angegebenen Pfad gespeichert&lt;br /&gt;
::* &amp;lt;Pfad/&amp;gt;: das Objekt wird mit ursprünglichen Namen im angegebenen Pfad gespeichert. &#039;&#039;&#039;Wichtig:&#039;&#039;&#039; der Pfad muß mit einem &amp;quot;/&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird als herunterzuladendes Objekt ein ganzer Ordner des Synology Dateisystems bestimmt, wird der Inhalt des Ordners in ein zip-Archiv verpackt und im Ziel auf dem FHEM-Server gespeichert. Die Dateien sind dann entsprechend aus dem Archiv zu entpacken.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ein paar Beispiele. Wichtig is es, die angegbenen Objekte in &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039; einzuschließen, was besondere Bedeutung hat, wenn die Dateien/Ordner Leerzeichen enthalten. Mehrere Objekte (Files, Ordner oder beides gemischt) werden durch Komma getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot;&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot; dest=carport.jpg&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot; dest=./log/carport.jpg&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot; dest=./log/&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/Temp/Anträge 2020,/backup/Carport-20200625-1147065130.jpg&amp;quot;&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg,/Temp/card.txt&amp;quot; dest=/opt/ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfile4.PNG|right|thumb|300px|Ausgabe von get &amp;lt;&amp;gt; remoteFolderList]]&lt;br /&gt;
Um sich einen Überblick über die auf der Synology vorhandenen Dateien zu verschaffen, kann man sich vor dem Download ein Liste der Objekte erstellen lassen. Dazu verwendet man den Befehl:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;Name&amp;gt; remoteFolderList &lt;br /&gt;
&lt;br /&gt;
Ohne weiteres Argument erstellt der Befehl eine Übersicht aller auf der Synology vorhandenenen shared Folder. Um  den Inhalt eines bestimmten Ordners anzuzeigen, wird dieser Ordner (inkl. eventueller Unterordner) als Argument mitgegeben, z.B.:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;Name&amp;gt; remoteFolderList &amp;quot;/FHEM-Prod/2020_11_29&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Ordnerobjekt beginnt immer mit einem &#039;&#039;&#039;/&#039;&#039;&#039; und wird in &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039; eingeschlossen, um auch Ordnernamen mit Leerzeichen verarbeiten zu können.&lt;br /&gt;
Es können noch weitere Optionen mitgegeben werden,um die angezeigten Informationen zu beeinflussen (siehe Commandref zu SSFile). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Beispiele zur Anwendung =&lt;br /&gt;
&lt;br /&gt;
== Backup des FHEM Filesystems über Synology Kalendereinplanung ==&lt;br /&gt;
&lt;br /&gt;
Es wird vorgestellt, wie man mit Hilfe des Synology Kalenders Backups des FHEM-Filesystems einplant und ausführen lässt. Dabei werden sowohl Full-Backups als auch inkrementelle Backups erstellt. &lt;br /&gt;
&lt;br /&gt;
Das Backupregime verfolgt folgendes Ziel bzw. Features:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* jede Woche Montag wird ein Full-Backup des gesamten FHEM-Verzeichnisses angefertigt&lt;br /&gt;
* die restlichen Tage der Woche werden nur neue oder geänderte Dateien gesichert (inkrementelles Backup)&lt;br /&gt;
* jede Sicherung wird auf der Synology in einem gemeinsamen Ordner (z.B. /FHEM-Prod) in jeweils einem separaten Verzeichnis gespeichert&lt;br /&gt;
* die Ordnerstruktur der Quelle bleibt innerhalb der Sicherung erhalten (d.h. man weiß genau wohin eine Datei der Sicherung in der Quelle gehört)&lt;br /&gt;
* die Sicherungsdateien können direkt wiederhergestellt werden, d.h. es ist kein dekomprimieren oder entpacken nötig.&lt;br /&gt;
* bei Bedarf können die Sicherungen ihrerseits durch Synology Backup Werkzeuge (z.B. Hyper Backup) auf externe Datenträger versioniert werden und stehen dadurch lange Zeit zur Verfügung &lt;br /&gt;
* die Sicherungen des laufenden Monats bleiben auf der Synology online verfügbar, ältere Backupverzeichnisse werden gelöscht und können bei Bedarf von einem externen Datenträger wiederhergestellt werden &lt;br /&gt;
* eine grafische chronologische Übersicht der auszuführenden Sicherungen (und Löschungen) ist z.B. zur Anzeige auf einem Tablet verfügbar &lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
Für das vorgestellte Scenario werden die Module SSFile und SSCal ([[SSCal - Integration des Synology Calendar Servers]]) verwendet. Das Modul SSCal zur Steuerung des Synology Kalenders wird hier nur insofern erläutert,wie es für den hier vorgesehenen Einsatzzweck benötigt wird. Weiterführende Informationen findet man in dem [[SSCal - Integration des Synology Calendar Servers|Wiki-Artikel]] zu SSCal.&lt;br /&gt;
&lt;br /&gt;
Um das oben definierte Scenario umzusetzen, werden die dazu nötigen Schritte nachfolgend beschrieben. Es sind dazu &#039;&#039;&#039;keine Volume-Mounts&#039;&#039;&#039; auf dem FHEM-Server &#039;&#039;&#039;nötig&#039;&#039;&#039;. Jede Kommunikation und Datenübertragung wird über das lokale Netzwerk abgewickelt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== FHEM Backup-Device anlegen ===&lt;br /&gt;
&lt;br /&gt;
Zur Durchführung der Backup wird ein SSFile Device mit dem Namen &#039;&#039;&#039;SynFile&#039;&#039;&#039; definiert. Es wird in dem Beispiel die Verbindung zur Synology mit der Adresse 192.168.2.10 hergestellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb0.PNG|right|thumb|400px|Backup Device SynFile]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod SynFile SSFile 192.168.2.10&lt;br /&gt;
attr SynFile alias Backup auf Synology (API)&lt;br /&gt;
attr SynFile devStateIcon .*running:control_arrow_rightward .*done|.*Upload\squeue\sfill\sfinished:control_on_off:startQueue .*Error:control_arrow_rightward@red .*Initialized:control_standby@orange&lt;br /&gt;
attr SynFile excludeFromUpload ./FHEM/FhemUtils/cacheSSCam.*,\&lt;br /&gt;
./www/SVGcache.*&lt;br /&gt;
attr SynFile group Backup&lt;br /&gt;
attr SynFile icon system_backup&lt;br /&gt;
attr SynFile interval 0&lt;br /&gt;
attr SynFile noAsyncFillQueue 0&lt;br /&gt;
attr SynFile room Dienste-&amp;gt;Allgemein&lt;br /&gt;
attr SynFile showPassInLog 0&lt;br /&gt;
attr SynFile stateFormat &amp;lt;b&amp;gt;letzter Update:&amp;lt;/b&amp;gt; lastUpdate\&lt;br /&gt;
&amp;lt;br&amp;gt;\&lt;br /&gt;
1:state&lt;br /&gt;
attr SynFile verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach der Erstdefinition sind die Credentials zur Verbindung mit der DS einzutragen. Im Attribut &#039;&#039;&#039;excludeFromUpload&#039;&#039;&#039; angegebene Objekte werden von den Backups ausgeschlossen. In dem Beispiel sind es gecachte Daten die im Restorefall nicht benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Backup-Device wird später von automatisch erstellten at-Devices angesprochen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== freigegebenen Ordner auf Synology DS erstellen ===&lt;br /&gt;
&lt;br /&gt;
Als Ziel für die auszuführenden Backups wird auf der Synology ein freigebener Ordner &#039;&#039;&#039;FHEM-Prod&#039;&#039;&#039; angelegt.&lt;br /&gt;
Die Schritte dazu sind in dieser [https://www.synology.com/de-de/knowledgebase/DSM/help/DSM/AdminCenter/file_share_create Online-Hilfe] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Synology Kalender anlegen ===&lt;br /&gt;
[[Datei:ssfcb1.PNG|right|thumb|200px|Synology Kalender]]&lt;br /&gt;
Für die vorgesehenen Steuerungen wird ein Kalender auf der Synology DS angelegt wenn noch nicht vorhanden. Im vorliegenden Beispiel wird dazu der Kalender &#039;&#039;&#039;Haussteuerung Prod&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Wie ein Synology Kalender angelegt wird, ist z.B. in diesem [https://www.synology.com/de-de/knowledgebase/DSM/help/Calendar/calendar_creating_calendars Hilfeartikel] beschrieben bzw. ist in diversen Onlinemedien abrufbar.&lt;br /&gt;
&lt;br /&gt;
Die von mir verwendete Definition des Synology Kalenders zur Aufnahme von Haussteuerungseinträgen zeigt nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== den angelegten Synology Kalender in FHEM integrieren ===&lt;br /&gt;
&lt;br /&gt;
Zur FHEM Integration wird das Modul 57_SSCal verwendet. Dieses Modul ist speziell für die Integration des Synology Calendar Servers entwickelt und verfügt über Features die die Erstellung automatisierter Vorgänge in FHEM sehr vereinfachen. Die umfangreichen Möglichkeiten des Modul sind im [http://sds1.myds.me/mediawiki/index.php?title=SSCal_-_Integration_des_Synology_Calendar_Servers|SSCal Wiki-Artikel] näher beschrieben.  &lt;br /&gt;
&lt;br /&gt;
Zur Integration des vorher angelegten Kalenders &#039;&#039;&#039;Haussteuerung Prod&#039;&#039;&#039; wird folgende RAW-Definition des Kalenderdevices &#039;&#039;&#039;SynControl&#039;&#039;&#039; verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod SynControl SSCal 192.168.2.10&lt;br /&gt;
attr SynControl alias Synology Kalender Haussteuerung&lt;br /&gt;
attr SynControl asyncMode 1&lt;br /&gt;
attr SynControl createATDevs 1&lt;br /&gt;
attr SynControl cutLaterDays 2&lt;br /&gt;
attr SynControl cutOlderDays 1&lt;br /&gt;
attr SynControl event-on-update-reading .*Summary.*,state&lt;br /&gt;
attr SynControl group Haussteuerung&lt;br /&gt;
attr SynControl icon time_calendar&lt;br /&gt;
attr SynControl interval 400&lt;br /&gt;
attr SynControl room Dienste-&amp;gt;Kalender&lt;br /&gt;
attr SynControl stateFormat &amp;lt;b&amp;gt;Status:&amp;lt;/b&amp;gt; state - &amp;lt;b&amp;gt;Last Update&amp;lt;/b&amp;gt;: lastUpdate - &amp;lt;b&amp;gt;Next Update&amp;lt;/b&amp;gt;: nextUpdate&lt;br /&gt;
attr SynControl tableFields Begin,End,DaysLeft,Weekday,Summary,Status,Calendar&lt;br /&gt;
attr SynControl tableSpecs {\&lt;br /&gt;
  &amp;quot;cellStyle&amp;quot;  =&amp;gt;            {\&lt;br /&gt;
                               &amp;quot;noHeader&amp;quot;           =&amp;gt; &amp;quot;0&amp;quot;,\&lt;br /&gt;
                               &amp;quot;headerAlign&amp;quot;        =&amp;gt; &amp;quot;center&amp;quot;,\&lt;br /&gt;
                               &amp;quot;columnAlign&amp;quot;        =&amp;gt; &amp;quot;center&amp;quot;,\&lt;br /&gt;
                               &amp;quot;columnSymbolAlign&amp;quot;  =&amp;gt; &amp;quot;center&amp;quot;,\&lt;br /&gt;
                               &amp;quot;columnSummaryAlign&amp;quot; =&amp;gt; &amp;quot;left&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
  &amp;quot;columnMapIcon&amp;quot;         =&amp;gt; [{\&lt;br /&gt;
                               &amp;quot;Status&amp;quot; =&amp;gt; &amp;quot;eq &#039;ended&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;   =&amp;gt; &amp;quot;rc_WEB@grey&amp;quot;,                                \&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;daysLeft&amp;quot; =&amp;gt; &amp;quot;&amp;gt;= 1 &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;   =&amp;gt; &amp;quot;rc_WEB&amp;quot;,                                \&lt;br /&gt;
                             }],\&lt;br /&gt;
  &amp;quot;columnMapProvider&amp;quot;     =&amp;gt; &amp;quot;GoogleMaps&amp;quot;,\&lt;br /&gt;
  &amp;quot;columnStateIcon&amp;quot;       =&amp;gt; [\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;ended&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;1px-spacer&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;started&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;10px-kreis-gruen&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;upcoming&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;10px-kreis-gelb&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;alarmed&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;10px-kreis-gruen&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             ],\&lt;br /&gt;
 &amp;quot;columnSymbolIcon&amp;quot;       =&amp;gt; &amp;quot;time_manual_mode&amp;quot;, \&lt;br /&gt;
}&lt;br /&gt;
attr SynControl usedCalendars Haussteuerung Prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb2.PNG|right|thumb|400px|grafische Kalenderübersicht]]&lt;br /&gt;
Nach der Erstdefinition des Devices muss der verwendete User mit seinen Credentials im Device gesetzt werden. Dadurch werden automatisch alle verfügbaren Kalender der in der DEF angegebenen Synology Diskstation (hier die DS mit der Adresse 192.168.2.10) abgerufen. Der/die relevante(n) Kalender werden danach mit dem &#039;&#039;&#039;Attribut usedCalendars&#039;&#039;&#039; selektiert.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist das Attribut &#039;&#039;&#039;createATDevs&#039;&#039;&#039;. Es bewirkt, dass eine im Feld &#039;&#039;&#039;Beschreibung&#039;&#039;&#039; eines Kalendereintrags vorhandene Codedefinition automatisch in ein at-Device in FHEM umgesetzt wird. Die dazu nötige Syntax wird im Abschnitt &amp;quot;Anlegen eines Kalendereintrags&amp;quot; näher erläutert.&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;&#039;tableSpecs&#039;&#039;&#039; legt die gewünschten Merkmale zur Gestaltung der graphischen Kalenderanzeige in FHEM fest. Nebenstehende Abbildung zeigt die Kalendergrafik des fertig angelegten Kalenderdevices. Die Übersicht enthält bereits Einträge zur Haussteuerung die es allerdings in einem frisch defninierten Kalender noch nicht gibt und erst durch die nachfolgend beschriebenen Verfahren hinzukommen.&lt;br /&gt;
  &lt;br /&gt;
Der im Attribut interval eingestellte Wert 400 definiert einen Abruf der Kalendereinträge alle 400 Sekunden. Dabei werden eventuell im Feld Beschreibung des Kalendereintrags enthaltene Codefinitionen ausgewertet aund automatisch korrespondierende at-Devices angelegt bzw. auch gelöscht/verändert wenn ein Kalendereintrag gelöscht oder entfernt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== den Eintrag für Full-Backup im Synology Kalender Haussteuerung vornehmen ===&lt;br /&gt;
 &lt;br /&gt;
Ein Full-Backup soll wöchentlich jeden Montag um 02:15 ausgeführt werden. In der Synology Kalenderapplikation wird dazu der abgebildete Kalendereintag vorgenommen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb3.PNG|left|thumb|200px|Kalendereintrag Vollsicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist eine Information über die bevorstehenden Start einer Sicherung gewünscht, kann im Punkt &#039;&#039;&#039;Warnung&#039;&#039;&#039; ein entsprechender Eintrag vorgenommen werden. Bei der Anlage des Kalendereintrags ist an dieser Stelle der Kalenderdefault hinterlegt, der im vorliegenden Beispiel komplett gelöscht wurde um keinerlei Hinweispopups oder dgl. zu erhalten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb4.PNG|right|thumb|300px|Wiederholung Vollsicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zur Einplanung der Wiederholung der Vollsicherung wird der Haken bei &#039;&#039;&#039;Ereignis wiederholen&#039;&#039;&#039; gesetzt und die entsprechende Einstellung zur wöchentlichen Wiederholung vorgenommen. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb5.PNG|right|thumb|300px|Codedefinition Vollsicherung]]&lt;br /&gt;
Die im Ereignis auszuführenden Aktion wird im Feld Beschreibung eingetragen. Das SSCal Device erkennt ein auszuführendes FHEM-Kommando an in geschweifte Klammern &#039;&#039;&#039;{...}&#039;&#039;&#039; eingebetteten Text. &lt;br /&gt;
Um eine Vollsicherung auszuführen, wird folgender Code in diesem Feld eingetragen&lt;br /&gt;
&lt;br /&gt;
 { set SynFile Upload &amp;quot;./&amp;quot; dest=/FHEM-Prod/%Y_%m_%d_Full }&lt;br /&gt;
&lt;br /&gt;
Die Quelle &#039;&#039;&#039;./&#039;&#039;&#039;, also der gesamte root-Ordner der FHEM-Installation, wird gesichert (normalerweise /opt/fhem). Das Zielverzeichnis %Y_%m_%d_Full wird im freigegebenen Ordner FHEM-Prod automatisch angelegt wenn es nicht vorhanden ist. Dabei werden die POSIX Variablen %Y durch das Jahr, %m durch den aktuellen Monat und %d durch den aktuellen Tag ersetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== den Eintrag für inkrementelles Backup im Synology Kalender Haussteuerung vornehmen ===&lt;br /&gt;
 &lt;br /&gt;
Ein inkrementelles Backup wird an allen anderen Tagen (als Montag) um 02:15 ausgeführt. In der Synology Kalenderapplikation wird dazu der abgebildete Kalendereintag vorgenommen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb6.PNG|left|thumb|200px|Kalendereintrag inkrementelle Sicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Warnung&#039;&#039;&#039; wird bei diesem Eintrag wieder entfernt um keinerlei Hinweispopups oder dgl. vor dem Start der Aktion zu erhalten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb7.PNG|right|thumb|300px|Wiederholung inkrementelle Sicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zur Einplanung der Wiederholung der inkremntellen Sicherung wird der Haken bei &#039;&#039;&#039;Ereignis wiederholen&#039;&#039;&#039; gesetzt und die entsprechende Einstellung zur wöchentlichen Wiederholung vorgenommen. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb8.PNG|right|thumb|300px|Codedefinition Vollsicherung]]&lt;br /&gt;
Im Feld Beschreibung wird wieder die Codierung für die Ausführung der inkrementellen Sicherung eingetragen:&lt;br /&gt;
&lt;br /&gt;
 { set SynFile Upload &amp;quot;./&amp;quot; dest=/FHEM-Prod/%Y_%m_%d mode=inc }&lt;br /&gt;
&lt;br /&gt;
Die Codierung entspricht dem oben beschriebenen Vollbackup, außer dass der Zusatz &#039;&#039;&#039;mode=inc&#039;&#039;&#039; das inkrementelle Backup bewirkt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== den Eintrag zum Löschen alter Backups im Synology Kalender Haussteuerung vornehmen ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb9.PNG|left|thumb|200px|Ablagestruktur Sicherungen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb10.PNG|right|thumb|200px|Eintrag Löschen Backups]]&lt;br /&gt;
Werden die in den vorangegangenen Punkten definierten Sicherungen ausgeführt, wird jedes Backup in einem separaten Verzeichnis im freigegebenen Ordner FHEM-Prod auf der Synology DS abgelegt wie z.B. im Bild gezeigt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es sollen alte Backups des Vormonats gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Dazu wird am 9. Tag jedes Monats ein Löschvorgang angelegt, der alle Backupverzeichnisse des Vormonats mit deren Inhalten löscht. Die Aktion wird erst einige Tage nach dem Start eines Monats ausgeführt, damit immer hinreichend aktuelle Backups online auf dem NAS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
Es wird der dargestellte Eintrag um 01:15 angelegt. Die Standardwarnungen werden wiederum gelöscht. Die Wiederholung wird monatlich mit dem Kriterium &amp;quot;Tag des Monats&amp;quot; ausgeführt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb11.PNG|left|thumb|200px|Wiederholung Löschen Backups]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits beschrieben, wird der Code des auszuführenden Kommandos im Feld Beschreibung eingetragen. Dieses Mal soll Perl-Code statt eines einfachen FHEM Kommandos ausgeführt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dazu wird der Code in doppelte geschweifte Klammern eingefügt &amp;lt;nowiki&amp;gt;{{...}}&amp;lt;/nowiki&amp;gt;. SSCal erkannt dadurch dass es sich hierbei um Perl-Code handelt und behandelt es entsprechend bei der Anlage des korrespondierenden at-Devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb12.PNG|right|thumb|200px|Code im Beschreibungs Feld]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{&lt;br /&gt;
  my $dev        = &amp;quot;SynFile&amp;quot;;&lt;br /&gt;
  my $folder     = &amp;quot;/FHEM-Prod/%Y_%m_&amp;quot;;&lt;br /&gt;
  my $folderres  = strftime &amp;quot;$folder&amp;quot;, localtime(time-1728000);  # heute - 20 Tage&lt;br /&gt;
  &lt;br /&gt;
  for my $d (1..31) {&lt;br /&gt;
      my $d     = sprintf &amp;quot;%02d&amp;quot;, $d;&lt;br /&gt;
      my $fstr  = $folderres.$d;&lt;br /&gt;
      my $fstr1 = $folderres.$d.&amp;quot;_Full&amp;quot;;&lt;br /&gt;
      CommandSet (undef, qq{$dev deleteRemoteObject &amp;quot;$fstr&amp;quot;});&lt;br /&gt;
      CommandSet (undef, qq{$dev deleteRemoteObject &amp;quot;$fstr1&amp;quot;});&lt;br /&gt;
  }&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
&lt;br /&gt;
Wurden alle Aktionen wie beschrieben durchgeführt, enthält das Kalenderdevice SynControl nach jedem Update die auszuführenden Backup-Aktivitäten. Durch die Aktivierung von &#039;&#039;&#039;createATDevs&#039;&#039;&#039; werden bei jedem Kalenderupdate at-Devices angelegt welche die gewünschten Backup-Aktionen terminieren und ausführen. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb13.PNG|right|thumb|200px|erzeugte at-Devices]]&lt;br /&gt;
[[Datei:ssfcb14.PNG|left|thumb|200px|erzeugtes at-Device]]&lt;br /&gt;
[[Datei:ssfcb15.PNG|right|thumb|200px|Backup Übersicht]]&lt;br /&gt;
&lt;br /&gt;
Das Kalenderdevice enthält im Abschnitt &#039;&#039;&#039;Probably associated with&#039;&#039;&#039; eine Übersicht der automatisch erzeugten at-Devices.&lt;br /&gt;
Die Namen der Devices sind generisch und enthalten neben der EventId auch den geplanten Ausführungszeitpunkt.&lt;br /&gt;
&lt;br /&gt;
Mit jedem Backup-Lauf wird ein Unterverzeichnis &amp;lt;Jahr&amp;gt;_&amp;lt;Monat&amp;gt;_&amp;lt;Tag&amp;gt; in FHEM-Prod angelegt in dem die gesicherten Dateien gespeichert werden. Die Sicherung ist strukturerhaltend, d.h. die FHEM-Verzeichnisse der gesicherten Daten werden ebenfalls mit angelegt.&lt;br /&gt;
Sicherungen die die älter sind als der aktuelle Monat werden am neunten Tag des aktuellen Monats entfernt.&lt;br /&gt;
&lt;br /&gt;
Möchte man die Sicherungen längere Zeit versioniert speichern, bietet sich der zusätzliche Einsatz des Tools Hyper Backup an. &lt;br /&gt;
&lt;br /&gt;
Zur Anzeige der grafischen Backup-Übersicht auf einem Tablet kann zum Beispiel ein [[SSCal_-_Integration_des_Synology_Calendar_Servers#Termintabelle_als_Weblink_einf.C3.BCgen|Weblink-Device]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Beschränkungen und Known Bugs =&lt;br /&gt;
&lt;br /&gt;
* es werden bei &#039;&#039;&#039;Upload/prepareUpload&#039;&#039;&#039; nur Dateien/Verzeichnisse berücksichtigt deren Name &#039;&#039;&#039;kein @&#039;&#039;&#039; beinhaltet.&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SSFile_-_Integration_der_Synology_File_Station&amp;diff=35832</id>
		<title>SSFile - Integration der Synology File Station</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SSFile_-_Integration_der_Synology_File_Station&amp;diff=35832"/>
		<updated>2021-06-19T16:14:56Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Arbeitsweise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Modul 50_SSFile wird ab dem 26.05.2021 offiziell per Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Entwicklungsversion bzw. Testmodulversion  kann über den nachfolgenden Download bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Bitte den Befehl so komplett mit den Ausführungszeichen am Anfang und Ende in der FHEMWEB Kommandozeile eingeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;quot;wget -qO ./FHEM/50_SSFile.pm https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/50_SSFile.pm&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach FHEM restarten.&lt;br /&gt;
&lt;br /&gt;
FHEM muß aktuell sein, insbesondere die Files im Verzeichnis &#039;&#039;&#039;/opt/fhem/lib/FHEM/SynoModules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das Modul SSFile arbeitet mit der Synology File Station zusammen, d.h. das Paket File Station muß auf der Diskstation aktiviert sein. Für die Kommunikation mit der File Station, d.h. um Files/Ordner hoch- bzw. herunterzuladen, wird ein User der Diskstation verwendet. Dieser User muß natürlich die Rechte besitzen um die beabsichtigten Lese- und Schreiboperationen auszuführen.&lt;br /&gt;
&lt;br /&gt;
Alle Operationen des Moduls sind Queue gesteuert. Das bedeutet, alles durchzuführenden Aktivitäten werden zunächst in eine Queue gestellt und danach abgearbeitet. Bei den meisten Befehlen wird die Abarbeitung der Queue implizit gestartet. Aber z.B. die set-Befehle &#039;&#039;&#039;prepareDownload&#039;&#039;&#039; und &#039;&#039;&#039;prepareUpload&#039;&#039;&#039; erstellen lediglich die Queueeinträge. &lt;br /&gt;
Um die Abarbeitung zu starten, ist in diesen Fällen ein abschließer Befehl&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; startQueue&lt;br /&gt;
&lt;br /&gt;
nötig wenn nicht durch das gesetzte Attribut &#039;&#039;&#039;interval&#039;&#039;&#039; ein regelmäßiger Queue-Start automatisch erfolgt.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Modul sind zum Beispiel regelmäßige Backups des gesamten FHEM-Systems möglich. Auch gezielte Restores von ausgewählten Dateien oder Verzeichnissen ohne Zippen oder Entzippen sind möglich.&lt;br /&gt;
&lt;br /&gt;
Durch die asynchrone Queue-Abarbeitung werden auch Ausfallzeiten der Diskstation toleriert. Ist die Diskstation zum Beipiel im Wartungsmodus oder im Sleep-Mode, bleiben die Einträge in der Queue erhalten und werden abgearbeitet sobald wieder eine Verbindung zur Diskstation hergestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
Das Modul benötigt keinerlei Mounts von freigegebenen Verzeichnissen der Diskstation auf dem FHEM-Server. Die Datenverarbeitung erfolgt komplett nicht-blockierend. Da die API-Schnittstelle genutzt wird, dauert die Datenübertragung länger als bei der Nutzung von Betriebsystem Kopierkommandos.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
&lt;br /&gt;
Die Definition ist sehr einfach, z.B.:&lt;br /&gt;
&lt;br /&gt;
 define SynFile SSFile 192.168.2.20&lt;br /&gt;
&lt;br /&gt;
Die IP-Adresse ist dabei die Adresse der Synology Diskstation. Sie kann auch ein DNS-Name sein. In diesem Fall bitte auch das globale Attribut &#039;&#039;&#039;dnsServer&#039;&#039;&#039; nicht vergessen zu setzen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfile1.PNG|right|thumb|300px|API Versionen Popup]]&lt;br /&gt;
Es kann ebenfalls das https-Protokoll oder ein vom default abweichender Port verwendet werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
 define SynFile SSFile 192.168.2.20 9001 https&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
 define SynFile SSFile 192.168.2.20 5010 http&lt;br /&gt;
&lt;br /&gt;
Nach der initialen Definition müssen zunächst die Credentials für die Verbindung zur Synology DS definiert werden:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; credentials &amp;lt;User&amp;gt; &amp;lt;Passwort&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind die Credentials gespeichert, kann die Funktion einfach getestet werden mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;Name&amp;gt; apiInfo&lt;br /&gt;
&lt;br /&gt;
Wird der Login erfolgreich ausgeführt, erscheint nach kurzer Zeit ein Popup mit den aktuell vorhandenen und verwendeten API-Versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Upload von Objekten zur Synology Diskstation (Backup) ==&lt;br /&gt;
&lt;br /&gt;
Es können ein oder mehrere Dateien, sowie ganze Ordner in einen Zielpfad auf der Synology Diskstation hochgeladen werden.&lt;br /&gt;
Zum Hochladen stehen zwei Set-Kommandos zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
; Upload: die angegebenen Dateien/Ordner werden durch das Modul bewertet und danach der Upload sofort gestartet&lt;br /&gt;
&lt;br /&gt;
; prepareUpload: die angegebenen Dateien/Ordener werden durch das Modul bewertet und nur in die interne Queue zur Abarbeitung gestellt.&amp;lt;br&amp;gt; Erst nach dem Kommando &#039;&#039;&#039;set &amp;lt;Name&amp;gt; startQueue&#039;&#039;&#039; wird die Abarbeitung gestartet. Alternativ kann auch das Attribut &#039;&#039;&#039;interval&#039;&#039;&#039; verwendet werden. Das triggert ebenfalls die Queue-Abarbeitung alle X Sekunden automatisch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Zielpfad wird mit dem Argument &#039;&#039;&#039;dest=&#039;&#039;&#039; bestimmt und beginnt immer mit einem auf der Synology angelegten &amp;quot;shared Folder&amp;quot;. In dem Zielpfad werden alle Objekte strukturerhaltend, d.h. inkl. ihrer Quellverzeichnisse, gespeichert. Das Verhalten ist mit dem Argument &#039;&#039;&#039;struc=&#039;&#039;&#039; veränderbar.&lt;br /&gt;
&lt;br /&gt;
Benötigte Unterverzeichnisse werden im Standard automatisch im Zielpfad angelegt.&lt;br /&gt;
&lt;br /&gt;
Die generelle Syntax für beide möglichen Upload-Befehle ist:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; Upload &amp;quot;&amp;lt;File&amp;gt;[,&amp;lt;File&amp;gt;,...]&amp;quot; | &amp;quot;&amp;lt;Ordner&amp;gt;[,&amp;lt;Ordner&amp;gt;,...]&amp;quot; &amp;lt;args&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; prepareUpload &amp;quot;&amp;lt;File&amp;gt;[,&amp;lt;File&amp;gt;,...]&amp;quot; | &amp;quot;&amp;lt;Ordner&amp;gt;[,&amp;lt;Ordner&amp;gt;,...]&amp;quot; &amp;lt;args&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die hochzuladenden Dateien bzw. Ordner werden durch Komma getrennt angegeben. Dateien und Ordner können kombiniert im Set-Befehl angegeben werden. Die Arbeitsweise des Upload-Befehls wird durch Argumente (&amp;lt;args&amp;gt;) gesteuert, die kombiniert werden können:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;dest=: &#039;&#039;&#039;&amp;lt;Ordner&amp;gt;&#039;&#039;&#039;: Zielpfad zur Speicherung der Dateien im Synology Dateisystem (der Pfad beginnnt mit einem shared Folder und endet ohne &amp;quot;/&amp;quot;). Diese Angabe ist verpflichtend. Es können [https://metacpan.org/pod/POSIX::strftime::GNU POSIX %-Wildcards] als Bestandteil des Zielpfads verwendet werden. Prominente Vertreter sind:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; * %d Tag des Monats (01..31)&amp;lt;br&amp;gt; * %m Monat (01..12)&amp;lt;br&amp;gt; * %Y Jahr (1970...)&amp;lt;br&amp;gt; * %H Stunde im 24-Stunden Format (00..23)&amp;lt;br&amp;gt; * %M die Minute (00..59)&amp;lt;br&amp;gt; * %S die Sekunde (00..60), (Der Bereich ist bis zu 60, um gelegentliche Schaltsekunden zu ermöglichen)&lt;br /&gt;
&lt;br /&gt;
;ow=: 	&#039;&#039;&#039;true&#039;&#039;&#039;: die Datei wird überschrieben, wenn sie im Ziel-Pfad schon vorhanden ist (default), &#039;&#039;&#039;false&#039;&#039;&#039;: eine bereits vorhandene Datei wird nicht überschrieben&lt;br /&gt;
&lt;br /&gt;
;cdir=:	&#039;&#039;&#039;true&#039;&#039;&#039;: übergeordnete(n) Ordner erstellen, falls nicht vorhanden. (default), &#039;&#039;&#039;false&#039;&#039;&#039;: übergeordnete(n) Ordner nicht erstellen&lt;br /&gt;
&lt;br /&gt;
;mode=:	&#039;&#039;&#039;full&#039;&#039;&#039;: alle außer im Attribut excludeFromUpload angegebenen Objekte werden berücksichtigt (default)&amp;lt;br&amp;gt; &#039;&#039;&#039;inc&#039;&#039;&#039;: nur neue Objekte und Objekte die sich nach dem letzten Upload verändert haben werden berücksichtigt&amp;lt;br&amp;gt; &#039;&#039;&#039;nth:&amp;lt;Tage&amp;gt;&#039;&#039;&#039;: nur Objekte neuer als &amp;lt;Tage&amp;gt; werden berücksichtigt (gebrochene Zahlen sind erlaubt, z.B. 3.6) &lt;br /&gt;
&lt;br /&gt;
;struc=: &#039;&#039;&#039;true&#039;&#039;&#039;: alle Objekte werden inkl. ihrer Verzeichnisstruktur im Zielpfad gespeichert (default)&amp;lt;br&amp;gt;&#039;&#039;&#039;false&#039;&#039;&#039;: alle Objekte werden ohne die ursprüngliche Verzeichnisstruktur im Zielpfad gespeichert &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der lokale Pfad zur Datei bzw. zum Ordner kann entweder ein absoluter Pfad oder eine relativer Pfad zum FHEM-Wurzelverzeichnis (siehe globales Attribut modpath) sein. Alle Quellen, Dateien/Ordner, müssen insgesamt in Quotes (&amp;quot;) eingeschlossen werden.&lt;br /&gt;
 &lt;br /&gt;
Nachfolgend einige Beispiele (Upload kann auch durch pepareUpload ersetzt werden):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./text.txt&amp;quot; dest=/home/upload&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Datei &amp;quot;text.txt&amp;quot; aus dem FHEM-Wurzelverzeichnis wird in das Zielverzeichnis &amp;quot;/home/upload&amp;quot; übertragen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;/opt/fhem/old data.txt&amp;quot; dest=/home/upload ow=false&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Datei &amp;quot;old data.txt&amp;quot; im Verzeichnis &amp;quot;/opt/fhem&amp;quot; wird nach &amp;quot;/home/upload/opt/fhem&amp;quot; übertragen sofern sie dort noch nicht existiert &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./log&amp;quot; dest=/home/upload mode=inc&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Dateien im Verzeichnis &amp;quot;log&amp;quot; des FHEM-Wurzelverzeichnisses werden nach &amp;quot;/home/upload/log&amp;quot; inkrementell übertragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./log&amp;quot; dest=/home/upload mode=full struc=false&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Dateien im Verzeichnis &amp;quot;log&amp;quot; des FHEM-Wurzelverzeichnisses werden nach &amp;quot;/home/upload&amp;quot; übertragen, unabhängig davon, ob sie seit der letzten Übertragung geändert wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./log&amp;quot; dest=/home/upload/%Y_%m_%d_%H_%M_%S mode=full struc=false&amp;lt;/b&amp;gt;&lt;br /&gt;
::wie voriges Beispiel. Der Zielpfad wird dynamisch mit dem aktuellen Datum + Uhrzeit ergänzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;./&amp;quot; dest=/home/upload mode=inc&amp;lt;/b&amp;gt;&lt;br /&gt;
::die Dateien des gesamten FHEM-Systems werden nach &amp;quot;/home/upload&amp;quot; inkrementell und strukturerhaltend übertragen.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;set &amp;lt;Name&amp;gt; Upload &amp;quot;/opt/fhem/fhem.pl,./www/images/PlotToChat.png,./log/fhem-2020-10-41.log&amp;quot; dest=/home/upload&amp;lt;/b&amp;gt; &lt;br /&gt;
::nur die angegebenen Dateien werden nach &amp;quot;/home/upload/&amp;lt;entsprechendes Unterverzeichnis&amp;gt;&amp;quot; übertragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Informationen über den Uploadstatus ===&lt;br /&gt;
&lt;br /&gt;
Das Reading QueueLength enthält die Anzahl der in der Queue befindlichen Befehle. Hier werden nicht nur Upload-Befehle berücksichtigt, sondern sämtliche noch offenen (oder mit Fehlerstatus behafteten) Einträge.&lt;br /&gt;
&lt;br /&gt;
Wird der Upload ausgeführt, erfolgt ein permanentes Herunterzählen dieses Readings bis auf &amp;quot;0&amp;quot; im Idealfall. Sollte nach Abarbeitung von Befehlen das Reading QueueLength noch den Wert größer &amp;quot;0&amp;quot; haben, konnten nicht alle Befehle abgearbeitet werden. Sätze mit permanenten Fehlerstatus werden zukünftig von der Abarbeitung ausgenommen, andere Einträge mit einem zeitlichen Versatz wiederholt, z.B. wenn die Synology Diskstation zum Zeitpunkt des Uploads nicht erreichbar war.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfile2.PNG|right|thumb|300px|Upload Historie]]&lt;br /&gt;
Die Ergebnisse der Uploads werden in einer internen Datenabank gespeichert. &lt;br /&gt;
Man kann sich die Upload-Historie ausgeben lassen mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; listUploadsDone &lt;br /&gt;
&lt;br /&gt;
Die Übersicht zeigt die übertragenen Quelldateien mit ihrem Ursprungspfad, dem Zielpfad sowie das Datum + Zeit der Übertragung.&lt;br /&gt;
Diese Informationen bleiben auch nach einem FHEM Restart erhalten und sind die Grundlage für die Bewertung einer inkrementellen Übertragung.&lt;br /&gt;
&lt;br /&gt;
Die Historie kann bei Bedarf gelöscht werden mit:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; deleteUploadsDone &lt;br /&gt;
&lt;br /&gt;
Die auf der Synology gespeicherten Dateien werden durch diesen Befehl aber nicht gelöscht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Download von Objekten zum FHEM-Server (Restore) =&lt;br /&gt;
&lt;br /&gt;
Zum Herunterladen von Dateien oder ganzen Ordnern stehen die Befehle &#039;&#039;&#039;Download&#039;&#039;&#039; bzw. &#039;&#039;&#039;prepareDownload&#039;&#039;&#039; zur Verfügung.&lt;br /&gt;
Die Syntax und das Ergebnis ist bei beiden Befehlen identisch, nur werden bei prepareDownload die herunterzuladenden Objekte zunächst nur in die Ausführungsqueue gestellt. Zum Starten ist dann der Befehl &lt;br /&gt;
[[Datei:ssfile3.PNG|right|thumb|300px|Ausgabe von set &amp;lt;&amp;gt; listQueue]]&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; startQueue&lt;br /&gt;
&lt;br /&gt;
auszuführen. Der Setter Download führt die Anweisung sofort aus.&lt;br /&gt;
Die mit &#039;&#039;&#039;prepareDownload&#039;&#039;&#039; erzeugten Queueeinträge können vor der Ausführung mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; listQueue&lt;br /&gt;
&lt;br /&gt;
anzeigt werden. Diese Liste könnte zum Beispiel so aussehen:&lt;br /&gt;
&lt;br /&gt;
 5 =&amp;gt; retryCount=&amp;gt;0, reqtype=&amp;gt;GET, params=&amp;gt;&amp;amp;path=&amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot;, opmode=&amp;gt;download, method=&amp;gt;download, header=&amp;gt;Accept: application/json, dest=&amp;gt;./Carport-20200625-1147065130.jpg, api=&amp;gt;DOWNLOAD&lt;br /&gt;
&lt;br /&gt;
Am Anfang steht immer der Index des Eintrags, hier ist es der Index 5.&lt;br /&gt;
Unerwünschte oder falsche Downloads können bei Bedarf noch gelöscht werden. Der Befehl&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;Name&amp;gt; purgeQueue &amp;lt;Index&amp;gt; &lt;br /&gt;
&lt;br /&gt;
löscht den angegebenen Eintrag mit dem Index, z.B. 5.&lt;br /&gt;
&lt;br /&gt;
Beim Download von Dateien/Ordnern ist zu beachten, dass die Objekte immer in den FHEM root-Ordner, überlicherweise /opt/fhem, geladen werden. Allerdings kann der Zielordner auf dem FHEM-Server durch den Zusatz von &#039;&#039;&#039;dest=&#039;&#039;&#039; bestimmt werden.&lt;br /&gt;
&lt;br /&gt;
Als Argument von dest= kann angegeben werden:&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;Filename&amp;gt;: das Objekt wird mit neuem Namen im default Pfad gespeichert&lt;br /&gt;
::* &amp;lt;Pfad/Filename&amp;gt;: das Objekt wird mit neuem Namen im angegebenen Pfad gespeichert&lt;br /&gt;
::* &amp;lt;Pfad/&amp;gt;: das Objekt wird mit ursprünglichen Namen im angegebenen Pfad gespeichert. &#039;&#039;&#039;Wichtig:&#039;&#039;&#039; der Pfad muß mit einem &amp;quot;/&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird als herunterzuladendes Objekt ein ganzer Ordner des Synology Dateisystems bestimmt, wird der Inhalt des Ordners in ein zip-Archiv verpackt und im Ziel auf dem FHEM-Server gespeichert. Die Dateien sind dann entsprechend aus dem Archiv zu entpacken.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ein paar Beispiele. Wichtig is es, die angegbenen Objekte in &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039; einzuschließen, was besondere Bedeutung hat, wenn die Dateien/Ordner Leerzeichen enthalten. Mehrere Objekte (Files, Ordner oder beides gemischt) werden durch Komma getrennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot;&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot; dest=carport.jpg&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot; dest=./log/carport.jpg&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg&amp;quot; dest=./log/&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/Temp/Anträge 2020,/backup/Carport-20200625-1147065130.jpg&amp;quot;&lt;br /&gt;
set &amp;lt;Name&amp;gt; Download &amp;quot;/backup/Carport-20200625-1147065130.jpg,/Temp/card.txt&amp;quot; dest=/opt/ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfile4.PNG|right|thumb|300px|Ausgabe von get &amp;lt;&amp;gt; remoteFolderList]]&lt;br /&gt;
Um sich einen Überblick über die auf der Synology vorhandenen Dateien zu verschaffen, kann man sich vor dem Download ein Liste der Objekte erstellen lassen. Dazu verwendet man den Befehl:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;Name&amp;gt; remoteFolderList &lt;br /&gt;
&lt;br /&gt;
Ohne weiteres Argument erstellt der Befehl eine Übersicht aller auf der Synology vorhandenenen shared Folder. Um  den Inhalt eines bestimmten Ordners anzuzeigen, wird dieser Ordner (inkl. eventueller Unterordner) als Argument mitgegeben, z.B.:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;Name&amp;gt; remoteFolderList &amp;quot;/FHEM-Prod/2020_11_29&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Ordnerobjekt beginnt immer mit einem &#039;&#039;&#039;/&#039;&#039;&#039; und wird in &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039; eingeschlossen, um auch Ordnernamen mit Leerzeichen verarbeiten zu können.&lt;br /&gt;
Es können noch weitere Optionen mitgegeben werden,um die angezeigten Informationen zu beeinflussen (siehe Commandref zu SSFile). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Beispiele zur Anwendung =&lt;br /&gt;
&lt;br /&gt;
== Backup des FHEM Filesystems über Synology Kalendereinplanung ==&lt;br /&gt;
&lt;br /&gt;
Es wird vorgestellt, wie man mit Hilfe des Synology Kalenders Backups des FHEM-Filesystems einplant und ausführen lässt. Dabei werden sowohl Full-Backups als auch inkrementelle Backups erstellt. &lt;br /&gt;
&lt;br /&gt;
Das Backupregime verfolgt folgendes Ziel bzw. Features:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* jede Woche Montag wird ein Full-Backup des gesamten FHEM-Verzeichnisses angefertigt&lt;br /&gt;
* die restlichen Tage der Woche werden nur neue oder geänderte Dateien gesichert (inkrementelles Backup)&lt;br /&gt;
* jede Sicherung wird auf der Synology in einem gemeinsamen Ordner (z.B. /FHEM-Prod) in jeweils einem separaten Verzeichnis gespeichert&lt;br /&gt;
* die Ordnerstruktur der Quelle bleibt innerhalb der Sicherung erhalten (d.h. man weiß genau wohin eine Datei der Sicherung in der Quelle gehört)&lt;br /&gt;
* die Sicherungsdateien können direkt wiederhergestellt werden, d.h. es ist kein dekomprimieren oder entpacken nötig.&lt;br /&gt;
* bei Bedarf können die Sicherungen ihrerseits durch Synology Backup Werkzeuge (z.B. Hyper Backup) auf externe Datenträger versioniert werden und stehen dadurch lange Zeit zur Verfügung &lt;br /&gt;
* die Sicherungen des laufenden Monats bleiben auf der Synology online verfügbar, ältere Backupverzeichnisse werden gelöscht und können bei Bedarf von einem externen Datenträger wiederhergestellt werden &lt;br /&gt;
* eine grafische chronologische Übersicht der auszuführenden Sicherungen (und Löschungen) ist z.B. zur Anzeige auf einem Tablet verfügbar &lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
Für das vorgestellte Scenario werden die Module SSFile und SSCal ([[SSCal - Integration des Synology Calendar Servers]]) verwendet. Das Modul SSCal zur Steuerung des Synology Kelenders wird hier nur insofern erläutert wie es für den hier vorgesehenen Einsatzzweck benötigt wird. Weiterführende Informationen findet man in dem [[SSCal - Integration des Synology Calendar Servers|Wiki-Artikel]] zu SSCal.&lt;br /&gt;
&lt;br /&gt;
Um das oben definierte Scenario umzusetzen, werden die dazu nötigen Schritte nachfolgend beschrieben. Es sind dazu &#039;&#039;&#039;keine Volume-Mounts&#039;&#039;&#039; auf dem FHEM-Server &#039;&#039;&#039;nötig&#039;&#039;&#039;. Jede Kommunikation und Datenübertragung wird über das lokale Netzwerk abgewickelt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== FHEM Backup-Device anlegen ===&lt;br /&gt;
&lt;br /&gt;
Zur Durchführung der Backup wird ein SSFile Device mit dem Namen &#039;&#039;&#039;SynFile&#039;&#039;&#039; definiert. Es wird in dem Beispiel die Verbindung zur Synology mit der Adresse 192.168.2.10 hergestellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb0.PNG|right|thumb|400px|Backup Device SynFile]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod SynFile SSFile 192.168.2.10&lt;br /&gt;
attr SynFile alias Backup auf Synology (API)&lt;br /&gt;
attr SynFile devStateIcon .*running:control_arrow_rightward .*done|.*Upload\squeue\sfill\sfinished:control_on_off:startQueue .*Error:control_arrow_rightward@red .*Initialized:control_standby@orange&lt;br /&gt;
attr SynFile excludeFromUpload ./FHEM/FhemUtils/cacheSSCam.*,\&lt;br /&gt;
./www/SVGcache.*&lt;br /&gt;
attr SynFile group Backup&lt;br /&gt;
attr SynFile icon system_backup&lt;br /&gt;
attr SynFile interval 0&lt;br /&gt;
attr SynFile noAsyncFillQueue 0&lt;br /&gt;
attr SynFile room Dienste-&amp;gt;Allgemein&lt;br /&gt;
attr SynFile showPassInLog 0&lt;br /&gt;
attr SynFile stateFormat &amp;lt;b&amp;gt;letzter Update:&amp;lt;/b&amp;gt; lastUpdate\&lt;br /&gt;
&amp;lt;br&amp;gt;\&lt;br /&gt;
1:state&lt;br /&gt;
attr SynFile verbose 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach der Erstdefinition sind die Credentials zur Verbindung mit der DS einzutragen. Im Attribut &#039;&#039;&#039;excludeFromUpload&#039;&#039;&#039; angegebene Objekte werden von den Backups ausgeschlossen. In dem Beispiel sind es gecachte Daten die im Restorefall nicht benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Backup-Device wird später von automatisch erstellten at-Devices angesprochen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== freigegebenen Ordner auf Synology DS erstellen ===&lt;br /&gt;
&lt;br /&gt;
Als Ziel für die auszuführenden Backups wird auf der Synology ein freigebener Ordner &#039;&#039;&#039;FHEM-Prod&#039;&#039;&#039; angelegt.&lt;br /&gt;
Die Schritte dazu sind in dieser [https://www.synology.com/de-de/knowledgebase/DSM/help/DSM/AdminCenter/file_share_create Online-Hilfe] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Synology Kalender anlegen ===&lt;br /&gt;
[[Datei:ssfcb1.PNG|right|thumb|200px|Synology Kalender]]&lt;br /&gt;
Für die vorgesehenen Steuerungen wird ein Kalender auf der Synology DS angelegt wenn noch nicht vorhanden. Im vorliegenden Beispiel wird dazu der Kalender &#039;&#039;&#039;Haussteuerung Prod&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Wie ein Synology Kalender angelegt wird, ist z.B. in diesem [https://www.synology.com/de-de/knowledgebase/DSM/help/Calendar/calendar_creating_calendars Hilfeartikel] beschrieben bzw. ist in diversen Onlinemedien abrufbar.&lt;br /&gt;
&lt;br /&gt;
Die von mir verwendete Definition des Synology Kalenders zur Aufnahme von Haussteuerungseinträgen zeigt nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== den angelegten Synology Kalender in FHEM integrieren ===&lt;br /&gt;
&lt;br /&gt;
Zur FHEM Integration wird das Modul 57_SSCal verwendet. Dieses Modul ist speziell für die Integration des Synology Calendar Servers entwickelt und verfügt über Features die die Erstellung automatisierter Vorgänge in FHEM sehr vereinfachen. Die umfangreichen Möglichkeiten des Modul sind im [http://sds1.myds.me/mediawiki/index.php?title=SSCal_-_Integration_des_Synology_Calendar_Servers|SSCal Wiki-Artikel] näher beschrieben.  &lt;br /&gt;
&lt;br /&gt;
Zur Integration des vorher angelegten Kalenders &#039;&#039;&#039;Haussteuerung Prod&#039;&#039;&#039; wird folgende RAW-Definition des Kalenderdevices &#039;&#039;&#039;SynControl&#039;&#039;&#039; verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod SynControl SSCal 192.168.2.10&lt;br /&gt;
attr SynControl alias Synology Kalender Haussteuerung&lt;br /&gt;
attr SynControl asyncMode 1&lt;br /&gt;
attr SynControl createATDevs 1&lt;br /&gt;
attr SynControl cutLaterDays 2&lt;br /&gt;
attr SynControl cutOlderDays 1&lt;br /&gt;
attr SynControl event-on-update-reading .*Summary.*,state&lt;br /&gt;
attr SynControl group Haussteuerung&lt;br /&gt;
attr SynControl icon time_calendar&lt;br /&gt;
attr SynControl interval 400&lt;br /&gt;
attr SynControl room Dienste-&amp;gt;Kalender&lt;br /&gt;
attr SynControl stateFormat &amp;lt;b&amp;gt;Status:&amp;lt;/b&amp;gt; state - &amp;lt;b&amp;gt;Last Update&amp;lt;/b&amp;gt;: lastUpdate - &amp;lt;b&amp;gt;Next Update&amp;lt;/b&amp;gt;: nextUpdate&lt;br /&gt;
attr SynControl tableFields Begin,End,DaysLeft,Weekday,Summary,Status,Calendar&lt;br /&gt;
attr SynControl tableSpecs {\&lt;br /&gt;
  &amp;quot;cellStyle&amp;quot;  =&amp;gt;            {\&lt;br /&gt;
                               &amp;quot;noHeader&amp;quot;           =&amp;gt; &amp;quot;0&amp;quot;,\&lt;br /&gt;
                               &amp;quot;headerAlign&amp;quot;        =&amp;gt; &amp;quot;center&amp;quot;,\&lt;br /&gt;
                               &amp;quot;columnAlign&amp;quot;        =&amp;gt; &amp;quot;center&amp;quot;,\&lt;br /&gt;
                               &amp;quot;columnSymbolAlign&amp;quot;  =&amp;gt; &amp;quot;center&amp;quot;,\&lt;br /&gt;
                               &amp;quot;columnSummaryAlign&amp;quot; =&amp;gt; &amp;quot;left&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
  &amp;quot;columnMapIcon&amp;quot;         =&amp;gt; [{\&lt;br /&gt;
                               &amp;quot;Status&amp;quot; =&amp;gt; &amp;quot;eq &#039;ended&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;   =&amp;gt; &amp;quot;rc_WEB@grey&amp;quot;,                                \&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;daysLeft&amp;quot; =&amp;gt; &amp;quot;&amp;gt;= 1 &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;   =&amp;gt; &amp;quot;rc_WEB&amp;quot;,                                \&lt;br /&gt;
                             }],\&lt;br /&gt;
  &amp;quot;columnMapProvider&amp;quot;     =&amp;gt; &amp;quot;GoogleMaps&amp;quot;,\&lt;br /&gt;
  &amp;quot;columnStateIcon&amp;quot;       =&amp;gt; [\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;ended&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;1px-spacer&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;started&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;10px-kreis-gruen&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;upcoming&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;10px-kreis-gelb&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             {\&lt;br /&gt;
                               &amp;quot;Status&amp;quot;   =&amp;gt; &amp;quot;eq &#039;alarmed&#039; &amp;quot;,\&lt;br /&gt;
                               &amp;quot;icon&amp;quot;     =&amp;gt; &amp;quot;10px-kreis-gruen&amp;quot;,\&lt;br /&gt;
                             },\&lt;br /&gt;
                             ],\&lt;br /&gt;
 &amp;quot;columnSymbolIcon&amp;quot;       =&amp;gt; &amp;quot;time_manual_mode&amp;quot;, \&lt;br /&gt;
}&lt;br /&gt;
attr SynControl usedCalendars Haussteuerung Prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb2.PNG|right|thumb|400px|grafische Kalenderübersicht]]&lt;br /&gt;
Nach der Erstdefinition des Devices muss der verwendete User mit seinen Credentials im Device gesetzt werden. Dadurch werden automatisch alle verfügbaren Kalender der in der DEF angegebenen Synology Diskstation (hier die DS mit der Adresse 192.168.2.10) abgerufen. Der/die relevante(n) Kalender werden danach mit dem &#039;&#039;&#039;Attribut usedCalendars&#039;&#039;&#039; selektiert.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist das Attribut &#039;&#039;&#039;createATDevs&#039;&#039;&#039;. Es bewirkt, dass eine im Feld &#039;&#039;&#039;Beschreibung&#039;&#039;&#039; eines Kalendereintrags vorhandene Codedefinition automatisch in ein at-Device in FHEM umgesetzt wird. Die dazu nötige Syntax wird im Abschnitt &amp;quot;Anlegen eines Kalendereintrags&amp;quot; näher erläutert.&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;&#039;tableSpecs&#039;&#039;&#039; legt die gewünschten Merkmale zur Gestaltung der graphischen Kalenderanzeige in FHEM fest. Nebenstehende Abbildung zeigt die Kalendergrafik des fertig angelegten Kalenderdevices. Die Übersicht enthält bereits Einträge zur Haussteuerung die es allerdings in einem frisch defninierten Kalender noch nicht gibt und erst durch die nachfolgend beschriebenen Verfahren hinzukommen.&lt;br /&gt;
  &lt;br /&gt;
Der im Attribut interval eingestellte Wert 400 definiert einen Abruf der Kalendereinträge alle 400 Sekunden. Dabei werden eventuell im Feld Beschreibung des Kalendereintrags enthaltene Codefinitionen ausgewertet aund automatisch korrespondierende at-Devices angelegt bzw. auch gelöscht/verändert wenn ein Kalendereintrag gelöscht oder entfernt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== den Eintrag für Full-Backup im Synology Kalender Haussteuerung vornehmen ===&lt;br /&gt;
 &lt;br /&gt;
Ein Full-Backup soll wöchentlich jeden Montag um 02:15 ausgeführt werden. In der Synology Kalenderapplikation wird dazu der abgebildete Kalendereintag vorgenommen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb3.PNG|left|thumb|200px|Kalendereintrag Vollsicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist eine Information über die bevorstehenden Start einer Sicherung gewünscht, kann im Punkt &#039;&#039;&#039;Warnung&#039;&#039;&#039; ein entsprechender Eintrag vorgenommen werden. Bei der Anlage des Kalendereintrags ist an dieser Stelle der Kalenderdefault hinterlegt, der im vorliegenden Beispiel komplett gelöscht wurde um keinerlei Hinweispopups oder dgl. zu erhalten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb4.PNG|right|thumb|300px|Wiederholung Vollsicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zur Einplanung der Wiederholung der Vollsicherung wird der Haken bei &#039;&#039;&#039;Ereignis wiederholen&#039;&#039;&#039; gesetzt und die entsprechende Einstellung zur wöchentlichen Wiederholung vorgenommen. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb5.PNG|right|thumb|300px|Codedefinition Vollsicherung]]&lt;br /&gt;
Die im Ereignis auszuführenden Aktion wird im Feld Beschreibung eingetragen. Das SSCal Device erkennt ein auszuführendes FHEM-Kommando an in geschweifte Klammern &#039;&#039;&#039;{...}&#039;&#039;&#039; eingebetteten Text. &lt;br /&gt;
Um eine Vollsicherung auszuführen, wird folgender Code in diesem Feld eingetragen&lt;br /&gt;
&lt;br /&gt;
 { set SynFile Upload &amp;quot;./&amp;quot; dest=/FHEM-Prod/%Y_%m_%d_Full }&lt;br /&gt;
&lt;br /&gt;
Die Quelle &#039;&#039;&#039;./&#039;&#039;&#039;, also der gesamte root-Ordner der FHEM-Installation, wird gesichert (normalerweise /opt/fhem). Das Zielverzeichnis %Y_%m_%d_Full wird im freigegebenen Ordner FHEM-Prod automatisch angelegt wenn es nicht vorhanden ist. Dabei werden die POSIX Variablen %Y durch das Jahr, %m durch den aktuellen Monat und %d durch den aktuellen Tag ersetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== den Eintrag für inkrementelles Backup im Synology Kalender Haussteuerung vornehmen ===&lt;br /&gt;
 &lt;br /&gt;
Ein inkrementelles Backup wird an allen anderen Tagen (als Montag) um 02:15 ausgeführt. In der Synology Kalenderapplikation wird dazu der abgebildete Kalendereintag vorgenommen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb6.PNG|left|thumb|200px|Kalendereintrag inkrementelle Sicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Warnung&#039;&#039;&#039; wird bei diesem Eintrag wieder entfernt um keinerlei Hinweispopups oder dgl. vor dem Start der Aktion zu erhalten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb7.PNG|right|thumb|300px|Wiederholung inkrementelle Sicherung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zur Einplanung der Wiederholung der inkremntellen Sicherung wird der Haken bei &#039;&#039;&#039;Ereignis wiederholen&#039;&#039;&#039; gesetzt und die entsprechende Einstellung zur wöchentlichen Wiederholung vorgenommen. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb8.PNG|right|thumb|300px|Codedefinition Vollsicherung]]&lt;br /&gt;
Im Feld Beschreibung wird wieder die Codierung für die Ausführung der inkrementellen Sicherung eingetragen:&lt;br /&gt;
&lt;br /&gt;
 { set SynFile Upload &amp;quot;./&amp;quot; dest=/FHEM-Prod/%Y_%m_%d mode=inc }&lt;br /&gt;
&lt;br /&gt;
Die Codierung entspricht dem oben beschriebenen Vollbackup, außer dass der Zusatz &#039;&#039;&#039;mode=inc&#039;&#039;&#039; das inkrementelle Backup bewirkt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== den Eintrag zum Löschen alter Backups im Synology Kalender Haussteuerung vornehmen ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb9.PNG|left|thumb|200px|Ablagestruktur Sicherungen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb10.PNG|right|thumb|200px|Eintrag Löschen Backups]]&lt;br /&gt;
Werden die in den vorangegangenen Punkten definierten Sicherungen ausgeführt, wird jedes Backup in einem separaten Verzeichnis im freigegebenen Ordner FHEM-Prod auf der Synology DS abgelegt wie z.B. im Bild gezeigt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es sollen alte Backups des Vormonats gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Dazu wird am 9. Tag jedes Monats ein Löschvorgang angelegt, der alle Backupverzeichnisse des Vormonats mit deren Inhalten löscht. Die Aktion wird erst einige Tage nach dem Start eines Monats ausgeführt, damit immer hinreichend aktuelle Backups online auf dem NAS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
Es wird der dargestellte Eintrag um 01:15 angelegt. Die Standardwarnungen werden wiederum gelöscht. Die Wiederholung wird monatlich mit dem Kriterium &amp;quot;Tag des Monats&amp;quot; ausgeführt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb11.PNG|left|thumb|200px|Wiederholung Löschen Backups]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie bereits beschrieben, wird der Code des auszuführenden Kommandos im Feld Beschreibung eingetragen. Dieses Mal soll Perl-Code statt eines einfachen FHEM Kommandos ausgeführt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dazu wird der Code in doppelte geschweifte Klammern eingefügt &amp;lt;nowiki&amp;gt;{{...}}&amp;lt;/nowiki&amp;gt;. SSCal erkannt dadurch dass es sich hierbei um Perl-Code handelt und behandelt es entsprechend bei der Anlage des korrespondierenden at-Devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb12.PNG|right|thumb|200px|Code im Beschreibungs Feld]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{&lt;br /&gt;
  my $dev        = &amp;quot;SynFile&amp;quot;;&lt;br /&gt;
  my $folder     = &amp;quot;/FHEM-Prod/%Y_%m_&amp;quot;;&lt;br /&gt;
  my $folderres  = strftime &amp;quot;$folder&amp;quot;, localtime(time-1728000);  # heute - 20 Tage&lt;br /&gt;
  &lt;br /&gt;
  for my $d (1..31) {&lt;br /&gt;
      my $d     = sprintf &amp;quot;%02d&amp;quot;, $d;&lt;br /&gt;
      my $fstr  = $folderres.$d;&lt;br /&gt;
      my $fstr1 = $folderres.$d.&amp;quot;_Full&amp;quot;;&lt;br /&gt;
      CommandSet (undef, qq{$dev deleteRemoteObject &amp;quot;$fstr&amp;quot;});&lt;br /&gt;
      CommandSet (undef, qq{$dev deleteRemoteObject &amp;quot;$fstr1&amp;quot;});&lt;br /&gt;
  }&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
&lt;br /&gt;
Wurden alle Aktionen wie beschrieben durchgeführt, enthält das Kalenderdevice SynControl nach jedem Update die auszuführenden Backup-Aktivitäten. Durch die Aktivierung von &#039;&#039;&#039;createATDevs&#039;&#039;&#039; werden bei jedem Kalenderupdate at-Devices angelegt welche die gewünschten Backup-Aktionen terminieren und ausführen. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ssfcb13.PNG|right|thumb|200px|erzeugte at-Devices]]&lt;br /&gt;
[[Datei:ssfcb14.PNG|left|thumb|200px|erzeugtes at-Device]]&lt;br /&gt;
[[Datei:ssfcb15.PNG|right|thumb|200px|Backup Übersicht]]&lt;br /&gt;
&lt;br /&gt;
Das Kalenderdevice enthält im Abschnitt &#039;&#039;&#039;Probably associated with&#039;&#039;&#039; eine Übersicht der automatisch erzeugten at-Devices.&lt;br /&gt;
Die Namen der Devices sind generisch und enthalten neben der EventId auch den geplanten Ausführungszeitpunkt.&lt;br /&gt;
&lt;br /&gt;
Mit jedem Backup-Lauf wird ein Unterverzeichnis &amp;lt;Jahr&amp;gt;_&amp;lt;Monat&amp;gt;_&amp;lt;Tag&amp;gt; in FHEM-Prod angelegt in dem die gesicherten Dateien gespeichert werden. Die Sicherung ist strukturerhaltend, d.h. die FHEM-Verzeichnisse der gesicherten Daten werden ebenfalls mit angelegt.&lt;br /&gt;
Sicherungen die die älter sind als der aktuelle Monat werden am neunten Tag des aktuellen Monats entfernt.&lt;br /&gt;
&lt;br /&gt;
Möchte man die Sicherungen längere Zeit versioniert speichern, bietet sich der zusätzliche Einsatz des Tools Hyper Backup an. &lt;br /&gt;
&lt;br /&gt;
Zur Anzeige der grafischen Backup-Übersicht auf einem Tablet kann zum Beispiel ein [[SSCal_-_Integration_des_Synology_Calendar_Servers#Termintabelle_als_Weblink_einf.C3.BCgen|Weblink-Device]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Beschränkungen und Known Bugs =&lt;br /&gt;
&lt;br /&gt;
* es werden bei &#039;&#039;&#039;Upload/prepareUpload&#039;&#039;&#039; nur Dateien/Verzeichnisse berücksichtigt deren Name &#039;&#039;&#039;kein @&#039;&#039;&#039; beinhaltet.&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wetter_und_Wettervorhersagen&amp;diff=35831</id>
		<title>Wetter und Wettervorhersagen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wetter_und_Wettervorhersagen&amp;diff=35831"/>
		<updated>2021-06-19T15:25:11Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Yahoo-Wetter */ umbenannt nach Weather Modul, APIs aufgelistet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wetterdaten und Wettervorhersagen können auf verschiedene Weise in FHEM eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
== Modul Weather ==&lt;br /&gt;
Das Modul [[Weather]] extrahiert Wetterdaten via API von den Wetterdatenanbietern&lt;br /&gt;
* [https://openweathermap.org/ Openweathermap]&lt;br /&gt;
** Vorschauzeitraum: 5 Tage (zeitliche Auflösung: 3 Stunden)&lt;br /&gt;
** Aktuelle Daten (minütlich)&lt;br /&gt;
** 1000 Abrufe pro Tag mit dem Gratis-API-Key (Stand: Juni 2021)&lt;br /&gt;
* [https://www.wunderground.com/ wunderground]&lt;br /&gt;
** API-KEY nur für Gerätebesitzer&lt;br /&gt;
* [https://darksky.net/ DarkSky]&lt;br /&gt;
** API soll Ende 2022 abgeschaltet werden&lt;br /&gt;
** Es können keine neuen API-Key erstellt werden (Stand: Juni 2021)&lt;br /&gt;
&lt;br /&gt;
Da die Yahoo Weather API zum 03.01.2019 abgeschaltet wurde, kann Weather keine Wetterdaten von Yahoo mehr beziehen.&lt;br /&gt;
&lt;br /&gt;
== Unwetterzentrale ==&lt;br /&gt;
Informationen der Seite(n) Unwetterzentrale.de können mit Hilfe des Moduls [[UWZ]] eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
== Modul OPENWEATHER ==&lt;br /&gt;
Das Modul [[OPENWEATHER]] extrahiert Wetterdaten über die &amp;quot;openweather&amp;quot;-Schnittstelle (API) von www.wetter.com. &lt;br /&gt;
*Vorschau-Zeitraum: 3 Tage&lt;br /&gt;
*Vorschau-Interval: 6:00, 11:00, 17:00, 23:00&lt;br /&gt;
*Aktuelle Daten: keine&lt;br /&gt;
&lt;br /&gt;
== Modul PROPLANTA ==&lt;br /&gt;
Das Modul [[PROPLANTA]] extrahiert Wetterdaten von der Website www.proplanta.de. (keine API)&lt;br /&gt;
*Vorschau-Zeitraum: 12 Tage&lt;br /&gt;
*Vorschau-Interval: 3 h&lt;br /&gt;
*Aktuelle Daten: jede volle Stunde&lt;br /&gt;
&lt;br /&gt;
== Modul WWO ==&lt;br /&gt;
Das {{Link2CmdRef|Anker=WWO|Label=Modul WWO}} extrahiert Wetterdaten über die (alte) API von worldweatheronline.com&lt;br /&gt;
*Vorschau-Zeitraum: ?? Tage&amp;lt;BR&amp;gt;&lt;br /&gt;
*Vorschau-Interval: ??&amp;lt;br&amp;gt;&lt;br /&gt;
*Aktuelle Daten: ??&lt;br /&gt;
&lt;br /&gt;
== Deutscher Wetterdienst (DWD) ==&lt;br /&gt;
&lt;br /&gt;
=== Modul DWD_OpenData ===&lt;br /&gt;
Das Modul [[DWD_OpenData]] stellt einen Teil der frei verfügbaren Daten des Deutschen Wetterdienstes (DWD) bereit, die über den [https://www.dwd.de/DE/leistungen/opendata/opendata.html Open Data Server] abgerufen werden können (diverse Datenformate, keine API). &lt;br /&gt;
*Vorschau-Zeitraum: 10 Tage&lt;br /&gt;
*Vorschau-Interval: datenabhängig, viele mit 3 h&lt;br /&gt;
*Vorschau-Orte: national und international&lt;br /&gt;
*Aktuelle Daten: nicht implementiert&lt;br /&gt;
*Wetterwarnungen: für Landkreise und Gemeinden in deutsch oder englisch&lt;br /&gt;
&lt;br /&gt;
Es gibt zum Modul auch einen Weblink für [[FHEMWEB]], der 2 Icons pro Tag in horizontaler Form darstellt. Die Anzahl der insgesamt dargestellten Icons ist konfigurierbar. Liegen Wetterwarnungen vor, wird zusätzlich ein Warnsymbol angezeigt, über das man per Klick weitere Details zur Wetterwarnung abrufen kann.&lt;br /&gt;
&lt;br /&gt;
[[DWD_OpenData|Weitere Details und Installationsbeschreibung]]&lt;br /&gt;
&lt;br /&gt;
=== Wetterwarnungen als Karte ===&lt;br /&gt;
Der Deutsche Wetterdienst [http://www.dwd.de DWD] stellt neben diversen Wetterdaten auch Wetterwarnungen in Bildform bereit. Diese können sehr einfach via [http://fhem.de/commandref_DE.html#weblink weblink iframe] in FHEM eingebunden werden - das ist zwar nicht die schönste Form, aber die schnellste.&lt;br /&gt;
&lt;br /&gt;
Dazu sucht man sich zuerst auf der [http://www.dwd.de/bvbw/appmanager/bvbw/dwdwwwDesktop?_nfpb=true&amp;amp;_pageLabel=_dwdwww_wetter_warnungen_warnungen&amp;amp;T92053gsbDocumentPath=BEA__Navigation%2FWetter__Warnungen%2FWarnungen.html%3F__nnn%3Dtrue&amp;amp;lastPageLabel=dwdwww_wetter_warnungen Warnungsseite des DWD] die eigene Region heraus (in der Karte durchklicken). Die gewünschte URL für Berlin Stadt ist z.B. &amp;lt;code&amp;gt;http://www.dwd.de/dyn/app/ws/html/reports/BXX_warning_de.html#WS_ANCHOR_0&amp;lt;/code&amp;gt;. Das Anhängsel &amp;lt;code&amp;gt;#WS_ANCHOR_0&amp;lt;/code&amp;gt; kann man in der Konfiguration auch weglassen.&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in FHEM sieht dann wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define dwd_warnmeldung weblink iframe http://www.dwd.de/dyn/app/ws/html/reports/BXX_warning_de.html&lt;br /&gt;
attr dwd_warnmeldung group Wetterwarnungen (DWD)&lt;br /&gt;
attr dwd_warnmeldung htmlattr width=&amp;quot;100%&amp;quot; height=&amp;quot;300&amp;quot; frameborder=&amp;quot;0&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot;&lt;br /&gt;
attr dwd_warnmeldung room Wettervorhersage,Startseite&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vorhersage-Diagramm von YR ==&lt;br /&gt;
[http://www.yr.no YR] ist die Seite des norwegischen Wetterdiensts. Er ist zwar nur in Teilen auf Englisch (und gar nicht auf Deutsch) verfügbar, bietet aber sehr gute Wettervorhersagen - auch mit eigenen Vorhersagen für kleine Dörfer. Neben etlichen Detailinfos bietet YR eine sehr schicke 48h-Vorhersage-Grafik. Diese kann sehr einfach via [http://fhem.de/commandref_DE.html#weblink weblink iframe] in FHEM eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
Dazu geht man auf die [http://www.yr.no Startseite von YR] und gibt in das Suchfeld den Namen seines Dörfchens ein - die Ergebnissliste kann ziemlich lang werden, sodass man evtl. sehr genau schauen muss, welches das eigene Kaff ist - bei mir war es an 29. Stelle... ;-) Auf der gewünschten Seite gibt es einen Unterpunkt &amp;quot;Hour by hour&amp;quot;, wo sich die besagte Grafik findet. Hier kopiert man sich einfach die URL der Grafik.&lt;br /&gt;
&lt;br /&gt;
Die Einbindung in FHEM sieht dann bspw. wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Wetter_yr_Vorhersage weblink iframe http://www.yr.no/place/Germany/Berlin/Berlin/meteogram.png&lt;br /&gt;
attr Wetter_yr_Vorhersage group Wettervorhersage (yr)&lt;br /&gt;
attr Wetter_yr_Vorhersage htmlattr width=&amp;quot;100%&amp;quot; height=&amp;quot;300&amp;quot; frameborder=&amp;quot;0&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot;&lt;br /&gt;
attr Wetter_yr_Vorhersage room Wettervorhersage,Start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wetter von Weather Underground ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Das (&amp;quot;offene&amp;quot;) API von Weather Underground wird derzeit (März 2019) &amp;quot;retired&amp;quot; = abgestellt, ist also künftig nicht mehr nutzbar! Den benötigten API-Key bekommen &amp;quot;nur noch&amp;quot; Betreiber einer Wetterstation, die diese bei wundergound registrieren und ihre Daten hochladen.}}&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die hier beschriebene Vorgehensweise ist etwas anspruchsvoller und somit eher für erfahrene FHEM-User geeignet.&lt;br /&gt;
&lt;br /&gt;
[http://www.wunderground.com/ Weather Underground] bietet eine sehr umfassende Sammlung aller möglichen offiziellen und privaten (aber teils sehr professionellen) Wetterstationen weltweit. Es besteht eine recht hohe Wahrscheinlichkeit, dass es in der eigenen Umgebung schon eine Wetterstation gibt. Anstatt nun selbst eine komplette Wetterstation aufzubauen, kann man alternativ auf die Daten der Nachbarstation zugreifen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Neben dem hier vorgestellten Abruf der Weather Underground-Daten mit [[HTTPMOD]] kann auf Weather Underground-Daten auch mit dem darauf spezialisierten Modul [http://fhem.de/commandref.html#Wunderground Wunderground] zugegriffen werden.}}&lt;br /&gt;
&lt;br /&gt;
Dazu sind grundsätzlich die folgenden Schritte notwendig:&lt;br /&gt;
* Finden der geeigneten Station&lt;br /&gt;
* Auswerten der XML-Daten&lt;br /&gt;
* Erstellen passender gplot-Dateien&lt;br /&gt;
&lt;br /&gt;
=== Finden der geeigneten Station ===&lt;br /&gt;
Als erstes geht man auf die [http://www.wunderground.com Startseite von Weather Underground] und gibt in das Suchfeld den Namen seines Dörfchens oder der nächsten Stadt ein - für Berlin landet man bspw. auf Seite für &amp;quot;Berlin Alexanderplatz&amp;quot;. Es gibt aber manchmal sehr viele Wetterstationen in der direkten Umgebung. Diese findet man indem am auf &amp;quot;Change Station&amp;quot; klickt und sich eine passende Station aussucht. Nähere Infos (zB. zur verwendeten Hard- und Software) zu der gewählten Wetterstation erhält man, wenn man auf den Namen der Station klickt und dann auf &amp;quot;About this PWS&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Weather Underground stellt die Daten der Wetterstation auch über eine API als XML bereit, die wir auswerten können. Die entsprechende URL findet sich ebenfalls unter &amp;quot;About this PWS&amp;quot; unter &amp;quot;Download current conditions XML&amp;quot;. Für Berlin Prenzlauer Berg wäre dies z.B. &lt;br /&gt;
&amp;lt;code&amp;gt;http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBERLIN15&amp;amp;format=XML&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Entscheidend für die jeweilige Station ist der Teil nach &amp;quot;?=ID&amp;quot;, also in diesem Fall &amp;quot;IBERLIN15&amp;quot;. Dieser Teil des Links lässt sich leicht durch die ID einer anderen Station ersetzen und die Suche nach dem entsprechenden Link auf der Seite der Station bleibt erspart.&lt;br /&gt;
&lt;br /&gt;
=== Auswerten der XML-Daten ===&lt;br /&gt;
Die Auswertung der XML-Daten erfolgt via [[HTTPMOD]]. Da dies nicht ganz trivial ist, sind im Folgenden zuerst die wesentlichen Konfigurationsschritte exemplarisch beschrieben. Weiter unten findet sich dann die fertige vollständige Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Es erstes wird das Device HTTPMOD definiert (die 600 am Schluss ist der Aktualisierungszyklus in Sekunden, also alle 10 min):&lt;br /&gt;
:&amp;lt;code&amp;gt;define wetter_prenzelberg HTTPMOD http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=IBERLIN15 600 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden Attribute für alle Readings definiert:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg userattr readingsName_cloudiness readingsName_date ... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird jedem Attribut ein Name zugewiesen (unter diesem Namen wird der Wert ins Log geschrieben):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg readingsName_cloudiness cloudiness &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss wird das Reading selbst definiert:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wetter_prenzelberg readingsRegex_cloudiness cloudiness id=&amp;quot;NN&amp;quot; percent=&amp;quot;([\d\.]+) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration für alle von der API angebotenen Wetterwerte sieht dann wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define wetter_prenzelberg HTTPMOD http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=IBERLIN15 600&lt;br /&gt;
attr wetter_prenzelberg userattr readingsName_cloudiness readingsName_date readingsName_dewpointTemperature readingsName_fog readingsName_heatindex readingsName_humidity readingsName_pressure readingsName_solarRadiation readingsName_solarUV readingsName_temperature readingsName_time readingsName_windChill readingsName_windDegrees readingsName_windDirection readingsName_windGust readingsName_windSpeed readingsRegex_cloudiness readingsRegex_date readingsRegex_dewpointTemperature readingsRegex_fog readingsRegex_heatindex readingsRegex_humidity readingsRegex_pressure readingsRegex_solarRadiation readingsRegex_solarUV readingsRegex_temperature readingsRegex_time readingsRegex_windChill readingsRegex_windDegrees readingsRegex_windDirection readingsRegex_windGust readingsRegex_windSpeed&lt;br /&gt;
attr wetter_prenzelberg readingsName_cloudiness cloudiness&lt;br /&gt;
attr wetter_prenzelberg readingsName_date date&lt;br /&gt;
attr wetter_prenzelberg readingsName_dewpointTemperature dewpointTemperature&lt;br /&gt;
attr wetter_prenzelberg readingsName_fog fog&lt;br /&gt;
attr wetter_prenzelberg readingsName_heatindex heatindex&lt;br /&gt;
attr wetter_prenzelberg readingsName_humidity humidity&lt;br /&gt;
attr wetter_prenzelberg readingsName_pressure pressure&lt;br /&gt;
attr wetter_prenzelberg readingsName_solarRadiation solarRadiation&lt;br /&gt;
attr wetter_prenzelberg readingsName_solarUV solarUV&lt;br /&gt;
attr wetter_prenzelberg readingsName_temperature temperature&lt;br /&gt;
attr wetter_prenzelberg readingsName_time time&lt;br /&gt;
attr wetter_prenzelberg readingsName_windChill windChill&lt;br /&gt;
attr wetter_prenzelberg readingsName_windDegrees windDegrees&lt;br /&gt;
attr wetter_prenzelberg readingsName_windDirection windDirection&lt;br /&gt;
attr wetter_prenzelberg readingsName_windGust windGust&lt;br /&gt;
attr wetter_prenzelberg readingsName_windSpeed windSpeed&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_cloudiness cloudiness id=&amp;quot;NN&amp;quot; percent=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_date date date&amp;quot; content=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_dewpointTemperature &amp;lt;dewpoint_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_fog fog id=&amp;quot;FOG&amp;quot; percent=&amp;quot;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_heatindex &amp;lt;heat_index_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_humidity &amp;lt;relative_humidity&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_pressure &amp;lt;pressure_mb&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_solarRadiation &amp;lt;solar_radiation&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_solarUV &amp;lt;UV&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_temperature &amp;lt;temp_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_time time Zeit([\d\:]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windChill &amp;lt;windchill_c&amp;gt;(\+|-?[\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windDegrees &amp;lt;wind_degrees&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windDirection &amp;lt;wind_dir&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windGust &amp;lt;wind_gust_mph&amp;gt;([\d\.]+)&lt;br /&gt;
attr wetter_prenzelberg readingsRegex_windSpeed &amp;lt;wind_mph&amp;gt;([\d\.]+)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Nicht immer werden alle Werte geliefert (wenn keine Sonne, dann kein UV-Wert...). Im System-Log kann das als Fehler auftauchen, ist aber kein Problem.&lt;br /&gt;
&lt;br /&gt;
=== Erstellen passender gplot-Dateien ===&lt;br /&gt;
Um die ausgelesenen Werte als Graphen darstellen zu können müssen eigene gplot-Dateien erstellt werden. Eine grundsätzliche Anleitung dazu findet sich unter [[Creating Plots]]. Deshalb sollen hier nur Beispiele für die eigentlichen gplot-Dateien vorgestellt werden. Beispiele sollten sowohl für [[FileLog]] wie [[DbLog]] funktionieren.&lt;br /&gt;
&lt;br /&gt;
Temperatur und Luftfeuchte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
set ytics &lt;br /&gt;
set y2tics &lt;br /&gt;
set grid ytics&lt;br /&gt;
set ylabel &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Humidity (%)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:temperature\x3a::&lt;br /&gt;
#FileLog 4:windChill\x3a::&lt;br /&gt;
#FileLog 4:humidity\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:temperature::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windChill::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:humidity::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Temperatur (C)&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Gefühlte Temperatur (C)&#039; ls l1 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Luftfeuchtigkeit (%)&#039; ls l2fill lw 0.2 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wind und Windrichtung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
set ytics&lt;br /&gt;
set y2tics (&amp;quot;Nord&amp;quot; 0, &amp;quot;Ost&amp;quot; 80, &amp;quot;S&amp;amp;#252;d&amp;quot; 180, &amp;quot;West&amp;quot; 270, &amp;quot;Nord&amp;quot; 360)&lt;br /&gt;
&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
set grid xtics ytics&lt;br /&gt;
&lt;br /&gt;
set yrange [0:20]&lt;br /&gt;
set y2range [0:360]&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Wind (mph)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Richtung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:windSpeed:0:&lt;br /&gt;
#FileLog 4:windGust:0:&lt;br /&gt;
#FileLog 4:windDegrees:0:&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windSpeed::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windGust::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:windDegrees::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Wind (mph)&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Böen (mph)&#039; ls l1 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Windrichtung (°)&#039; ls l2fill lw 0.2 with points&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sonnenintensität und UV-Werte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
set ytics&lt;br /&gt;
set y2tics&lt;br /&gt;
&lt;br /&gt;
#set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set title &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
set grid xtics ytics&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Sonnenstrahlung (W/qm)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;UV&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:solarRadiation:0:&lt;br /&gt;
#FileLog 4:solarUV:0:&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:solarRadiation::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:solarUV::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Strahlung&#039; ls l0 lw 1.5 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;UV&#039; ls l1 lw 1.5 with lines&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weitere TBD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Vergangene Daten abfragen ===&lt;br /&gt;
Ein konkretes vergangenes Datum der Wetterstation kann man übrigens auch abrufen - für den 28.11.2014 wäre dies bspw. &lt;br /&gt;
&amp;lt;code&amp;gt;http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBERLIN15&amp;amp;day=28&amp;amp;month=11&amp;amp;year=2014&amp;amp;graphspan=day&amp;amp;format=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Wetterdaten hochladen ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Unterstützung für das Modul gibt es im dazugehörigen {{Link2Forum|Topic=65587|LinkText=Forumsthread }}.}}&lt;br /&gt;
Wer eigene Wetterdaten hochladen will, kann hierzu das {{Link2CmdRef|Anker=WUup|Label=Modul WUup}} verwenden. Dazu benötigt man die Zugangsdaten (stationID und Paßwort) für eine eigene Wetterstation. Mit dem Modul können die meisten vom [http://web.archive.org/web/20180815041359/http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol PWS Upload Protocol] unterstützten Daten hochgeladen werden:&lt;br /&gt;
* Winddir - [0-360 momentane Windrichtung]&lt;br /&gt;
* Windspeedmph - [mph momentane Windgeschwindigkeit]&lt;br /&gt;
* Windgustmph - [mph aktuellen Böe, mit Software-spezifischem Zeitraum]&lt;br /&gt;
* Windgustdir - [0-360 mit Software-spezifischer Zeit]&lt;br /&gt;
* Windspdmph_avg2m - [mph durchschnittliche Windgeschwindigkeit innerhalb 2 Minuten]&lt;br /&gt;
* Winddir_avg2m - [0-360 durchschnittliche Windrichtung innerhalb 2 Minuten]&lt;br /&gt;
* Windgustmph_10m - [mph Böen der vergangenen 10 Minuten]&lt;br /&gt;
* Windgustdir_10m - [0-360 Richtung der Böen der letzten 10 Minuten]&lt;br /&gt;
* Feuchtigkeit - [% Außenfeuchtigkeit 0-100%]&lt;br /&gt;
* Dewptf- [F Taupunkt im Freien]&lt;br /&gt;
* Tempf - [F Außentemperatur]&lt;br /&gt;
* Rainin - [in Regen in der vergangenen Stunde]&lt;br /&gt;
* Dailyrainin - [in Regenmenge bisher heute]&lt;br /&gt;
* Baromin - [inHg barometrischer Druck]&lt;br /&gt;
* Soiltempf - [F Bodentemperatur]&lt;br /&gt;
* Bodenfeuchtigkeit - [%]&lt;br /&gt;
* Solarradiation - [W/m²]&lt;br /&gt;
* UV - [Index]&lt;br /&gt;
* AqPM2.5 - Feinstaub PM2,5 [µg/m³]&lt;br /&gt;
* AqPM10 - Feinstaub PM10 [µg/m³]&lt;br /&gt;
&lt;br /&gt;
Die Werte werden im Modul für Wunderground ins anglo-amerikanische System umgerechnet. Temperaturen werden also automatisch von °Celsius in Fahrenheit, Windgeschwindigkeiten von km/h in mph, mm in Inch und der barometrische Druck von hPa in inHg umgerechnet.&lt;br /&gt;
&lt;br /&gt;
== Wetternetzwerk auf wetter.com ==&lt;br /&gt;
Ein vollständiges Beispiel zur Nutzung der Informationen über die Regenmenge (Station 1445, Weinheim) von wetter.com ist in {{Link2Forum|Topic=39600|Message=332837|LinkText=diesem Forenbeitrag}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Wetter von netatmo ==&lt;br /&gt;
Das FHEM-Modul [[netatmo]] ermöglicht den Datenimport von privaten und öffentlichen netatmo Wetterstationen sowie den Abruf der in der Netatmo App verfügbaren Wettervorhersage. Eine Übersicht über die verfügbaren öffentlichen Stationen findet sich auf der Seite [http://www.netatmo.com/de-DE/weathermap Weathermap]. Die meisten öffentlichen Stationen liefern Temperatur, Luftfeuchte und Luftdruck, einige auch Wind, Regen und Daten zur Luftqualität (CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=33610}} mit Sammlung und Beipielen von Internet-Links für die Anzeige von teilweise animierten Wetterbildern&lt;br /&gt;
* [http://bloglich.de/art/rpi/wetterdaten-auf-dem-raspberry-pi-in-fhem/ Beispiel in Blog(de)]&lt;br /&gt;
* [[HTTPMOD]]    [[Kategorie:Code Snippets]]  [[Kategorie:HOWTOS]]  [[Kategorie:Wetterstationen]] &amp;lt;!-- eigentlich eine &amp;quot;Hardware-Kategorie&amp;quot;, passt aber trotzdem --&amp;gt;&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Speedtest&amp;diff=35734</id>
		<title>Speedtest</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Speedtest&amp;diff=35734"/>
		<updated>2021-05-16T16:14:11Z</updated>

		<summary type="html">&lt;p&gt;50watt: Kleinigkeiten zum ookla binary ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Testet die Internetgeschwindigkeit&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=speedtest&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=32_speedtest.pm&lt;br /&gt;
|ModOwner=Andre / justme1968 ({{Link2FU|430|Forum}} / [[Benutzer_Diskussion:Justme|Wiki]])}}&lt;br /&gt;
[[Speedtest]] ist ein Modul, mit dem in regelmäßigen Abständen die Internet-Geschwindigket (Download, Upload, Ping) gemessen werden kann. Dabei wird auf das externe Python-Script [https://github.com/sivel/speedtest-cli speedtest-cli] zurückgegriffen. &lt;br /&gt;
&lt;br /&gt;
Mit dem Stand vom 05.10.2020 kann alternativ auch das offizielle CLI Binary von ookla verwendet werden. Dies liefert in der Regel genauere Werte, vor allem bei höheren Bandbreiten.  &lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Für diese Anleitung ist notwendig:&lt;br /&gt;
* Debian-Derivat (Debian, Ubuntu, Raspbian, ...)&lt;br /&gt;
* Linux-Grundkenntnisse&lt;br /&gt;
* Paket- und Quellenverwaltung apt-get&lt;br /&gt;
* wget&lt;br /&gt;
&lt;br /&gt;
Alle in diesen Kapitel genannten Befehle müssen auf der Kommandozeile abgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Installation von speedtest-cli ===&lt;br /&gt;
Voraussetzung:&lt;br /&gt;
* Python 2.4 - 3.4&lt;br /&gt;
{{Hinweis|Sollte [https://www.python.org/ Python] und/oder [https://www.gnu.org/software/wget/ wget] nicht installiert sein, kann das mit folgenden zwei Befehlen erledigt werden:&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install python wget&lt;br /&gt;
}}&lt;br /&gt;
Zuerst muss das speedtest-cli - Script heruntergeladen werden. Der folgende Befehl erledigt das mit Hilfe von wget und speichert die Datei im Verzeichnis &#039;&#039;/usr/local/bin&#039;&#039;:&lt;br /&gt;
 sudo wget -O /usr/local/bin/speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py&lt;br /&gt;
&lt;br /&gt;
Anschließend muss die Datei noch als &amp;quot;ausführbar&amp;quot; markiert werden:&lt;br /&gt;
 sudo chmod +x /usr/local/bin/speedtest-cli&lt;br /&gt;
&lt;br /&gt;
Ob alles funktioniert hat, kann man dann mit einem einfachen Aufruf überprüfen:&lt;br /&gt;
 speedtest-cli --help&lt;br /&gt;
&lt;br /&gt;
Weitere Installationsanleitungen sind auf der [https://github.com/sivel/speedtest-cli speedtest-cli - Webseite] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Installation des CLI Binary von ookla ===&lt;br /&gt;
&lt;br /&gt;
Alternativ das CLI Binary von ookla: https://www.speedtest.net/apps/cli herunterladen.&lt;br /&gt;
&lt;br /&gt;
Für RasperryPi:&lt;br /&gt;
* &amp;lt;code&amp;gt; wget https://install.speedtest.net/app/cli/ookla-speedtest-1.0.0-arm-linux.tgz&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt; tar -xzvf ookla-speedtest-1.0.0-arm-linux.tgz&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mv speedtest /usr/local/bin/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und setzen des Attributs &amp;lt;code&amp;gt;ookla&amp;lt;/code&amp;gt; mit dem Wert 1.&lt;br /&gt;
&lt;br /&gt;
Falls damit der folgende Fehler im FHEM-Log angezeigt wird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2020.10.07 11:52:14.721 5: speedtest done&lt;br /&gt;
  what():  basic_string::_M_construct null not valid&lt;br /&gt;
terminate called after throwing an instance of &#039;std::logic_error&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
muss das FHEM-Start -Script angepasst werden. Beispiel in {{Link2Forum|Topic=114118|Message=1090706|LinkText=diesem Forenbeitrag}}.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Das Modul wird folgendermaßen definiert:&lt;br /&gt;
 define &amp;lt;name&amp;gt; speedtest [interval] [server]&lt;br /&gt;
&lt;br /&gt;
=== Optionen ===&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;interval&amp;gt;&amp;lt;/code&amp;gt;: Optional. Der Wert bestimmt, in welchen Zeitabständen ein Geschwindigkeitstest durchgeführt wird. Wird kein Intervall angegeben, wird der Standard-Wert (3600s) verwendet. Minimum sind 1800 Sekunden.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;server&amp;gt;&amp;lt;/code&amp;gt;: Optional. Hier kann die ID eines Speedtest-Servers eingetragen werden, gegen den die Geschwindigkeits-Tests gefahren werden. Ist kein Wert angegeben, wird der &amp;quot;nächstgelegene&amp;quot; Server verwendet.&lt;br /&gt;
 &lt;br /&gt;
{{Hinweis|Eine Liste aller verfügbaren Speedtest-Server kann mittels &amp;lt;code&amp;gt;speedtest-cli --list&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;speedtest-cli --list {{!}} grep Germany&amp;lt;/code&amp;gt; angezeigt werden}}&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
* &amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt; (ms)&lt;br /&gt;
* &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; (MBit/s)&lt;br /&gt;
* &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; (MBit/s)&lt;br /&gt;
&lt;br /&gt;
=== Set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;statusRequest&amp;lt;/code&amp;gt;: Startet einen manuellen Durchlauf des definierten Tests&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Bei der Definition des Moduls können folgende Attribute gesetzt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;: Hier kann das Verzeichnis des speedtest-cli-Scripts angegeben werden (z.B.: /usr/local/bin).&lt;br /&gt;
* &amp;lt;code&amp;gt;checks-till-disable&amp;lt;/code&amp;gt;: Über dieses Attribut lässt sich festlegen, wie häufig speedtest-cli ausgeführt werden soll, bevor der automatische Aufruf deaktiviert wird. Nach Ablauf des Zählers wird das Modul automatisch auf disable gesetzt. Bei jedem Durchlauf wird der Zähler um 1 reduziert.&lt;br /&gt;
* &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt;: Ist dieses Attribut auf 1 gesetzt, ist die automatische Ausführung deaktiviert. Das manuelle Ausführen über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; ist trotzdem möglich.&lt;br /&gt;
* &amp;lt;code&amp;gt;ookla&amp;lt;/code&amp;gt;: Ist dieses Attribut auf 1 gesetzt, wird das CLI Binary von ookla verwendet.&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[File:speedtest01.png|mini|right|200px|Ein speedtest-Device nach dem Geschwindigkeits-Test]]&lt;br /&gt;
&lt;br /&gt;
=== Definition des Moduls ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define MySpeedtest speedtest 1800 5255&lt;br /&gt;
attr MySpeedtest path /usr/local/bin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging in eine Datei ===&lt;br /&gt;
Das Speichern der Ergebnisse in ein Logfile erreicht man z.B. so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define FileLog_MySpeedtest FileLog ./log/MySpeedtest-%Y%m.log MySpeedtest:.*&lt;br /&gt;
attr FileLog_MySpeedtest logtype text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Plot (FileLog)====&lt;br /&gt;
Ein zugehörige SVG-Plot könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
############################&lt;br /&gt;
# Display speedtest results&lt;br /&gt;
&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
set yrange [0:1]&lt;br /&gt;
set y2range [0:12]&lt;br /&gt;
set y3range [0:120]&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Mbit/s&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Mbit/s&amp;quot;&lt;br /&gt;
set y3label &amp;quot;ms&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:speedtest.download\x3a::&lt;br /&gt;
#FileLog 4:speedtest.upload\x3a::&lt;br /&gt;
#FileLog 4:speedtest.ping\x3a::&lt;br /&gt;
&lt;br /&gt;
plot&lt;br /&gt;
     using 1:2 ls l0 axes x1y2 title &#039;download (Mbit/s)&#039; with lines,&lt;br /&gt;
     using 1:2 ls l1 axes x1y1 title &#039;upload (Mbit/s)&#039; with lines,&lt;br /&gt;
     using 1:2 ls l2 axes x1y3 title &#039;ping (ms)&#039; with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Weblink dazu wird wie folgt definiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define wl_speedtest SVG FileLog_speedtest:speedtest3:CURRENT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging mit Hilfe von [[DbLog]] ===&lt;br /&gt;
Das Loggen in eine Datenbank erfolgt, wenn ein Reading explizit oder generell alle Readings bei der Definition von [[DbLog]] angegeben worden sind und bei der Definition des Moduls [[Speedtest]] die Readings nicht über &#039;&#039;DbLogExclude&#039;&#039; ausgeschlossen wurden.&lt;br /&gt;
&lt;br /&gt;
==== Plot (DbLog) ====&lt;br /&gt;
Definition des Plots bei Verwendung von DbLog:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define wl_speedtest SVG myDbLog:speedtest:HISTORY&lt;br /&gt;
attr wl_speedtest label &amp;quot;DL $data{currval1} / UL $data{currval2} / ping $data{currval3}&amp;quot;&lt;br /&gt;
attr wl_speedtest plotfunction speedtest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definition der Datei speedtest.gplots:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
############################&lt;br /&gt;
# Display speedtest results&lt;br /&gt;
&lt;br /&gt;
set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
set yrange [0:1]&lt;br /&gt;
set y2range [0:12]&lt;br /&gt;
set y3range [0:120]&lt;br /&gt;
&lt;br /&gt;
set ylabel &amp;quot;Mbit/s&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Mbit/s&amp;quot;&lt;br /&gt;
set y3label &amp;quot;ms&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#myDbLog &amp;lt;SPEC1&amp;gt;:download:::$val=~s/([\d.]*).*/$1/eg&lt;br /&gt;
#myDbLog &amp;lt;SPEC1&amp;gt;:upload:::$val=~s/([\d.]*).*/$1/eg&lt;br /&gt;
#myDbLog &amp;lt;SPEC1&amp;gt;:ping:::$val=~s/([\d.]*).*/$1/eg&lt;br /&gt;
&lt;br /&gt;
plot&lt;br /&gt;
     using 1:2 ls l0 axes x1y2 title &#039;download (Mbit/s)&#039; with lines,&lt;br /&gt;
     using 1:2 ls l1 axes x1y1 title &#039;upload (Mbit/s)&#039; with lines,&lt;br /&gt;
     using 1:2 ls l2 axes x1y3 title &#039;ping (ms)&#039; with lines&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
* Für den Betrieb ist Python notwendig. Daher läuft das Script nicht ohne Weiteres auf einer FritzBox.&lt;br /&gt;
* Zwischenzeitlich wurde das Script umbenannt. Das Modul erwartet nach wie vor den ursprünglichen Namen. Daher ist wie oben beschrieben darauf zu achten, dass das abgelegte Script &amp;lt;code&amp;gt;speedtest-cli&amp;lt;/code&amp;gt; heißt und notfalls dementsprechend umbenannt wird.&lt;br /&gt;
* Das Modul bricht ggf. mit einer Perl-Fehlermeldung im FHEM-Log ab, obwohl das Script von der Konsole aus einwandfrei läuft. Dies tritt z.B. bei Verwendung von Rasbian mit installierten Python 2.7 und Python 3 auf. Zur Behebung muss im Script &amp;lt;code&amp;gt;speedtest-cli&amp;lt;/code&amp;gt; die erste Zeile auf &amp;lt;code&amp;gt;#!/usr/bin/env python&#039;&#039;&#039;3&#039;&#039;&#039;&amp;lt;/code&amp;gt; geändert werden.&lt;br /&gt;
* Auf manchen Systemen muss in aktuellen speedtest-cli Versionen die Zeile &amp;lt;code&amp;gt;&#039;(%s; U; %s; en-us)&#039; % (platform.system(), platform.architecture()[0]),&amp;lt;/code&amp;gt; auskommentiert werden.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
Im Folgenden sind ein paar Ansatzpunkte genannt, um beim Troubleshooting zu unterstützen:&lt;br /&gt;
* Das Script läuft auf der Kommandzeile problemlos, das Modul bringt aber Fehler:&lt;br /&gt;
** Script ist nicht ausführbar (&amp;lt;code&amp;gt;chmod +x speedtest-cli&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Der FHEM-User (&#039;&#039;fhem&#039;&#039;) hat keine Berechtigung das Script auszuführen&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
; Ist das Log frei von Fehlermeldungen?&lt;br /&gt;
; Werden im Modul Readings angezeigt?&lt;br /&gt;
; Kommen die Readings im Log (Filelog oder DbLog) an?&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* SVG-Plot zeigt nichts an:&lt;br /&gt;
** Verweis auf Filelog oder DbLog falsch&lt;br /&gt;
** Falsches gplot-File angegeben&lt;br /&gt;
** Übergabe der Plotfunktion (bei DbLog) nicht korrekt&lt;br /&gt;
** Falsche Groß-/Kleinschreibung verwendet (case sensitive)&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Ist der Inhalt des gplot-Files korrekt&lt;br /&gt;
* Ist die Definition der Quelle korrekt (Filelog, DbLog oder LogProxy)?&lt;br /&gt;
* Ist die Regexpr korrekt?&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* Fehlermeldung &#039;&#039;isn&#039;t numeric in sprintf at ./FHEM/98_SVG.pm&#039;&#039;&lt;br /&gt;
** Dieses kommt grundsätzlich immer dann vor, wenn SVG versucht einen Wert einzulesen, der neben der Zahl auch die Einheit enthält. Dieses kann bei der Verwendung von DbLog vorkommen, weil DbLog nicht weiß, wie es Wert und Einheit trennen soll. Abhilfe schafft eine entsprechende Regular Expression, die nur den Zahlenwert liefert.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Beschreibung des Scripts [http://binarynature.blogspot.de/2013/03/measure-internet-connection-speed-from-linux-command-line.html binarynature.blogspot.de]&lt;br /&gt;
* [https://pypi.python.org/pypi/speedtest-cli speedtest-cli auf pypi.python.org]&lt;br /&gt;
* [https://github.com/sivel/speedtest-cli speedtest-cli auf github.com]&lt;br /&gt;
* Forumseintrag über die Entwicklung des Moduls {{Link2Forum|Topic=13419|Message=83189|LinkText=Thema: Internetgeschwindigkeit überwachen}}&lt;br /&gt;
* Forumseintrag darüber, dass das Binary nicht auf der Fritzbox läuft {{Link2Forum|Topic=27242|Message=201516|LinkText=Thema: Internetgeschwindigkeit - speedtest}}&lt;br /&gt;
* Forumseintrag über aus der Idee wird ein Modul {{Link2Forum|Topic=13483|Message=83538|LinkText=Thema: Internetgeschwindigkeit überwachen}}&lt;br /&gt;
* Forumsbeitrag zum Einsatz unter Windows {{Link2Forum|Topic= 111602|LinkText=Thema: Speedtest für windows}}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
Besten Dank an wkarl, Puschel74, justme1968 für Idee, Modulerstellung/Pflege und Installationsanleitung.&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor&amp;diff=35681</id>
		<title>EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor&amp;diff=35681"/>
		<updated>2021-05-09T07:40:28Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Einrichtung des TF61J Langversion */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=Tf61j.png&lt;br /&gt;
|Bildbeschreibung=TF61J Fertigungswoche 21/18&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Aktor, Empfänger&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=bidirektional&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch ca. 0,8W&lt;br /&gt;
|HWPoweredBy=230V&lt;br /&gt;
|HWSize=45x45x18mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Eltako&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Getestet mit Geräten aus der Fertigungswoche 21/18}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor&#039;&#039;&#039; ist ein Aktor&lt;br /&gt;
* für&lt;br /&gt;
** Unterputzmontage&lt;br /&gt;
* für&lt;br /&gt;
** Steuerung von Rollladen und Beschattungselementen&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich betreibe 14 TF61J in meinem Haus. In einigen Räumen betreibe ich bis zu 3 TF61J.&lt;br /&gt;
Bei der Einrichtung gab es hierdurch viele Komplikationen, weshalb ich meine Erfahrunge teilen will.&lt;br /&gt;
&lt;br /&gt;
== Wissenswertes zu Tipp-Funk Geräten: ==&lt;br /&gt;
Tipp-Funk ist die Low Cost Serie von Eltako. Verständlicher muss der Hersteller hier einige Funktionen abspecken um den Preis zu erreichen.&lt;br /&gt;
Folgendes ist deshalb zu beachten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Konfiguration / Schalter / LEDs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Geräte verfügen über keine LEDs oder Schalter. Alles wird über Taster Kommandos eingestellt, als Rückmeldung dienen Fahrbewegungen der Motoren.&lt;br /&gt;
&lt;br /&gt;
Die fabrikneuen Geräte gehen beim Anschalten in den Lernmodus, was Sie durch kurze Fahrbewegungen anzeigen.&lt;br /&gt;
Wurde schon einmal mit den Geräten gespielt kann es sein das Sie nicht in den Lernmodus gehen.&lt;br /&gt;
Deshalb beim Einlernen immer komplett resetten!&lt;br /&gt;
&lt;br /&gt;
Werden zwei oder mehr Tipp-Funk Geräte gleichzeitig eingschalten, sind beide im Lernmodus. Jedes Einlernen wird also auf beide Geräte übertragen und beide bewegen sich.&lt;br /&gt;
Deshalb immer den Lernmodus sperren!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Bidirektionale Kommunikation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Diese ist standardmäßig aus.&lt;br /&gt;
Also zuerst immer einschalten!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Verschlüsselung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Eltako Tipp-Funk TF Geräte verfügen nicht über Verschüsselung.&lt;br /&gt;
Wer dieses Feature möchte muss zum anderen Eltako Produkten greifen.&lt;br /&gt;
Aus meiner Sicht ist das fehlen von Verschlüsselung für Jalousien im normalen Haushalt aber ok.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Repeater&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Eltako Tipp-Funk TF Geräte verfügen nicht über eine Repeater Funktion.&lt;br /&gt;
Wer dieses Feature möchte muss zum anderen Eltako Produkten greifen.&lt;br /&gt;
Dieses Feature kann bei größeren Entfernungen Sinn machen, wobei hier ein einziges Gerät als Repeater evtl. schon reichen würde.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des TF61J Kurzversion ==&lt;br /&gt;
# EnOID aufschreiben&lt;br /&gt;
# Strom An/Aus&lt;br /&gt;
# Bidirektionale Kummunikation anschalten&lt;br /&gt;
# Bei mehreren TF61J pro Stromkreis -&amp;gt; Lernmodus sperren&lt;br /&gt;
# Device in FHEM anlegen&lt;br /&gt;
# Eventuell automatisch erkannte Geräte löschen&lt;br /&gt;
# Strom An/Aus&lt;br /&gt;
# Speicherinhalt komplett löschen (Auslieferzustand herstellen)&lt;br /&gt;
# Device in FHEM teachen&lt;br /&gt;
# Lernmods sperren&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des TF61J Langversion ==&lt;br /&gt;
Die Schritte sind nicht unbedingt alle nötig. Waren die TF61J jedoch schon einmal konfiguriert, ist unklar in welchem Zustand / Konfiguration sie sich befinden.&lt;br /&gt;
Dies hat bei mir zu vielen Problemen geführt. Deshalb meine Empfehlung: alle Schritte durchlaufen, dann funktioniert es sicher!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Vor dem Einbau&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die EnOID aufschreibe. Diese brauchen wir später!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Strom An/Aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Bidirektionale Kommunikation (Bestätigungs Telegramme) einschalten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der TF61J kann rückmelden was er gerade tut und uns Bestätigungstelegramme schicken. Diese Funktion ist ab Werk deaktiviert.&lt;br /&gt;
Taucht im EventMonitor von FHEM beim drücken eines mit einem TF Gerät verbunden Tasters keine Nachricht auf, ist die Bidirektionale Kommunikation entweder deaktiviert oder das Gerät zu weit vom Sender entfernt.&lt;br /&gt;
Um einzuschalten: Am örtlichen Taster 7-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 2-malig kurzen &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Bei mehreren TF61J pro Stromkreis -&amp;gt; Lermodus Sperren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Damit nicht mehrere TF gleichzeitig lernen und so z.B. bei Steuerung aus FHEM heraus gleichzeitig fahren, darf immer nur ein TF lernbereit sein.&lt;br /&gt;
Lernmodus AN für den TF der Lernen soll: Am örtlichen Taster 4-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 1-malig kurz &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
Lernmodus AUSfür den TF der nicht Lernen soll: Am örtlichen Taster 3-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 2-malig kurz &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Anlegen in FHEM&#039;&#039;&#039;&lt;br /&gt;
Jetzt legen wir das Gerät in FHEM an.&lt;br /&gt;
Hierzu geben wir einen RolloNamen ein.&lt;br /&gt;
Die EnOID haben wir vom Gerät abgeschrieben.&lt;br /&gt;
H5-3F-7F ist die EEP mit der wir definieren das es ein TF61J ist. (Wird später durch FHEM auf A5-3F-7F geändert was scheinbar so sein muss)&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;RolloName&amp;gt; EnOcean &amp;lt;EnOID&amp;gt; H5-3F-7F&lt;br /&gt;
&lt;br /&gt;
Jetzt empfehle ich noch die subDef (das ist die EnoceanID des virtuellen Senders aus FHEM heraus) fest vorzugeben.&lt;br /&gt;
Ich hatte hier viele Probleme: Plötzlich sind andere Rollos mitgefahren, weil FHEM hier die DEF (EnOID) anderer Rollos eingetragen hat.&lt;br /&gt;
Vermutlich hatte ich vorher schon zuviele konfiguriert und wieder gelöscht und einiges blieb wohl im System hängen.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 {EnOcean_CheckSenderID(&amp;quot;getUsedID&amp;quot;,&amp;quot;&amp;lt;IODev&amp;gt;&amp;quot;,&amp;quot;0000000&amp;quot;)};&lt;br /&gt;
&lt;br /&gt;
schauen wir uns an, welche Sender-IDs schon vergeben sind. Hier einfach die ganz rechte nehmen und 1 dazu zählen (HEX):&lt;br /&gt;
Beispiel:&lt;br /&gt;
FFDFE101 FFDFE102 FFDFE103&lt;br /&gt;
Also nehmen wir FFDFE104&lt;br /&gt;
Sollte in dieser Liste eine EnOID eines deiner Geräte auftauchen, ist eines schon falsch konfiguriert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Eventuell automatisch erkannte Geräte löschen&#039;&#039;&#039;&lt;br /&gt;
Sind Geräte durch Strom An/Aus automatisch erkannt worden, stehen Sie z.B. unter switch als EnO_xxxxxxx device. Ich habe diese in diesem Schritt immer gelöscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7. Strom An/Aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8. TF61J Speicherinhalt komplett löschen (Auslieferzustand herstellen)&#039;&#039;&#039;&lt;br /&gt;
Sehr wichtig! Einfach machen, dann funktioniert die Konfiguration sicher!&lt;br /&gt;
Am örtlichen Taster 8-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 1-malig kurz &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9. Teachen&#039;&#039;&#039;&lt;br /&gt;
Jetzt müssen wir den TF61J noch vernünftig einlernen&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;RolloName&amp;gt; teach&lt;br /&gt;
&lt;br /&gt;
Der Rollladen sollte nun einmal 2 kurz als Bestätigung fahren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10. Lernmodus sperren&#039;&#039;&#039;&lt;br /&gt;
Am Ende immer den Lernmodus sperren. Sonst könnte der TF versehentlich andere Taster mitlernen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Falscher Rollladen fährt bzw. fährt zusätzlich bei Steuerung aus FHEM heraus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei Einlernen waren mehrer TF61J im Lernmodus. Alle haben den Software Taster des FHEM eingelernt.&lt;br /&gt;
-&amp;gt; Alle betroffenen Geräte neu Konfigurieren&lt;br /&gt;
&lt;br /&gt;
Die SubDef eines Gerätes ist auf eine EnOID eines anderen Gerätes eingestellt, dann fährt dieses mit.&lt;br /&gt;
-&amp;gt; SubDef wie in Punkt 5 beschrieben Auswählen und Ändern.&lt;br /&gt;
-&amp;gt; Alle betroffenen Geräte neu Konfigurieren&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Ich sehe die Kommandos des angeschlossenen Tasters in FHEM, jedoch kann ich den Rollladen aus FHEM nicht steuern.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Konfiguration hat nicht funktioniert.&lt;br /&gt;
-&amp;gt; Noch einmal von vorne anfangen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Der TF61J reagiert nicht auf Tasterkommandos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Der angeschlossene Taster hackt oder prellt. Beim Eingeben der Tasterkommandos hin hören, was das Relais macht (klack). Durch kürzeres oder längeres Drücken funktioniert es dann meistens.&lt;br /&gt;
&lt;br /&gt;
*Der TF61J ist nicht im Lernmodus. Entsperren.&lt;br /&gt;
&lt;br /&gt;
*Der TF61J hat den Lernmodus verlassen (geschieht nach 120s). Strom An/Aus.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://www.tipp-funk.de/bedienungsanleitungen/ Bedienungsanleitungen (Fertigungswoche beachten!)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor&amp;diff=35680</id>
		<title>EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor&amp;diff=35680"/>
		<updated>2021-05-09T07:37:20Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Einrichtung des TF61J Langversion */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=Tf61j.png&lt;br /&gt;
|Bildbeschreibung=TF61J Fertigungswoche 21/18&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Aktor, Empfänger&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=bidirektional&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch ca. 0,8W&lt;br /&gt;
|HWPoweredBy=230V&lt;br /&gt;
|HWSize=45x45x18mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Eltako&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Getestet mit Geräten aus der Fertigungswoche 21/18}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-TF61J-Eltako-TippFunk-Jalousieaktor&#039;&#039;&#039; ist ein Aktor&lt;br /&gt;
* für&lt;br /&gt;
** Unterputzmontage&lt;br /&gt;
* für&lt;br /&gt;
** Steuerung von Rollladen und Beschattungselementen&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich betreibe 14 TF61J in meinem Haus. In einigen Räumen betreibe ich bis zu 3 TF61J.&lt;br /&gt;
Bei der Einrichtung gab es hierdurch viele Komplikationen, weshalb ich meine Erfahrunge teilen will.&lt;br /&gt;
&lt;br /&gt;
== Wissenswertes zu Tipp-Funk Geräten: ==&lt;br /&gt;
Tipp-Funk ist die Low Cost Serie von Eltako. Verständlicher muss der Hersteller hier einige Funktionen abspecken um den Preis zu erreichen.&lt;br /&gt;
Folgendes ist deshalb zu beachten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Konfiguration / Schalter / LEDs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Geräte verfügen über keine LEDs oder Schalter. Alles wird über Taster Kommandos eingestellt, als Rückmeldung dienen Fahrbewegungen der Motoren.&lt;br /&gt;
&lt;br /&gt;
Die fabrikneuen Geräte gehen beim Anschalten in den Lernmodus, was Sie durch kurze Fahrbewegungen anzeigen.&lt;br /&gt;
Wurde schon einmal mit den Geräten gespielt kann es sein das Sie nicht in den Lernmodus gehen.&lt;br /&gt;
Deshalb beim Einlernen immer komplett resetten!&lt;br /&gt;
&lt;br /&gt;
Werden zwei oder mehr Tipp-Funk Geräte gleichzeitig eingschalten, sind beide im Lernmodus. Jedes Einlernen wird also auf beide Geräte übertragen und beide bewegen sich.&lt;br /&gt;
Deshalb immer den Lernmodus sperren!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Bidirektionale Kommunikation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Diese ist standardmäßig aus.&lt;br /&gt;
Also zuerst immer einschalten!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Verschlüsselung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Eltako Tipp-Funk TF Geräte verfügen nicht über Verschüsselung.&lt;br /&gt;
Wer dieses Feature möchte muss zum anderen Eltako Produkten greifen.&lt;br /&gt;
Aus meiner Sicht ist das fehlen von Verschlüsselung für Jalousien im normalen Haushalt aber ok.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Repeater&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Eltako Tipp-Funk TF Geräte verfügen nicht über eine Repeater Funktion.&lt;br /&gt;
Wer dieses Feature möchte muss zum anderen Eltako Produkten greifen.&lt;br /&gt;
Dieses Feature kann bei größeren Entfernungen Sinn machen, wobei hier ein einziges Gerät als Repeater evtl. schon reichen würde.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des TF61J Kurzversion ==&lt;br /&gt;
# EnOID aufschreiben&lt;br /&gt;
# Strom An/Aus&lt;br /&gt;
# Bidirektionale Kummunikation anschalten&lt;br /&gt;
# Bei mehreren TF61J pro Stromkreis -&amp;gt; Lernmodus sperren&lt;br /&gt;
# Device in FHEM anlegen&lt;br /&gt;
# Eventuell automatisch erkannte Geräte löschen&lt;br /&gt;
# Strom An/Aus&lt;br /&gt;
# Speicherinhalt komplett löschen (Auslieferzustand herstellen)&lt;br /&gt;
# Device in FHEM teachen&lt;br /&gt;
# Lernmods sperren&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des TF61J Langversion ==&lt;br /&gt;
Die Schritte sind nicht unbedingt alle nötig. Waren die TF61J jedoch schon einmal konfiguriert, ist unklar in welchem Zustand / Konfiguration sie sich befinden.&lt;br /&gt;
Dies hat bei mir zu vielen Problemen geführt. Deshalb meine Empfehlung: alle Schritte durchlaufen, dann funktioniert es sicher!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Vor dem Einbau&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die EnOID aufschreibe. Diese brauchen wir später!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Strom An/Aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Bidirektionale Kommunikation (Bestätigungs Telegramme) einschalten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der TF61J kann rückmelden was er gerade tut und uns Bestätigungstelegramme schicken. Diese Funktion ist ab Werk deaktiviert.&lt;br /&gt;
Taucht im EventMonitor von FHEM beim drücken eines mit einem TF Gerät verbunden Tasters keine Nachricht auf, ist die Bidirektionale Kommunikation entweder deaktiviert oder das Gerät zu weit vom Sender entfernt.&lt;br /&gt;
Um einzuschalten: Am örtlichen Taster 7-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 2-malig kurzen &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Bei mehreren TF61J pro Stromkreis -&amp;gt; Lermodus Sperren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Damit nicht mehrere TF gleichzeitig lernen und so z.B. bei Steuerung aus FHEM heraus gleichzeitig fahren, darf immer nur ein TF lernbereit sein.&lt;br /&gt;
Lernmodus AN für den TF der Lernen soll: Am örtlichen Taster 4-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 1-malig kurz &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
Lernmodus AUSfür den TF der nicht Lernen soll: Am örtlichen Taster 3-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 2-malig kurz &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Anlegen in FHEM&#039;&#039;&#039;&lt;br /&gt;
Jetzt legen wir das Gerät in FHEM an.&lt;br /&gt;
Hierzu geben wir einen RolloNamen ein.&lt;br /&gt;
Die EnOID haben wir vom Gerät abgeschrieben.&lt;br /&gt;
H5-3F-7F ist die EEP mit der wir definieren das es ein TF61J ist. (Wird später durch FHEM auf A5-3F-7F geändert was scheinbar so sein muss)&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;RolloName&amp;gt; EnOcean &amp;lt;EnOID&amp;gt; H5-3F-7F&lt;br /&gt;
&lt;br /&gt;
Jetzt empfehle ich noch die subDef (Die Adresse des Virtuellen Senders aus FHEM heraus) fest vorzugeben.&lt;br /&gt;
Ich hatte hier viele Probleme das plötzlich andere Rollos mit gefahren sind weil FHEM hier die DEF (EnOID) anderere Rollos eingetragen hat.&lt;br /&gt;
Vermutlich hatte ich vorher schon zuviele konfiguriert und wieder gelöscht und einiges blieb wohl im System hängen.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 {EnOcean_CheckSenderID(&amp;quot;getUsedID&amp;quot;,&amp;quot;&amp;lt;IODev&amp;gt;&amp;quot;,&amp;quot;0000000&amp;quot;)};&lt;br /&gt;
&lt;br /&gt;
schauen wir uns an, welche Sender-IDs schon vergeben sind. Hier einfach die ganz rechte nehmen und 1 dazu zählen (HEX):&lt;br /&gt;
Beispiel:&lt;br /&gt;
FFDFE101 FFDFE102 FFDFE103&lt;br /&gt;
Also nehmen wir FFDFE104&lt;br /&gt;
Sollte in dieser Liste eine EnOID eines deiner Geräte auftauchen, ist eines schon falsch konfiguriert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Eventuell automatisch erkannte Geräte löschen&#039;&#039;&#039;&lt;br /&gt;
Sind Geräte durch Strom An/Aus automatisch erkannt worden, stehen Sie z.B. unter switch als EnO_xxxxxxx device. Ich habe diese in diesem Schritt immer gelöscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7. Strom An/Aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8. TF61J Speicherinhalt komplett löschen (Auslieferzustand herstellen)&#039;&#039;&#039;&lt;br /&gt;
Sehr wichtig! Einfach machen, dann funktioniert die Konfiguration sicher!&lt;br /&gt;
Am örtlichen Taster 8-mal kurz plus 1-mal lang (&amp;gt;1 Sekunde) tippen. Der TF muss dann 1-malig kurz &#039;Ab, Halt&#039; signalisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9. Teachen&#039;&#039;&#039;&lt;br /&gt;
Jetzt müssen wir den TF61J noch vernünftig einlernen&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;RolloName&amp;gt; teach&lt;br /&gt;
&lt;br /&gt;
Der Rollladen sollte nun einmal 2 kurz als Bestätigung fahren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10. Lernmodus sperren&#039;&#039;&#039;&lt;br /&gt;
Am Ende immer den Lernmodus sperren. Sonst könnte der TF versehentlich andere Taster mitlernen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Falscher Rollladen fährt bzw. fährt zusätzlich bei Steuerung aus FHEM heraus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei Einlernen waren mehrer TF61J im Lernmodus. Alle haben den Software Taster des FHEM eingelernt.&lt;br /&gt;
-&amp;gt; Alle betroffenen Geräte neu Konfigurieren&lt;br /&gt;
&lt;br /&gt;
Die SubDef eines Gerätes ist auf eine EnOID eines anderen Gerätes eingestellt, dann fährt dieses mit.&lt;br /&gt;
-&amp;gt; SubDef wie in Punkt 5 beschrieben Auswählen und Ändern.&lt;br /&gt;
-&amp;gt; Alle betroffenen Geräte neu Konfigurieren&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Ich sehe die Kommandos des angeschlossenen Tasters in FHEM, jedoch kann ich den Rollladen aus FHEM nicht steuern.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Konfiguration hat nicht funktioniert.&lt;br /&gt;
-&amp;gt; Noch einmal von vorne anfangen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Der TF61J reagiert nicht auf Tasterkommandos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Der angeschlossene Taster hackt oder prellt. Beim Eingeben der Tasterkommandos hin hören, was das Relais macht (klack). Durch kürzeres oder längeres Drücken funktioniert es dann meistens.&lt;br /&gt;
&lt;br /&gt;
*Der TF61J ist nicht im Lernmodus. Entsperren.&lt;br /&gt;
&lt;br /&gt;
*Der TF61J hat den Lernmodus verlassen (geschieht nach 120s). Strom An/Aus.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[https://www.tipp-funk.de/bedienungsanleitungen/ Bedienungsanleitungen (Fertigungswoche beachten!)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=33970</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=33970"/>
		<updated>2020-09-30T21:22:16Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Homematic Luftfeuchtigkeits- und Tmeperatursensoren */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
== Mögliche Mappings ==&lt;br /&gt;
Die Möglichen Mappings können hier nachgelesen werden https://github.com/KhaosT/HAP-NodeJS/tree/master/src/lib/gen  insbesondere in HomeKit.ts.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
 Characteristic.Brightness = function() {&lt;br /&gt;
  Characteristic.call(this, &#039;Brightness&#039;, &#039;00000008-0000-1000-8000-0026BB765291&#039;);&lt;br /&gt;
  this.setProps({&lt;br /&gt;
    format: Characteristic.Formats.INT,&lt;br /&gt;
    unit: Characteristic.Units.PERCENTAGE,&lt;br /&gt;
    maxValue: 100,&lt;br /&gt;
    minValue: 0,&lt;br /&gt;
    minStep: 1,&lt;br /&gt;
    perms: [Characteristic.Perms.READ, Characteristic.Perms.WRITE, Characteristic.Perms.NOTIFY]&lt;br /&gt;
  });&lt;br /&gt;
  this.value = this.getDefaultValue();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Das Mapping in diesem Fall, hat den Titel Brightness.&lt;br /&gt;
&lt;br /&gt;
Die Werte können in 1er Schritten zwischen 0 und 100 liegen (max und min Value)&lt;br /&gt;
== Erstellung eines HomebridgeMappings am Beispiel &amp;quot;Feuchtesensor&amp;quot; ==&lt;br /&gt;
Zum Einstieg etwas leicht nachvollziehbares. &lt;br /&gt;
&lt;br /&gt;
Feuchtesensoren haben in der Regel ein &amp;quot;humidity&amp;quot; Reading, im Falle des Opus XT300 Bodenfeuchtesensors auch Temperatur und Batterie Level. Homekit unterstützt einen &amp;quot;HumiditySensor&amp;quot; Service. Dieser ist in homebridge-fhem nicht standardmäßig vorhanden (kann also nicht aus dem dropdown ausgewählt werden, sondern muss über das Befehlsfeld zugewiesen werden):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor genericDeviceType HumiditySensor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt werden die Readings gemappt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr meinSensor homebridgeMapping clear CurrentRelativeHumidity=humidity StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW CurrentTemperature=temperature&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;löscht default mappings - das wird in der Regel nicht notwendig sein, schadet aber nicht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CurrentRelativeHumidity&amp;lt;/code&amp;gt; ist die relevante Homekit Characteristic - wird mit dem entsprechenden Reading des Sensors gemappt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;StatusLowBattery&amp;lt;/code&amp;gt; erwartet entweder BATTERY_LEVEL_NORMAL oder _LOW. Mein Sensor liefert ok zurück, wenn alles gut ist, also wird &amp;quot;ok&amp;quot; auf _NORMAL gemappt, alles andere auf _LOW. &lt;br /&gt;
&lt;br /&gt;
Der Opus XT300 Bodenfeuchtesensors liefert auch noch die Temperatur - der HumiditySensor Service sieht das eigentlich nicht vor, daher wird die Temperatur auch nicht in der Apple &amp;quot;Home&amp;quot; App angezeigt. Bei Eve wird die Temperatur hingegen berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
== BRAVIA Fernseher ==&lt;br /&gt;
Ein Beispiel homebridgeMapping für Sony Bravia Fernseher (iOS 12.2 beta!) und genericDeviceType Television:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear&lt;br /&gt;
ConfiguredName:model&lt;br /&gt;
Active:state,values=off:INACTIVE;on:ACTIVE,cmds=ACTIVE:on;INACTIVE:off&lt;br /&gt;
RemoteKey:key,cmds=REWIND:remoteControl+Rewind;FAST_FORWARD:remoteControl+FastForward;NEXT_TRACK:remoteControl+NEXT_TRACK;PREVIOUS_TRACK:remoteControl+PREVIOUS_TRACK;ARROW_UP:remoteControl+Up;ARROW_DOWN:remoteControl+Down;ARROW_LEFT:remoteControl+Left;ARROW_RIGHT:remoteControl+Right;SELECT:remoteControl+Ok;BACK:remoteControl+RETURN;EXIT:remoteControl+Exit;PLAY_PAUSE:remoteControl+Play;INFORMATION:remoteControl+Info&lt;br /&gt;
SleepDiscoveryMode:default=ALWAYS_DISCOVERABLE&lt;br /&gt;
ClosedCaptions:default=0&lt;br /&gt;
DisplayOrder:default=Test1&lt;br /&gt;
CurrentMediaState:default=0:currentTitle&lt;br /&gt;
TargetMediaState:default=0,cmds=PLAY:remoteControl+play;PAUSE:remoteControl+pause;STOP:remoteControl+stop;&lt;br /&gt;
PictureMode:default=1&lt;br /&gt;
PowerModeSelection:default=1,cmds=0:remoteControl+options&lt;br /&gt;
ActiveIdentifier:input,default=0,values=/tv.dvbt|TV...DVB-T/:1;/HDMI.3/:2,cmds=1:input+TV+/+DVB-T;2:input+HDMI+3/ARC;3:application+Plex&lt;br /&gt;
TelevisionSpeaker#Mute=mute&lt;br /&gt;
 Active:default=ACTIVE&lt;br /&gt;
 VolumeSelector:volume,cmds=INCREMENT:VolumeUp;DECREMENT:VolumeDown&lt;br /&gt;
 VolumeControlType:default=RELATIVE_WITH_CURRENT&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(1)#Identifier:default=1&lt;br /&gt;
 ConfiguredName:default=TV&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=TUNER&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(2)#Identifier:default=2&lt;br /&gt;
 ConfiguredName:default=APPLE+TV&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=HDMI&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
InputSource(3)#Identifier:default=3&lt;br /&gt;
 ConfiguredName:default=PLEX&lt;br /&gt;
 IsConfigured:default=CONFIGURED&lt;br /&gt;
 InputSourceType:default=APPLICATION&lt;br /&gt;
 CurrentVisibilityState:default=SHOWN&lt;br /&gt;
 linkedTo=Television&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit lässt sich der Fernseher über Siri/Homekit ein- und ausschalten sowie über das appleTV Control-Center Widget steuern.&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus {{Link2Forum|Topic=48558|Message=402024|LinkText=homebridge/homekit}}&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus {{Link2Forum|Topic=48558|Message=402024|LinkText=homebridge/homekit}}&lt;br /&gt;
&lt;br /&gt;
Eine noch etwas bessere Schaltmöglichkeit bietet &#039;&#039;&#039;genericDeviceType security&#039;&#039;&#039;.&lt;br /&gt;
Das Mapping für ROOMMATE sieht wie folgt aus:&lt;br /&gt;
 attr TYPE=ROOMMATE genericDeviceType security&lt;br /&gt;
 attr TYPE=ROOMMATE homebridgeMapping SecuritySystemCurrentState=state,values=/home|awoken/:0;;absent:1;;/asleep|gotosleep/:2;;gone:3 SecuritySystemTargetState=SecuritySystemCurrentState,cmds=0:state+home;;1:state+absent;;2:state+gotosleep;;3:state+gone,delay=1&lt;br /&gt;
für GUEST:&lt;br /&gt;
 attr TYPE=GUEST genericDeviceType security&lt;br /&gt;
 attr TYPE=GUEST homebridgeMapping SecuritySystemCurrentState=state,values=/home|awoken/:0;;absent:1;;/asleep|gotosleep/:2;;none:3 SecuritySystemTargetState=SecuritySystemCurrentState,cmds=0:state+home;;1:state+absent;;2:state+gotosleep;;3:state+none,delay=1&lt;br /&gt;
&lt;br /&gt;
== Homematic Luftfeuchtigkeits- und Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - HM-WDS10-TH-O&lt;br /&gt;
 - HM-WDS40-TH-I&lt;br /&gt;
 - HM-WDS40-TH-I-2&lt;br /&gt;
&lt;br /&gt;
Achtung: Hier wird genericDeviceType &amp;quot;TemperatureSensor&amp;quot; verwendet, um eine history in EVE zu erhalten. Mit einem &amp;quot;HumiditySensor&amp;quot; funktionierte dies bei den Tests (Februar 2019) nicht.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;THSensor&amp;gt; genericDeviceType TemperatureSensor&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;THSensor&amp;gt;      CurrentRelativeHumidity=humidity&lt;br /&gt;
                      CurrentTemperature=temperature&lt;br /&gt;
                      StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
                      history:size=1024&lt;br /&gt;
&lt;br /&gt;
== Homematic SmokeDetector HM-SEC-SD und HM-SEC-SD2 ==&lt;br /&gt;
 [[Datei:Homebridge-Homematic-Smokedetector-Gen1.jpg|mini|Homebridge-Homematic-Smokedetector-Gen1 in EVE]]&lt;br /&gt;
Es sind keine Homebridge Mappings für die Rauch Meldung erforderlich.&lt;br /&gt;
&lt;br /&gt;
Allerdings ist ein Mapping für den Batterie Zustand nötig, siehe Unten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; genericDeviceType SmokeSensor&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; subType smokeDetector&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;SmokeDetector&amp;gt; homebridgeMapping StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
&lt;br /&gt;
== Homematic Heizkörperthermostat HM-CC-RT-DN ==&lt;br /&gt;
[[Datei:HM-CC-RT-DN-Eve.PNG|mini|Darstellung des HM-CC-RT-DN in der iOS App Eve]]&lt;br /&gt;
 attr &amp;lt;HMCCRTDN_Channel2_Clima&amp;gt; homebridgeMapping TargetTemperature=desired-temp::desired-temp,minValue=5,maxValue=35,minStep=0.5,nocache=1&lt;br /&gt;
                      CurrentTemperature=BU_Heizung_01_Clima:measured-temp,nocache=1&lt;br /&gt;
                      StatusLowBattery=BU_Heizung_01:battery,values=ok:BATTERY_LEVEL_NORMAL;;/^.*/:BATTERY_LEVEL_LOW&lt;br /&gt;
                      TargetHeatingCoolingState=heatingState,values=OFF:0;;HEAT:1;;COOL:2;;AUTO:3,cmds=OFF:controlManu+off;;HEAT:controlMode+boost;;AUTO:controlMode+auto;;COOL:controlManu+17.0&lt;br /&gt;
                      CurrentHeatingCoolingState=heatingState,values=OFF:0;;HEAT:1;;COOL:2;;AUTO:0,valud=OFF&lt;br /&gt;
 attr &amp;lt;HMCCRTDN_Channel2_Clima&amp;gt; siriName Robby&lt;br /&gt;
Dieses Mapping bezieht sich auf ein vorhandenes &#039;&#039;userReading&#039;&#039; mit dem Namen &amp;lt;code&amp;gt;heatingState&amp;lt;/code&amp;gt;, womit Homekit die einzelnen Status nachher unterscheidet.&lt;br /&gt;
 attr &amp;lt;HM-CC-RT-DN_Clima&amp;gt; userReadings heatingState {(ReadingsVal($NAME,&amp;quot;ValvePosition&amp;quot;,0) &amp;gt; 0 || ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;on&amp;quot;) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;controlMode&amp;quot;,&amp;quot;auto&amp;quot;) eq &amp;quot;auto&amp;quot; ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;measured-temp&amp;quot;,20) &amp;gt; ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,20)) ? &amp;quot;COOL&amp;quot; : &amp;quot;AUTO&amp;quot;}&lt;br /&gt;
Global auf alle in FHEM angelegten HM-CC-RT-DN, lässt sich mit folgendem Befehl das &#039;&#039;userReading&#039;&#039; anlegen.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,59211.msg505986.html#msg505986 Forumsthread].&lt;br /&gt;
&lt;br /&gt;
 attr TYPE=CUL_HM:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04 userReadings heatingState {(ReadingsVal($NAME,&amp;quot;ValvePosition&amp;quot;,0) &amp;gt; 0 || ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;on&amp;quot;) ? &amp;quot;HEAT&amp;quot; : ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,&amp;quot;-&amp;quot;) eq &amp;quot;off&amp;quot; ? &amp;quot;OFF&amp;quot; : ReadingsVal($NAME,&amp;quot;controlMode&amp;quot;,&amp;quot;auto&amp;quot;) eq &amp;quot;auto&amp;quot; ? &amp;quot;AUTO&amp;quot; : (ReadingsVal($NAME,&amp;quot;measured-temp&amp;quot;,20) &amp;gt; ReadingsVal($NAME,&amp;quot;desired-temp&amp;quot;,20)) ? &amp;quot;COOL&amp;quot; : &amp;quot;AUTO&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
== Homematic Wetterstation OC3 HM-WDS100-C6-O-2 ==&lt;br /&gt;
[[Datei: homebridge-wetter.jpg|mini|Wetterstation in EVE]]&lt;br /&gt;
Mit der EVE und den hier: [https://github.com/naofireblade/homebridge-weather-plus/blob/master/util/characteristics.js] beschriebenen Characteristics lässt sich eine lokale Homematic OC3 Wetterstation aus FHEM einbinden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear&lt;br /&gt;
CurrentTemperature:temperature&lt;br /&gt;
CurrentRelativeHumidity:humidity&lt;br /&gt;
49C8AE5A-A3A5-41AB-BF1F-12D5654F9F41:windSpeed,name=WINDGESCHWINDIGKEIT,format=FLOAT,unit=kmh,maxValue=250,minValue=0,minStep=1&lt;br /&gt;
46f1284c-1912-421b-82f5-eb75008b167e:windDirection,name=WINDRICHTUNG,format=UINT8,unit=ARC_DEGREE,maxValue=360,minValue=0,minStep=1&lt;br /&gt;
StatusLowBattery:battery,values=ok:BATTERY_LEVEL_NORMAL;/^.*/:BATTERY_LEVEL_LOW &lt;br /&gt;
ccc04890-565b-4376-b39a-3113341d9e0f:RegenmengeLast24Hours:state,name=REGEN_24h,format=FLOAT,unit=mm,maxValue=100,minValue=0,minStep=1 &lt;br /&gt;
10c88f40-7ec4-478c-8d5a-bd0c3cce14b7:RegenmengeLast1Hours:state,name=REGEN_1h,format=FLOAT,unit=mm,maxValue=100,minValue=0,minStep=1 &lt;br /&gt;
0000006B-0000-1000-8000-0026BB765291:brightness,name=BRIGHTNESS,format=FLOAT,unit=LUX,maxValue=10000,minValue=0,minStep=.0001 &lt;br /&gt;
cd65a9ab-85ad-494a-b2bd-2f380084134c:isRaining,name=BEDINGUNGKATEGORIE,values=0:0;1:2,format=UINT8,maxValue=3,minValue=0,minStep=1 &lt;br /&gt;
cd65a9ab-85ad-494a-b2bd-2f380084134d:isRaining,name=BEDINGUNG,format=STRING,values=0:-;/.*/:Regen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off,nocache=1 ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
== Vallox Belüftungsanlage ==&lt;br /&gt;
Die Steuerung der Lüftungsgeschwindigkeit ist nur in Prozent möglich. Die Umrechnung erfolgt im [[Vallox]] Modul.&lt;br /&gt;
Hierzu wurde das Reading &#039;&#039;FanSpeedPct&#039;&#039; hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;Vallox&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;Vallox&amp;gt; homebridgeMapping clear&lt;br /&gt;
                      model=Vallox&lt;br /&gt;
                      On=PowerState,valueOn=1,readOnly=1&lt;br /&gt;
                      RotationSpeed=FanSpeedPct,minValue=1,maxValue=100,cmd=FanSpeedPct,delay=1&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Vacuum Cleaner 1. Generation ==&lt;br /&gt;
[[Datei:XIAOMI_VACUUM_CLEANER-Gen1.jpg|mini|XIAOMI VACUUM 1. GEN in EVE]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Staubsauger mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping On=state,valueOn=Cleaning,cmdOn=start,cmdOff=charge&lt;br /&gt;
                      RotationSpeed=fan_power,minValue=0,maxValue=90,cmd=fan_power,delay=1&lt;br /&gt;
                      BatteryLevel=batteryLevel,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=battery,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=state,values=Docked:NOT_CHARGING;;Charging:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      OccupancyDetected=state,values=/Docked|Charging/:OCCUPANCY_DETECTED;;/.*/:OCCUPANCY_NOT_DETECTED&lt;br /&gt;
                      FilterLifeLevel=consumables_filter,minValue=0,maxValue=100&lt;br /&gt;
                      FilterChangeIndication=consumables_filter,values=0:CHANGE_FILTER&lt;br /&gt;
&lt;br /&gt;
== Roborock S50 (2. Generation des Xiaomi Vacuum Cleaners) ==&lt;br /&gt;
[[Datei:Roborock S50.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Staubsauger mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Mapping für den Roborook S50 beinhaltet neben den Characteristics der 1. Genration des Xiaomi Vacuum Cleaners weitere Custom Mappings. Diese werden auch auf dem Bild dargestellt. Falls das einem zu viele Informationen sind, können diese beim Einfügen einfach weggelassen oder in EVE ausgeblendet werden.&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping On=state,valueOn=Cleaning,cmdOn=start,cmdOff=charge&lt;br /&gt;
                      RotationSpeed=fan_power,minValue=0,maxValue=90,cmd=fan_power,delay=1&lt;br /&gt;
                      BatteryLevel=batteryPercent,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=batteryState,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=state,values=Docked:NOT_CHARGING;;Charging:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      OccupancyDetected=state,values=/Docked|Charging/:OCCUPANCY_DETECTED;;/.*/:OCCUPANCY_NOT_DETECTED&lt;br /&gt;
                      2af6d0d0-3691-4f0d-9c9c-c1098295b1cb=consumables_sensors,name=Reinigung+Sensoren,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      fd11b965-052e-430f-b08f-206287d8bc00=consumables_filter,name=Austausch+Filter,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      fe7a8dac-dff3-4a07-8a5e-0d6abbf0df0c=consumables_main_brush,name=Austausch+Hauptbürste,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      4f9b2a22-b764-4fc1-8cd2-99383924394c=consumables_side_brush,name=Austausch+Seitenbürste,minValue=0,maxValue=100,format=FLOAT,minStep=1,unit=%&lt;br /&gt;
                      FilterLifeLevel=consumables_filter,minValue=0,maxValue=100&lt;br /&gt;
                      FilterChangeIndication=consumables_filter,values=0:CHANGE_FILTER&lt;br /&gt;
                      4896763a-26f7-400b-9734-2ce6564ceba2=total_clean_time,name=Lebenszeitersparnis,format=FLOAT,minStep=1,unit=h&lt;br /&gt;
                      82af5fd7-50a3-4ab3-81d3-1f7903de612a=total_clean_area,name=Gereinigte+Fläche,format=FLOAT,minStep=1,unit=m²&lt;br /&gt;
                      00d2ef14-b429-4569-8af3-c342d41cf383=total_cleans,name=Reinigungsvorgänge,format=FLOAT,minStep=1&lt;br /&gt;
                      e8d1027e-b068-40d5-9efd-f161b1b52774=device_firmware,name=Firmware,format=STRING&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Fan (ältere Generationen mit Luftfeuchtigkeits- und Temperatursensor und Battery-Readings) ==&lt;br /&gt;
[[Datei:Xiaomi DC Pedestal Fan.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Ventilator mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Die ältere Generation enthält Sensoren und somit Readings für Luftfeuchtigkeit, Temperatur und auch Batteriestatus. Diese fehlen bei den neueren Generation dieses Ventilators, siehe Bilder. Da anscheinend jedes Jahr neue Generationen dieses Ventilators herausgekommen sind, ist nicht klar bis zu welcher Generation diese Sensoren enthalten waren.&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - Xiaomi DC Pedestal Fan (FHEM model fehlt, Default Hostname am Router: zhimi-fan-v3)&lt;br /&gt;
 - Liste bitte ergänzen!&lt;br /&gt;
&lt;br /&gt;
Um möglichst viele Funktionen bereitzustellen, wurden auch Characteristics von anderen DeviceTypes verwendet. Erklärung zu den Characteristics:&lt;br /&gt;
&lt;br /&gt;
 - Die Kindersicherung (LockPhysicalControls) ist in Eve über das kleine Einstellungssymbol zu finden. &lt;br /&gt;
 - Mit AudioFeedback/Audio-Bestätigung werden die Töne des Lüfters ein bzw. ausgeschaltet.&lt;br /&gt;
 - Mit NightVision/Nachtsicht werden die LEDs ein (bright) bzw. ausgeschaltet (off).&lt;br /&gt;
 - Mit Mute/Audio wird der Windmodus von Straight zu Natural geschaltet.&lt;br /&gt;
 - Mit TargetTiltAngle/Neigung kann der Schwenkwinkel justiert werden.&lt;br /&gt;
 - Mit SwingMode/Schwenken kann der Schwenkmodus ein bzw. ausgeschaltet werden.&lt;br /&gt;
 - Der Rest ist selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
homebridgeMapping:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping&lt;br /&gt;
                      clear&lt;br /&gt;
                      On:power,cmdOn=on,cmdOff=off,valueOn=on,valueOff=off&lt;br /&gt;
                      LockPhysicalControls=child_lock,values=on:CONTROL_LOCK_ENABLED;;off:CONTROL_LOCK_DISABLED,cmds=CONTROL_LOCK_ENABLED:child_lock+on;CONTROL_LOCK_DISABLED:child_lock+off&lt;br /&gt;
                      RotationSpeed=level,minValue=0,maxValue=100,cmd=level,delay=1&lt;br /&gt;
                      TargetTiltAngle=angle,minValue=30,maxValue=120,minStep=30,cmd=angle&lt;br /&gt;
                      SwingMode=angle_enable,values=on:SWING_ENABLED;;off:SWING_DISABLED,cmdOn=angle_enable+on,cmdOff=angle_enable+off&lt;br /&gt;
                      CurrentRelativeHumidity=humidity&lt;br /&gt;
                      CurrentTemperature=temperature&lt;br /&gt;
                      BatteryLevel=batteryPercent,maxValue=100,minValue=0,minStep=1&lt;br /&gt;
                      StatusLowBattery=batteryState,values=ok:BATTERY_LEVEL_NORMAL;;low:BATTERY_LEVEL_LOW&lt;br /&gt;
                      ChargingState=charging,values=complete:NOT_CHARGING;;progress:CHARGING;;/.*/:NOT_CHARGEABLE&lt;br /&gt;
                      AudioFeedback:buzzer,cmdOn=buzzer+on,cmdOff=buzzer+off,valueOn=on,valueOff=off&lt;br /&gt;
                      NightVision:led,cmdOn=led+off,cmdOff=led+bright,valueOn=off,valueOff=bright&lt;br /&gt;
                      Mute:mode,cmdOn=mode+straight,cmdOff=mode+natural,valueOn=straight,valueOff=natural&lt;br /&gt;
                      CurrentFanState:power,values=on:BLOWING_AIR;;off:INACTIVE;;/.*/:IDLE&lt;br /&gt;
&lt;br /&gt;
== Xiaomi Fan (neuere Generationen ohne Luftfeuchtigkeits- und Temperatursensor und Battery-Readings) ==&lt;br /&gt;
[[Datei:Xiaomi Standing Fan 2 bzw. 2S.png|mini]]&lt;br /&gt;
Voraussetzung zur Verwendung der Mappings, ist ein eingebundener Ventilator mit dem Modul 72_XiaomiDevice.&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,73052.0.html Forumsthread]&lt;br /&gt;
Das Modul muss manuell installiert werden.&lt;br /&gt;
&lt;br /&gt;
Den neueren Generationen dieses Ventilators fehlen Sensoren und somit Readings für Luftfeuchtigkeit, Temperatur und auch Batteriestatus. Diese sind bei der älteren Generation dieses Ventilators enthalten, siehe vorangegangenes Beispiel.&lt;br /&gt;
&lt;br /&gt;
Dieses Mapping wurde mit dem &amp;quot;2S&amp;quot; erstellt. Es sollte aber mindestens auch mit einem &amp;quot;Xiaomi Standing Fan 2&amp;quot; (ohne Akku) funktionieren, da auch der &amp;quot;Xiaomi Standing Fan 2S&amp;quot; (mit Akku) kein Reading für die Batterie bereitstellt. Ansonsten gibt es wohl auch noch Generationen zwischen dem &amp;quot;Xiaomi DC Pedestal Fan&amp;quot; und den &amp;quot;Xiaomi Standing Fan 2/2S&amp;quot;. Es ist davon auszugehen, dass dieses Beispiel genauso auch bei diesen Modellen funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Geräten wurde folgendes Mapping erstellt und somit erfolgreich getestet:&lt;br /&gt;
&lt;br /&gt;
 - 2019 Xiaomi Standing Fan 2S (FHEM model bzw. Default Hostname am Router: zhimi-fan-za4)&lt;br /&gt;
 - 2018 Xiaomi ZhiMiDCVariableFrequencyFan ZRFFS01ZM (FHEM model bzw. Default Hostname am Router: zhimi-fan-za1)&lt;br /&gt;
 - Liste bitte ergänzen!&lt;br /&gt;
&lt;br /&gt;
Um möglichst viele Funktionen bereitzustellen, wurden auch Characteristics von anderen DeviceTypes verwendet. Erklärung zu den Characteristics:&lt;br /&gt;
&lt;br /&gt;
 - Die Kindersicherung (LockPhysicalControls) ist in Eve über das kleine Einstellungssymbol zu finden. &lt;br /&gt;
 - Mit AudioFeedback/Audio-Bestätigung werden die Töne des Lüfters ein bzw. ausgeschaltet.&lt;br /&gt;
 - Mit NightVision/Nachtsicht werden die LEDs ein (bright) bzw. ausgeschaltet (off).&lt;br /&gt;
 - Mit Mute/Audio wird der Windmodus von Straight zu Natural geschaltet.&lt;br /&gt;
 - Mit TargetTiltAngle/Neigung kann der Schwenkwinkel justiert werden.&lt;br /&gt;
 - Mit SwingMode/Schwenken kann der Schwenkmodus ein bzw. ausgeschaltet werden.&lt;br /&gt;
 - Der Rest ist selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
homebridgeMapping:&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; genericDeviceType Fan&lt;br /&gt;
 attr &amp;lt;XIAOMI&amp;gt; homebridgeMapping &lt;br /&gt;
                      clear&lt;br /&gt;
                      On:power,cmdOn=on,cmdOff=off,valueOn=on,valueOff=off&lt;br /&gt;
                      LockPhysicalControls=child_lock,values=on:CONTROL_LOCK_ENABLED;;off:CONTROL_LOCK_DISABLED,cmds=CONTROL_LOCK_ENABLED:child_lock+on;CONTROL_LOCK_DISABLED:child_lock+off&lt;br /&gt;
                      RotationSpeed=level,minValue=0,maxValue=100,cmd=level,delay=1&lt;br /&gt;
                      TargetTiltAngle=angle,minValue=30,maxValue=120,minStep=30,cmd=angle&lt;br /&gt;
                      SwingMode=angle_enable,values=on:SWING_ENABLED;;off:SWING_DISABLED,cmdOn=angle_enable+on,cmdOff=angle_enable+off&lt;br /&gt;
                      AudioFeedback:buzzer,cmdOn=buzzer+on,cmdOff=buzzer+off,valueOn=on,valueOff=off&lt;br /&gt;
                      NightVision:led,cmdOn=led+off,cmdOff=led+bright,valueOn=off,valueOff=bright&lt;br /&gt;
                      Mute:mode,cmdOn=mode+straight,cmdOff=mode+natural,valueOn=straight,valueOff=natural&lt;br /&gt;
                      CurrentFanState:power,values=on:BLOWING_AIR;;off:INACTIVE;;/.*/:IDLE&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
 &lt;br /&gt;
 [[Kategorie:HOWTOS]]&lt;br /&gt;
 &lt;br /&gt;
 [[Kategorie:Sprachsteuerung]]&lt;br /&gt;
 &lt;br /&gt;
 [[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=32294</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=32294"/>
		<updated>2020-01-05T12:19:46Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Nützliche Zusatzpakete */ ENOCEAN Perl libs hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim &#039;&#039;&#039;Raspberry Pi&#039;&#039;&#039; handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].&lt;br /&gt;
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspbian Distribution.&lt;br /&gt;
&lt;br /&gt;
== Installation / Setup ==&lt;br /&gt;
=== Betriebssystem ===&lt;br /&gt;
====Vorbemerkung====&lt;br /&gt;
Raspbian ist direkt bei raspberrybi.org unter [https://www.raspberrypi.org/downloads/raspbian/ https://www.raspberrypi.org/downloads/raspbian/] herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)&lt;br /&gt;
&lt;br /&gt;
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt; ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. &lt;br /&gt;
&lt;br /&gt;
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!&lt;br /&gt;
&lt;br /&gt;
====SD-Karte vorbereiten====&lt;br /&gt;
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen Projektseite [https://sourceforge.net/projects/win32diskimager/].&lt;br /&gt;
&lt;br /&gt;
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]&lt;br /&gt;
&lt;br /&gt;
Die SD Card enthält nun zwei Partitionen/Laufwerke, das erste Laufwerk ist unter alle Betriebssystemen lesbar. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:&lt;br /&gt;
* eine leere Datei mit dem Namen ssh um den (headless) Zugriff per ssh zu ermöglichen. Hinweis: Eine spätere Aktivierung von SSH ist mit &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; (Punkt 5 &amp;quot;Interfacing Options&amp;quot;, dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.&lt;br /&gt;
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt wenn der Pi sofort mit wlan starten soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;country=DE&lt;br /&gt;
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev&lt;br /&gt;
update_config=1&lt;br /&gt;
network={&lt;br /&gt;
        ssid=&amp;quot;FRITZ!Box 7490&amp;quot;&lt;br /&gt;
        psk=&amp;quot;12345678901234567890&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* SD Karte auswerfen.&lt;br /&gt;
* SD Karte in Raspberry Pi stecken und booten.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch Monitor und Tastatur verwendet werden.&lt;br /&gt;
&lt;br /&gt;
====Anmeldung und Grundkonfiguration====&lt;br /&gt;
Mit einem Terminal Programm verbindet man sich per ssh (z.B. Windows -&amp;gt; Putty) auf den Host &amp;lt;code&amp;gt;raspberrypi&amp;lt;/code&amp;gt; und meldet sich mit User pi und Passwort raspberry an.&lt;br /&gt;
* Unbedingt Passwort ändern! -&amp;gt; Dem Sicherheitshinweis folgen und &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; eingeben.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss noch Zeitzone, Sprache und  Hostname angepasst werden. &lt;br /&gt;
Entweder Menügeführt mit &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; &lt;br /&gt;
oder per Script / Shell Befehle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# Zeitzone einstellen &amp;amp; Zeitsynchronisierung über das Internet aktivieren&lt;br /&gt;
timedatectl set-timezone Europe/Berlin&lt;br /&gt;
timedatectl set-ntp true&lt;br /&gt;
&lt;br /&gt;
# Konfigurieren lokale Sprache deutsch&lt;br /&gt;
sed -i -e &#039;s/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/&#039; /etc/locale.gen&lt;br /&gt;
locale-gen&lt;br /&gt;
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE&lt;br /&gt;
&lt;br /&gt;
# Hostname &lt;br /&gt;
hostnamectl set-hostname mymachine&lt;br /&gt;
&lt;br /&gt;
# System aktualisieren &lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
&lt;br /&gt;
#Neustart&lt;br /&gt;
reboot&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Verwendung UART für Zusatzmodule====&lt;br /&gt;
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden dort die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren&lt;br /&gt;
systemctl stop serial-getty@ttyAMA0.service&lt;br /&gt;
systemctl disable serial-getty@ttyAMA0.service&lt;br /&gt;
systemctl mask serial-getty@ttyAMA0.service&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen&lt;br /&gt;
echo &amp;quot;enable_uart=1&amp;quot; &amp;gt;&amp;gt; /boot/config.txt &lt;br /&gt;
echo &amp;quot;dtoverlay=pi3-miniuart-bt&amp;quot; &amp;gt;&amp;gt; /boot/config.txt &lt;br /&gt;
echo &amp;quot;core_freq=250&amp;quot; &amp;gt;&amp;gt; /boot/config.txt &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Um die Konfiguration abzuschließen ist ein Neustart erforderlich&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;#Neustart erforderlich &lt;br /&gt;
reboot&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Troubleshooting====&lt;br /&gt;
&#039;&#039;&#039;Kontrolle der seriellen Schnittstelle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;code&amp;gt;ls -l /dev/ttyAMA0&amp;lt;/code&amp;gt; muss folgende Ausgabe liefern.&lt;br /&gt;
  crw-rw---- 1 root dialout 204, 64 Jun  7 22:56 /dev/ttyAMA0&lt;br /&gt;
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!&lt;br /&gt;
&lt;br /&gt;
Kontrolle der Verlinkung von /dev/serial*&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;code&amp;gt;ls -l /dev/serial*&amp;lt;/code&amp;gt; muss folgende Ausgabe liefern.&lt;br /&gt;
* Bei Modellen mit BT und richtiger Konfiguration&lt;br /&gt;
  lrwxrwxrwx 1 root root 7 Jun  7 22:55 /dev/serial0 -&amp;gt; ttyAMA0&lt;br /&gt;
  lrwxrwxrwx 1 root root 5 Jun  7 22:55 /dev/serial1 -&amp;gt; ttyS0&lt;br /&gt;
* Bei den Modellen ohne BT und richtiger Konfiguration&lt;br /&gt;
  lrwxrwxrwx 1 root root 7 Jun  8 18:30 /dev/serial0 -&amp;gt; ttyAMA0&lt;br /&gt;
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kontrolle Bluetooth&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit &amp;lt;code&amp;gt;hcitool dev&amp;lt;/code&amp;gt; wird das interne BT Gerät mit MAC Adresse angezeigt. Mit &amp;lt;code&amp;gt;hcitool scan&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;hcitool lescan&amp;lt;/code&amp;gt; kann nach sichtbaren Geräten gesucht werden.&lt;br /&gt;
&lt;br /&gt;
Weitergehende Informationen zur Anpassung der Konfiguration von Raspbian sind nachzulesen auf [https://www.raspberrypi.org/documentation/configuration/ https://www.raspberrypi.org/documentation/configuration/].&lt;br /&gt;
&lt;br /&gt;
=== FHEM ===&lt;br /&gt;
Die Installation von FHEM kann nach der Raspbian-Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. &lt;br /&gt;
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. &lt;br /&gt;
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspbian! &lt;br /&gt;
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. &lt;br /&gt;
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.&lt;br /&gt;
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]&lt;br /&gt;
&lt;br /&gt;
==== Der einfache Weg zum aktuellen System ====&lt;br /&gt;
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf [http://debian.fhem.de http://debian.fhem.de]. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter &#039;&#039;The easy way: use apt-get&#039;&#039;) Aktualisierungen gab. &lt;br /&gt;
* Dieser Befehlsblock erfordert erhöhte Rechte also bitte als Erstes &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt; ausführen!&lt;br /&gt;
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/&lt;br /&gt;
wget -qO - http://debian.fhem.de/archive.key | apt-key add -&lt;br /&gt;
echo &amp;quot;deb http://debian.fhem.de/nightly/ /&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install fhem&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Das offizielle Release ====&lt;br /&gt;
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch den manuellen Weg von [https://debian.fhem.de/ https://debian.fhem.de/] wählen.&lt;br /&gt;
&lt;br /&gt;
==== Empfohlener Patch ====&lt;br /&gt;
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen &amp;quot;Patch&amp;quot; auszuführen. Sollte an dieser Stelle schon der USB Check beim automatischen Start von FHEM nach der Installation zum Problem geführt haben, hilft nach dem Patch ein einfacher &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt; des Systems. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# Den USB Check abschalten&lt;br /&gt;
/opt/fhem/fhem.pl 7072 &amp;quot;attr initialUsbCheck disable 1&amp;quot;&lt;br /&gt;
/opt/fhem/fhem.pl 7072 &amp;quot;save&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hinweis|Für neue Installationen ab featurelevel 5.9 ist telnet deaktiviert. Damit funktioniert dieser Patch nicht mehr direkt. Stattdessen sollte FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann kann man &amp;lt;code&amp;gt;attr initialUsbCheck disable 1&amp;lt;/code&amp;gt; in der Kommandozeile in FHEMWEB eingeben, &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.}}&lt;br /&gt;
&lt;br /&gt;
==== Deinstallation ====&lt;br /&gt;
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get purge fhem&lt;br /&gt;
sudo apt-get autoremove&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nützliche Zusatzpakete ===&lt;br /&gt;
Nachdem der Rpi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um FHEM grundsätzlich betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort oder sind zur Nutzung bestimmter FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. Hier eine Übersicht.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | Beschreibung&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | Paketname&lt;br /&gt;
! style=&amp;quot;width:50%&amp;quot; | Kontext&lt;br /&gt;
! style=&amp;quot;width:30%&amp;quot; | Installieren&lt;br /&gt;
|-&lt;br /&gt;
|Zeitserver&lt;br /&gt;
|ntpdate&lt;br /&gt;
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install ntpdate&lt;br /&gt;
sudo ntpdate -u de.pool.ntp.org&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Perl JSON&lt;br /&gt;
|JSON&lt;br /&gt;
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Samba-Server&lt;br /&gt;
|samba&lt;br /&gt;
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install samba cifs-utils&amp;lt;/code&amp;gt;&lt;br /&gt;
Danach muss der share definiert werden mittels&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo nano /etc/samba/smb.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Mailversand&lt;br /&gt;
|sendemail (alt: sendEmail)&lt;br /&gt;
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.&lt;br /&gt;
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install sendemail&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;sudo apt-get install sendEmail&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Wake-on-LAN&lt;br /&gt;
|etherwake&lt;br /&gt;
|Wird z.B. für das Modul WOL benötigt.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install etherwake&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Perl Telnet&lt;br /&gt;
|telnet&lt;br /&gt;
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Socat&lt;br /&gt;
|socat&lt;br /&gt;
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;system(&amp;quot;echo &#039;set lampe on&#039; | /usr/bin/socat - TCP:1.2.3.4:7072&amp;quot;);&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install socat&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Libcrypt&lt;br /&gt;
|Libcrypt&lt;br /&gt;
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install libcrypt-rijndael-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|libdatetime&lt;br /&gt;
|libdatetime&lt;br /&gt;
|Perl libdatetime, erforderlich für das Weather-Modul.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install libdatetime-format-strptime-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|EnOcean XML functions&lt;br /&gt;
|libxml simple&lt;br /&gt;
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt-get install libxml-simple-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|EnOcean Cryptographic functions&lt;br /&gt;
|libcrypt-random-source-perl&lt;br /&gt;
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo /usr/bin/perl -MCPAN -e &#039;install Crypt::Random&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
=== Netzteil ===&lt;br /&gt;
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Echtzeituhr ===&lt;br /&gt;
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.&lt;br /&gt;
&lt;br /&gt;
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die &amp;quot;alten&amp;quot; Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})&lt;br /&gt;
&lt;br /&gt;
=== Last durch Backup (während update) ===&lt;br /&gt;
Bei einen [[Update]] von FHEM durch den Befehl &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; kann durch Setzen des Attributs &amp;quot;&amp;lt;code&amp;gt;attr global backup_before_update 1&amp;lt;/code&amp;gt;&amp;quot; automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein &amp;quot;&amp;lt;code&amp;gt;attr global updateInBackground 1&amp;lt;/code&amp;gt;&amp;quot; wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). &lt;br /&gt;
&lt;br /&gt;
Alternative Möglichkeiten: &lt;br /&gt;
* Backup ausschalten und manuell durchführen &lt;br /&gt;
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren&lt;br /&gt;
&lt;br /&gt;
== Watchdog einrichten ==&lt;br /&gt;
Man kann den RPi alle halbe Stunde prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.&lt;br /&gt;
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}&lt;br /&gt;
&lt;br /&gt;
== Interne Links ==&lt;br /&gt;
* [[CUL am Raspberry Pi flashen]]&lt;br /&gt;
* [[Raspberry Pi und 1-Wire]]&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2&lt;br /&gt;
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]&lt;br /&gt;
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=32274</id>
		<title>PRESENCE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=32274"/>
		<updated>2020-01-03T07:55:00Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Konfiguration auf Shellebene */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=73_PRESENCE.pm&lt;br /&gt;
|ModOwner=Markus Bloch ({{Link2FU|117|Forum}}/[[Benutzer Diskussion:Markusbloch|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lan-ping&#039;&#039;&#039; - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.&lt;br /&gt;
* &#039;&#039;&#039;fritzbox&#039;&#039;&#039; - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)&lt;br /&gt;
* &#039;&#039;&#039; Bluetooth&#039;&#039;&#039;&lt;br /&gt;
:- &#039;&#039;&#039;local-bluetooth&#039;&#039;&#039; - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)&lt;br /&gt;
:- &#039;&#039;&#039;lan-bluetooth&#039;&#039;&#039;   - Das Überwachen von Bluetoothgeräten, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. [[:Kategorie:Raspberry Pi|Raspberry Pi]]) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.&lt;br /&gt;
* &#039;&#039;&#039;function&#039;&#039;&#039; - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)&lt;br /&gt;
* &#039;&#039;&#039;shell-script&#039;&#039;&#039; - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Ping im WLAN/LAN =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die IP-Addresse 192.168.0.30 alle 30&amp;amp;nbsp;Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status &amp;quot;present&amp;quot; (anwesend), ansonsten &amp;quot;absent&amp;quot; (abwesend).&lt;br /&gt;
&lt;br /&gt;
Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30 &#039;&#039;&#039;60&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun würde das Handy alle 60 Sekunden geprüft werden.&lt;br /&gt;
&lt;br /&gt;
Nur wenn bei einem iPhone/iPad die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.&lt;br /&gt;
&lt;br /&gt;
Sollte die Fehlermeldung &lt;br /&gt;
:&amp;lt;code&amp;gt; PRESENCE (Handy) - ping command returned with output: ping: icmp open socket: Operation not permitted &amp;lt;/code&amp;gt; &lt;br /&gt;
im Log auftauchen und lan-ping dadurch nicht funktionieren, liegt ein Berechtigungsproblem vor. Kein Grund den User fhem zu root zu machen!&lt;br /&gt;
Prüfe zu erst als User root ob die Capabilities gesetzt sind.&lt;br /&gt;
:&amp;lt;code&amp;gt;getcap /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Sollte folgendes Ergeben zu Tage fördern.&lt;br /&gt;
:&amp;lt;code&amp;gt;/bin/ping = cap_net_raw+ep&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist dem nicht so, setzen wir die benötigten Capabilities&lt;br /&gt;
:&amp;lt;code&amp;gt;setcap cap_net_raw+ep /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Mehr Informationen zum Thema Capabilities [https://manpages.debian.org/jessie/manpages-de/capabilities.7.de.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.&lt;br /&gt;
&lt;br /&gt;
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt &amp;quot;Heimnetz&amp;quot; auftaucht. &lt;br /&gt;
&lt;br /&gt;
Die erforderliche Definition:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE fritzbox iPhone-4S&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachung mittels Perl-Code =&lt;br /&gt;
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; PRESENCE function {...} [ &amp;lt;check-interval&amp;gt; [ &amp;lt;present-check-interval&amp;gt; ] ]&lt;br /&gt;
&lt;br /&gt;
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.&lt;br /&gt;
&lt;br /&gt;
== Beispiel DHCP Überwachung auf Airport Basestation ==&lt;br /&gt;
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.&lt;br /&gt;
&lt;br /&gt;
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z.&amp;amp;nbsp;B. mit: &amp;lt;code&amp;gt;cpan install use Net::SNMP&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zuerst ist folgender Code in 99_myUtils.pm einzufügen, sollte diese noch nicht vorhanden sein muss diese aus dem Template welches unter Edit Files zu finden ist erzeugt werden.&lt;br /&gt;
&#039;&#039;&#039;Achtung, das ist nicht der komplette Inhalt der 99_myUtils!&#039;&#039;&#039; Das ist nur die einzelne Routine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::SNMP;&lt;br /&gt;
sub&lt;br /&gt;
snmpCheck($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($airport,$client)= @_;&lt;br /&gt;
&lt;br /&gt;
  my $community = &amp;quot;public&amp;quot;;&lt;br /&gt;
  my $host = $airport;&lt;br /&gt;
  my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2&amp;quot;;&lt;br /&gt;
  #my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2.25.1.10.0.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my ( $session, $error ) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
    -hostname =&amp;gt; $host,&lt;br /&gt;
    -community =&amp;gt; $community,&lt;br /&gt;
    -port =&amp;gt; 161,&lt;br /&gt;
    -version =&amp;gt; 1&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if( !defined($session) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
    return &amp;quot;Can&#039;t connect to host $host.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  my @snmpoids = ();&lt;br /&gt;
&lt;br /&gt;
  my $response = $session-&amp;gt;get_next_request($oid);&lt;br /&gt;
  my @nextid = keys %$response;&lt;br /&gt;
  while ( @nextid &amp;amp;&amp;amp; $nextid[0] &amp;amp;&amp;amp; $nextid[0] =~ m/^$oid/ ) {&lt;br /&gt;
    push( @snmpoids, $nextid[0] );&lt;br /&gt;
&lt;br /&gt;
    $response = $session-&amp;gt;get_next_request( $nextid[0] );&lt;br /&gt;
    @nextid = keys %$response;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if( !defined($response = $session-&amp;gt;get_request( @snmpoids ) ) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  foreach my $value (values %$response) {&lt;br /&gt;
    return 1 if( $value eq $client )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich das Mobilgerät so überwachen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define iPhone PRESENCE function {snmpCheck(&amp;quot;10.0.1.1&amp;quot;,&amp;quot;0x44d77429f35c&amp;quot;)} 30 30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwesenheitserkennung mittels UniFi Controller ==&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung bei Geräten in Verbindung mit UniFi-Produkten funktioniert selbst dann, wenn sich die Geräte im PowerSave-Modus befinden. &lt;br /&gt;
&lt;br /&gt;
Beachte: Die Geräte werden erst ungefähr nach 5 Minuten, nachdem das Gerät das WLAN verlassen hat als disconnected angezeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE function {ReadingsVal(&amp;quot;&amp;lt;UniFi&amp;gt;&amp;quot;,&amp;quot;&amp;lt;NamedDevice&amp;gt;&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;connected&amp;quot; ? 1:0}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Events =&lt;br /&gt;
Der Vorteil gegenüber der Function-Variante ist, dass diese Variante ohne Blocking.pm-Overhead direkt ausgeführt werden kann und in &amp;quot;Echtzeit&amp;quot; abläuft (siehe {{Link2Forum|Topic=40287|Message=562823}}).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei wird &amp;lt;UniFi&amp;gt; mit dem Namen des Unifi-Devices in FHEM ersetzt, &amp;lt;NamedDevice&amp;gt; mit dem Namen des zu überwachenden Devices im Unifi-Controller ersetzt.&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Bluetooth =&lt;br /&gt;
== Vorbereitung und Informationen ==&lt;br /&gt;
=== Getestete Hardware/Software ===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie (interner BT-Controller)&lt;br /&gt;
* &#039;&#039;&#039;BT-Dongle&#039;&#039;&#039; - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano &amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt &#039;&#039;LowEnergy&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;BT-TAG&#039;&#039;&#039; - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo, GhostyuBeacon iBc41&lt;br /&gt;
&lt;br /&gt;
=== BT-Dongle am RaspberryPI installieren ===&lt;br /&gt;
Um den BT-Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am RaspberryPI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debian nachinstalliert werden.&lt;br /&gt;
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install bluetooth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach erfolgreicher Installation der Pakete sollte der RaspberryPI neu gestartet werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Reboot bitte das Log des RaspberryPI auf folgende Einträge prüfen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773748] NET: Registered protocol family 31&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773765] Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773797] Bluetooth: HCI socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773821] Bluetooth: L2CAP socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773890] Bluetooth: SCO socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.797531] usbcore: registered new interface driver btusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sobald der BT-Dongle erkannt wurde &#039;&#039;leuchtet&#039;&#039; (wenn vorhanden) auch die &#039;&#039;blaue/gelbe&#039;&#039; LED am Dongle auf.&lt;br /&gt;
&lt;br /&gt;
=== BT-Tags aktivieren ===&lt;br /&gt;
Jetzt kann der BT-Tag aktiviert werden. Bei einigen BT-Tags muss dafür die &#039;&#039;&#039;Batteriesicherung&#039;&#039;&#039; gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Ein BT-Tag wird mit folgendem Befehl auf der Konsole gesucht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hcitool lescan&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
LE Scan ...&lt;br /&gt;
7C:2F:80:A1:XA:XD (unknown)&lt;br /&gt;
7C:2F:80:A1:XA:XD Gigaset G-tag&lt;br /&gt;
7C:2F:80:A1:X4:X1 (unknown)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Übersicht über die möglichen Befehle von hcitool gibt es mit der Eingabe von:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo hcitool&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
hcitool - HCI Tool ver 5.23&lt;br /&gt;
Usage:&lt;br /&gt;
        hcitool [options] &amp;lt;command&amp;gt; [command parameters]&lt;br /&gt;
Options:&lt;br /&gt;
        --help  Display help&lt;br /&gt;
        -i dev  HCI device&lt;br /&gt;
Commands:&lt;br /&gt;
        dev     Display local devices&lt;br /&gt;
        inq     Inquire remote devices&lt;br /&gt;
        scan    Scan for remote devices&lt;br /&gt;
        name    Get name from remote device&lt;br /&gt;
        info    Get information from remote device&lt;br /&gt;
        spinq   Start periodic inquiry&lt;br /&gt;
        epinq   Exit periodic inquiry&lt;br /&gt;
        cmd     Submit arbitrary HCI commands&lt;br /&gt;
        con     Display active connections&lt;br /&gt;
        cc      Create connection to remote device&lt;br /&gt;
        dc      Disconnect from remote device&lt;br /&gt;
        sr      Switch master/slave role&lt;br /&gt;
        cpt     Change connection packet type&lt;br /&gt;
        rssi    Display connection RSSI&lt;br /&gt;
        lq      Display link quality&lt;br /&gt;
        tpl     Display transmit power level&lt;br /&gt;
        afh     Display AFH channel map&lt;br /&gt;
        lp      Set/display link policy settings&lt;br /&gt;
        lst     Set/display link supervision timeout&lt;br /&gt;
        auth    Request authentication&lt;br /&gt;
        enc     Set connection encryption&lt;br /&gt;
        key     Change connection link key&lt;br /&gt;
        clkoff  Read clock offset&lt;br /&gt;
        clock   Read local or remote clock&lt;br /&gt;
        lescan  Start LE scan&lt;br /&gt;
        lewladd Add device to LE White List&lt;br /&gt;
        lewlrm  Remove device from LE White List&lt;br /&gt;
        lewlsz  Read size of LE White List&lt;br /&gt;
        lewlclr Clear LE White list&lt;br /&gt;
        lecc    Create a LE Connection&lt;br /&gt;
        ledc    Disconnect a LE Connection&lt;br /&gt;
        lecup   LE Connection Update &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls beim SCAN kein BT-Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des RaspBerryPI notwendig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hciconfig hci0 down&lt;br /&gt;
sudo hciconfig hci0 up&lt;br /&gt;
sudo hcitool dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch den FHEM Server direkt ==&lt;br /&gt;
[[Datei:Bluetooth-Adresse-iPhone.png|thumb|Bluetooth-Adresse eines iPhones]]&lt;br /&gt;
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.&lt;br /&gt;
&lt;br /&gt;
Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.&lt;br /&gt;
&lt;br /&gt;
Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der [[Konfiguration]] benötigt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord) ==&lt;br /&gt;
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]&lt;br /&gt;
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.&lt;br /&gt;
&lt;br /&gt;
Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Programm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Unterschied presenced / lepresenced / collectord ===&lt;br /&gt;
presenced und lepresenced sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced und lepresenced ist, dass lepresenced insbesondere für [https://de.wikipedia.org/wiki/Bluetooth_Low_Energy Bluetooth-LE-Devices] ist und presenced für &amp;quot;normale&amp;quot; Bluetooth-Geräte. &lt;br /&gt;
&lt;br /&gt;
collectord wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben. Sofern alle Räume einen Empfangspegel (RSSI) ermitteln können, wird bei mehreren anwesenden Räumen der Raum mit dem besten Empfangspegel selektiert (siehe {{Link2Forum|Topic=54482}}).&lt;br /&gt;
&lt;br /&gt;
=== Installation von (le)presenced ===&lt;br /&gt;
Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritte gehen jedoch auch mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket.&lt;br /&gt;
Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeitshalber wird sie aber aufgeführt.&lt;br /&gt;
&lt;br /&gt;
===== Installation per .deb-Paket =====&lt;br /&gt;
&lt;br /&gt;
Die bevorzugte Variante ist die Installation von lepresenced durch die passenden .deb Pakete.&lt;br /&gt;
{{Randnotiz|RNText=Bei einem Upgrade einer älteren Version reicht es, das neue .deb Paket mit&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo dpkg -i lepresenced-X.XX-X.deb&amp;lt;/code&amp;gt;&lt;br /&gt;
zu aktualisieren}} &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.Variante:&#039;&#039;&#039;&lt;br /&gt;
Herunterladen der aktuellen lepresenced-0.83-3.deb (Stand August 2017) Datei über den Webbrowser &lt;br /&gt;
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/ SVN-Repository]. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Download in other formats:&lt;br /&gt;
    Original Format &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
anklicken und die Datei herunterladen.&lt;br /&gt;
Die Datei kann jetzt auf den RPi kopiert und mit folgenden Befehlen ausgeführt werden (ggf. Berechtigungen anpassen). &lt;br /&gt;
&lt;br /&gt;
Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)&lt;br /&gt;
 https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.Variante:&#039;&#039;&#039; (zu Verwenden, wenn es Probleme bei Variante 1 gibt)&lt;br /&gt;
Herunterladen aus dem fhem contrib Verzeichnis:&lt;br /&gt;
Hierzu muss das contrib auf dem aktuellen Stand sein. Dazu wird die Installation von subversion (normal bereits vorhanden) benötigt.&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install subversion&lt;br /&gt;
&lt;br /&gt;
Danach kann per &lt;br /&gt;
 sudo svn checkout https://svn.fhem.de/fhem/trunk/fhem/contrib svnrepo&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Repository auf den Pi heruntergeladen werden. Danach sollte im gewählten Verzeichnis die eingecheckten Dateien verfügbar sein.&lt;br /&gt;
 /opt/fhem/svnrepo/PRESENCE/deb  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Installation der Variante 1 oder 2 &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Egal welche Variante gewählt wurde, nun kann mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;: Das &#039;&#039;&#039;Paket&#039;&#039;&#039; hat eine ca. Größe von &#039;&#039;&#039;6,5Kb&#039;&#039;&#039;. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird.&lt;br /&gt;
Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich &amp;quot;Download in other formats&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get -f install&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Installation sollte am Ende ein [ ok ] Starting lepresenced (via systemctl): lepresenced.service. ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paketlisten werden gelesen... Fertig&lt;br /&gt;
Abhängigkeitsbaum wird aufgebaut.       &lt;br /&gt;
Statusinformationen werden eingelesen.... Fertig&lt;br /&gt;
Abhängigkeiten werden korrigiert ... Fertig&lt;br /&gt;
Die folgenden zusätzlichen Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
Die folgenden NEUEN Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.&lt;br /&gt;
1 nicht vollständig installiert oder entfernt.&lt;br /&gt;
Es müssen 157 kB an Archiven heruntergeladen werden.&lt;br /&gt;
Nach dieser Operation werden 490 kB Plattenplatz zusätzlich benutzt.&lt;br /&gt;
Möchten Sie fortfahren? [J/n]&lt;br /&gt;
Holen: 1 http://archive.raspberrypi.org/debian/ jessie/main bluez-hcidump armhf 5.23-2+rpi2 [157 kB]&lt;br /&gt;
Es wurden 157 kB in 0 s geholt (921 kB/s).&lt;br /&gt;
Vormals nicht ausgewähltes Paket bluez-hcidump wird gewählt.&lt;br /&gt;
(Lese Datenbank ... 42033 Dateien und Verzeichnisse sind derzeit installiert.)&lt;br /&gt;
Vorbereitung zum Entpacken von .../bluez-hcidump_5.23-2+rpi2_armhf.deb ...&lt;br /&gt;
Entpacken von bluez-hcidump (5.23-2+rpi2) ...&lt;br /&gt;
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...&lt;br /&gt;
bluez-hcidump (5.23-2+rpi2) wird eingerichtet ...&lt;br /&gt;
lepresenced (0.82-1) wird eingerichtet ...&lt;br /&gt;
[ ok ] Starting lepresenced (via systemctl): lepresenced.service.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.Variante:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante wird das aktuellste lepresenced Skript aus github heruntergeladen. Das bedeutet, dass jegliche Konfiguration wie automatischer Start, Berechtigungen etc. &lt;br /&gt;
manuell konfiguriert werden muss. Diese Variante eignet sich nur für diejenigen, die keine .deb-Pakete installieren wollen/können oder die genau Wissen, was sie tun!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/PRESENCE/lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur &amp;quot;Installation&amp;quot; des Skripts folgendermaßen vorgehen:&lt;br /&gt;
Unter /fhem manuell den Ordner „script“ anlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir script&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Datei lepresenced reinkopieren und ausführbar machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod +x /opt/fhem/script/lepresenced&lt;br /&gt;
sudo chgrp -cR dialout lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Skript erstmalig starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt beim Starten des Skript eine Fehlermeldung, müssen die Abhängigkeiten aufgelöst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Can&#039;t locate Net/Server/Daemonize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 / usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /opt/fhem/lepresenced line 17.&lt;br /&gt;
BEGIN failed--compilation aborted at /opt/fhem/lepresenced line 17.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um die Abhängigkeiten aufzulösen muss folgendes nachinstalliert werden und anschließend ein Reboot durchgeführt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libnet-server-*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Einrichtung eines Bluetooth-Geräts über FHEM =====&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration eines BT-Geräts in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der zum Beispiel ein G-Tag dem FHEM-Server bekannt gemacht werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden&lt;br /&gt;
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist den angegeben Port zu unterscheiden. Für presenced muss der Port 5111 genommen werden, für lepresenced der Port 5333.&#039;&#039;&#039;&lt;br /&gt;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
Diese Variante sollte eingesetzt werden, wenn nur ein Pi nach Bluetooth-Geräten sucht. Möchte man mehr als ein Gerät nutzen um zum Beispiel eine größere Fläche abzudecken so muss mit collectored gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alle Räume gemeinsam ansprechen mittels collectord ===&lt;br /&gt;
Um zwei presenced- oder lepresenced Installationen zu verbinden wird der collectord Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Presence_Collectord_Uebersicht.jpg|200px|thumb|left|Schematische Darstellung Presence und Collectord, Danke an dtavb]]&lt;br /&gt;
Auf Basis folgender Skizze wird die Einrichtung und der Betrieb der Anwesenheitserkennung und Überwachung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mit dem PRESENCE-Modul sowie dem Skript (.deb-Paket) lepresenced beschrieben. Zusätzlich wird für die Verbindung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mehrere lepresenced Instanzen der collectord verwendet.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.&lt;br /&gt;
{{NeuerTextBlock}}&lt;br /&gt;
&lt;br /&gt;
==== Aufbau ====&lt;br /&gt;
; RPi1 (Hauptinstanz): &lt;br /&gt;
: FHEM Installation&lt;br /&gt;
: presence/lepresenced Installation &lt;br /&gt;
: collectord installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
; RPi2 (Zweitsystem): &lt;br /&gt;
: FHEM installation&lt;br /&gt;
: presence/lepresenced Installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Installation per .deb-Paket ====&lt;br /&gt;
collectord wird heruntergeladen und installiert:&lt;br /&gt;
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.8.deb (Stand Januar 2018)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i collectord-1.8.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord. Weitere Einstellungen können unter /etc/default/collectord vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration auf Shellebene ==== &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo vi /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datei muss jetzt nach folgender Vorlage angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# room definition&lt;br /&gt;
#[room-name]              # name of the room&lt;br /&gt;
#address=192.168.0.10     # ip-address or hostname&lt;br /&gt;
#port=5111                # tcp port which should be used (5111 is default)&lt;br /&gt;
#presence_timeout=120     # timeout in seconds for each check when devices are present&lt;br /&gt;
#absence_timeout=20       # timeout in seconds for each check when devices are absent&lt;br /&gt;
&lt;br /&gt;
[RPi1] 			          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=127.0.0.1 	          # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaehlte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaehlte Pruefintervalle&lt;br /&gt;
&lt;br /&gt;
[RPi2]  		          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=192.168.178.127	          # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaehlte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaehlte Pruefintervalle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
* Es dürfen keine [Namen] mit Leerzeichen verwendet werden&lt;br /&gt;
* Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration in FHEM ==== &lt;br /&gt;
;RPi1&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60           &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222)&#039;&#039;&lt;br /&gt;
;RPi2&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60     &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222 - die IP-Adresse von die von RPi1)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration kann der Daemon gestartet werden.&lt;br /&gt;
Sobald das Bluetoothgerät irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort &lt;br /&gt;
an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading &amp;quot;rooms&amp;quot; des jeweiligen BT-Gerätes dargestellt.&lt;br /&gt;
&lt;br /&gt;
Zum testen sollte collectord einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectord prüfen kann, dieser steht in der Zeile &amp;lt;pre&amp;gt;created socket on 0.0.0.0 with port 5222&amp;lt;/pre&amp;gt; und man sehen kann, ob der collectord richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -vv -c /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Ausgabe sieht wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2017-04-02 17:52:55 - =================================================&lt;br /&gt;
2017-04-02 17:52:55 - started with PID 15554&lt;br /&gt;
2017-04-02 17:52:55 - reading configuration file&lt;br /&gt;
2017-04-02 17:52:55 - no config errors found&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5222&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656&lt;br /&gt;
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 2 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48662&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48664&lt;br /&gt;
2017-04-02 17:53:20 - created thread 3 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 4 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 5 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 6 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51638&lt;br /&gt;
2017-04-02 17:53:22 - created thread 7 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - created thread 8 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51640&lt;br /&gt;
2017-04-02 17:53:22 - created thread 9 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:23 - created thread 10 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:29 - new connection from 192.168.xxx.xxx:51642&lt;br /&gt;
2017-04-02 17:53:29 - created thread 11 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
2017-04-02 17:53:29 - created thread 12 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading &amp;quot;rooms&amp;quot; mit dem Wert der erkannten PRESENCE-Installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verhalten presence timeout im zusammenhang mit dem Attribut &amp;quot;absenceThreshold&amp;quot; der PRESENCE Konfiguration in FHEM&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der collectord.conf sind &amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt; für den jeweiligen Raum konfiguriert.&lt;br /&gt;
Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.&lt;br /&gt;
&lt;br /&gt;
In der PRESENCE-Definition kann man ebenfalls ein &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; setzen. Sobald sich der Zustand ändert, wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss. Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand. Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.&lt;br /&gt;
&lt;br /&gt;
Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Reading &amp;quot;room&amp;quot; bei einer PRESENCE Definition und der Zusammenhang zu collectord&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der collectord (ab Version 1.8) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das &amp;quot;room&amp;quot;-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.&lt;br /&gt;
&lt;br /&gt;
====  Automatischer Start ====&lt;br /&gt;
Wenn der collectord per .deb Paket installiert wurde, startet er automatisch bei einem Reboot mit (via systemd/init-Skript).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Collectord wird standardmäßig mit dem Port 5222 gestartet. Um diese anzupassen sind zwei Schritte notwendig:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;1.)&#039;&#039;&#039; Anpassen der /usr/bin/collectord &lt;br /&gt;
    Hier bitte den Parameter my $opt_p von 5222 auf 5XXX abändern.&lt;br /&gt;
&lt;br /&gt;
Da der collectord mittlerweile per systemd beim reboot des RPi gestarte wird muss auch diese Konfiguration auf den neuen Port angepasst werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2.)&#039;&#039;&#039; Anpassen der /etc/default/collectord&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# collectord startup defaults:&lt;br /&gt;
# The TCP port collectord will listen for incoming connections (default: 5222)&lt;br /&gt;
PORT=5111&lt;br /&gt;
# The location of the configuration file (default: /etc/collectord.conf&lt;br /&gt;
CFGFILE=/etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manuell starten als Daemon (Parameter &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;) mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batterieüberwachung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung mit dem Modul BleTagBattery ===&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=74_BleTagBattery&lt;br /&gt;
|ModOwner=mumpitzstuff&lt;br /&gt;
}}&lt;br /&gt;
Mit dem Modul BleTagBattery - können die Batteriestati aller BT-LE Devices gelesen werden.&lt;br /&gt;
Es wird das batteryLevel und battery angelegt welches als BT-LE Tags an einer PRESENCE-Installation registriert wurden.&lt;br /&gt;
&lt;br /&gt;
Vorraussetzung und Installation:&lt;br /&gt;
&lt;br /&gt;
Bluez und Gattool&lt;br /&gt;
 sudo apt-get install bluez&lt;br /&gt;
&lt;br /&gt;
Das Gattool ist in den Installationen von Bluez inbegriffen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinzufügen des githup für das Modul&lt;br /&gt;
 update add http://raw.githubusercontent.com/mumpitzstuff/fhem-BleTagBattery/master/controls_bletagbattery.txt&lt;br /&gt;
 update all&lt;br /&gt;
 restart fhem: shutdown restart&lt;br /&gt;
 BT-LE tags muss an einer PRESENCE-Installation des type &amp;quot;lan-bluetooth&amp;quot; registriert sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart von FHEM kann das Modul definiert werden:&lt;br /&gt;
 define a new device: define &amp;lt;name of device&amp;gt; BleTagBattery&lt;br /&gt;
&lt;br /&gt;
Das Modul versucht in der Standardkonfiguration alle 6 Stunden die BT-LE Devices zu erreichen und das Reading batteryLevel und battery zu aktualisieren.&lt;br /&gt;
Das Update kann auch manuell mit dem folgenden Befehl erzwungen werden&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;name of device&amp;gt; statusRequest.&lt;br /&gt;
&lt;br /&gt;
Weiter Informationen und Disskussionen können dem eigentlichen [https://forum.fhem.de/index.php?topic=68104.0 Forumsbeitrag] entnommen werden,&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (aktuell nur G-Tags) ===&lt;br /&gt;
&lt;br /&gt;
Leider überträgt der G-Tag nach der Einrichtung als Device in FHEM kein Reading mit seinem aktuellen Batteriestatus.&lt;br /&gt;
Dem wurde mit Hilfe des Forum Abhilfe geschaffen.&lt;br /&gt;
Im Folgenden wird erläutert wie die Batterieüberwachung eingerichtet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
bc - Basiscalculator [https://packages.debian.org/de/sid/bc Bc-Paket]&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install bc &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen eines Shellskript auf dem Raspberry System. &lt;br /&gt;
Die Parameter &amp;lt;&amp;lt;MAC-Adresse&amp;gt;&amp;gt; und &amp;lt;&amp;lt;TagName&amp;gt;&amp;gt; müssen durch die Werte des auszulesenden G-Tags ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
stringZ=$(sudo gatttool -b 5C:2B:80:C1:14:41 --char-read --handle=0x001b)&lt;br /&gt;
stringZ=${stringZ:33:2}&lt;br /&gt;
stringZ=$(echo &amp;quot;$stringZ&amp;quot; | tr a-f A-F)&lt;br /&gt;
decimal=$(echo &amp;quot;ibase=16; $stringZ&amp;quot; | bc)&lt;br /&gt;
perl /opt/fhem/fhem.pl 7072 &amp;quot;setreading MeinGtag Batterie $decimal&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dem Device in FHEM (hier MeinGtag) ein userReading mit dem Namen &#039;&#039;&#039;Batterie&#039;&#039;&#039; hinzufügen.&lt;br /&gt;
Das Shellskript mit folgendem Befehl starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./GtagBatterie.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist hierbei,&#039;&#039;&#039; dass Skript mit &amp;quot;./&amp;quot; und nicht mit &amp;quot;sh&amp;quot; aufzurufen. Beim Aufruf mit &amp;quot;sh GtagBatterie.sh&amp;quot; produziert es einen Fehler&lt;br /&gt;
&amp;lt;pre&amp;gt;GtagBatterie.sh: 3: GtagBatterie.sh: Bad substitution &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Reading wird auf den ausgelesenen Wert der Batterie gesetzt. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Es sollte für jeden G-Tag ein eigenes Skript abgelegt werden. Das Skript kann per crontab oder fhem Kommando (system) regelmäßig aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (alle Devices vom Typ &amp;quot;MODE=lan-bluetooth&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
Es gibt eine weitere Möglichkeit um den Batteriestatus von LE Devices abzurufen und in FHEM als Reading darzustellen.&lt;br /&gt;
Dabei wird der Batteriezustand für alle LE Devices, die bereits in FHEM konfiguriert sind und per lepresenced überwacht werden, automatisch in einem shell-Script ermittelt.&lt;br /&gt;
Näheres dazu im Forumartikel {{Link2Forum|Topic=56960|LinkText=Erweiterung: Anwesenheitserkennung/Batterieüberwachung}}.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Automatische Ermittlung aller in FHEM konfigurierten LE Devices&lt;br /&gt;
* Möglichkeit, diese Devices alternativ manuell im Script einzutragen&lt;br /&gt;
* Es werden nur Devices abgefragt, die im Status &amp;quot;present&amp;quot; sind, also mit ziemlicher Sicherheit auch verfügbar sind&lt;br /&gt;
* Ein eventuell auf dem FHEM telnet-Port gesetztes Passwort kann im Script hinterlegt werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionierendes lepresenced&#039;&#039;&#039; - siehe [[Anwesenheitserkennung#Anleitung_f.C3.BCr_ein_LE_Device_.28z.B._Gtags.2CPebbles_etc..29|Anleitung für ein LE Device (z.B. Gtags,Pebbles etc.)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;socat&#039;&#039;&#039; - TCP port forwarder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install socat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gawk&#039;&#039;&#039; - Zum extrahieren der Daten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install gawk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gatttool&#039;&#039;&#039; - Bestandteil von bluez &lt;br /&gt;
&lt;br /&gt;
gatttool ist auf den meisten Distributionen im bluez-Paket, allerdings nicht bei Opensuse. Dort muss man das Sourcepaket von bluez installieren und selbst kompilieren.&lt;br /&gt;
gatttool sollte dann nach /usr/bin oder /usr/local/bin kopiert werden,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den notwendigen Erweiterungen werden für die Ausführung von gatttool &#039;&#039;&#039;Root-Rechte benötigt&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Das Script selbst gibt es hier: [https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery lebattery]&lt;br /&gt;
&lt;br /&gt;
Am Besten unter /opt/fhem/script/lebattery speichern und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo su -&lt;br /&gt;
mkdir /opt/fhem/script&lt;br /&gt;
cd /opt/fhem/script&lt;br /&gt;
wget https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery&lt;br /&gt;
chmod 755 lebattery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Bedarf können im Script noch die folgenden 3 Parameter angepasst werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# If allowed_telnetPort is protected by a password, add the password here&lt;br /&gt;
TELNETPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
# Attribute for batterylevel in FHEM&lt;br /&gt;
ATTRIBUT=&amp;quot;batterylevel&amp;quot;&lt;br /&gt;
# Use this, if you dont want the script to determine the tags on its own&lt;br /&gt;
LETAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript wird dann unter root folgendermaßen gestartet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/fhem/script/lebattery -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe des Skripts, wenn es mit dem Verbose Parameter -v gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Beide Devices sind vom Typ NUT mini, das Device mit dem FHEM-Namen &#039;&#039;&#039;nut_Micky&#039;&#039;&#039; ist im Status &#039;&#039;&#039;absent&#039;&#039;&#039;. Das zweite Device ist im Status &#039;&#039;&#039;present&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Determining address for nut_Micky ...&lt;br /&gt;
nut_Micky is in state absent, no further action required&lt;br /&gt;
&lt;br /&gt;
Determining address for nut_Test ...&lt;br /&gt;
Fetching batterylevel for nut_Test (F3:44:04:81:54:89) ...&lt;br /&gt;
Setting batterylevel for nut_Test to 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mein crontab-Eintrag (User root) sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3 3  * * * /opt/fhem/script/lebattery -v &amp;gt;/opt/fhem/script/lebattery.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird jeden Morgen um 3 Minuten nach 3 Uhr der Zustand der Batterien aller Devices ermittelt und in FHEM abgespeichert.&amp;lt;br&amp;gt; &lt;br /&gt;
Bevor man das mit crontab macht, sollte man allerdings zunächst sicher stellen, dass es auch ohne crontab funktioniert....&lt;br /&gt;
&lt;br /&gt;
Bei Problemen kann man auch erstmal schauen, ob das mit dem gattool überhaupt funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gatttool -t &amp;lt;Typ&amp;gt; -b &amp;lt;MAC-Adresse&amp;gt; --char-read --uuid 0x2a19&lt;br /&gt;
&lt;br /&gt;
handle: 0x0017 	 value: 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In diesem Fall hat die Batterie noch 100% (hex 64).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Typ ist abhängig vom Hersteller und kann public (G-Tags) bzw. random (Nut) sein. Im Zweifelsfall beides ausprobieren.&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
==  Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags ==&lt;br /&gt;
Ein Skript zur Nutzung der Gigaset G-TAGs zur Alarmierung bei öffnen und schließen von Türen und zur Anwesenheitserkennung, um die Alarmierung zu aktivieren bzw. deaktivieren. &lt;br /&gt;
Es kann verwendet werden um die Anwesenheit von mehrern Personen im Haushalt zu erkennen. Dabei wird eingeschränkt, dass nur bestimmte Personen die Alarmierung aktivieren können ( Eltern/Kind -Beziehung ).&lt;br /&gt;
Des Weiteren werden im Beispiel die Eltern benachrichtigt wenn eins der Kinder das Haus verlässt und die Eltern nicht anwesend sind.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Namen der G-Tags in den Skripten bitte anpassen!}}&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;Notify&#039;&#039; und die &#039;&#039;RESIDENTS-Erweiterung&#039;&#039; wird ein Dummy benötigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm dummy&lt;br /&gt;
attr Alarm devStateIcon aktiv:secur_locked@red inaktiv:secur_open@lightgreen&lt;br /&gt;
attr Alarm eventMap on:aktiv off:inaktiv&lt;br /&gt;
attr Alarm setList on off&lt;br /&gt;
attr Alarm webCmd aktiv:inaktiv&lt;br /&gt;
attr Alarm room Alarm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtag.*.presence:.* {Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code für die 99_myUtils.pm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### GTAG ANWESENHEITS CHECK&lt;br /&gt;
sub Anwesenheit_check($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
&lt;br /&gt;
# gtag_rot	-	Alias Marco&lt;br /&gt;
# gtag_schwarz	-	Alias Ulli&lt;br /&gt;
# gtag_gruen	-	Alias Frida&lt;br /&gt;
# gtag_orange	-	Alias Hannah&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Alle GTAGs sind Standardmäßig Residents Roommate&lt;br /&gt;
# $RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur Gäste (Roomguest) Auskommentiert, da ich es so nicht brauche&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$NAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
my $ALIASNAME = AttrVal($ROOMMATE,&#039;alias&#039;,$ROOMMATE); # ALIAS des Roommates auslesen&lt;br /&gt;
&lt;br /&gt;
my $GTAG1 = Value(&#039;gtag_rot&#039;); # ELTERN&lt;br /&gt;
my $GTAG2 = Value(&#039;gtag_schwarz&#039;); # ELTERN&lt;br /&gt;
&lt;br /&gt;
my $STATUS = &amp;quot;wahrscheinlich gerade los&amp;quot;;&lt;br /&gt;
$STATUS = &amp;quot;anwesend&amp;quot; if ($EVENT eq &amp;quot;present&amp;quot;); # Status: anwesend&lt;br /&gt;
$STATUS = &amp;quot;unterwegs&amp;quot; if ($EVENT eq &amp;quot;absent&amp;quot;); # Status: unterwegs&lt;br /&gt;
&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME ist $STATUS.&amp;quot;; # LOG Eintrag erzeugen&lt;br /&gt;
&lt;br /&gt;
if (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME ist da...&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME ist da...&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_rot&amp;quot; xor $NAME eq &amp;quot;gtag_schwarz&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG INAKTIV: $ALIASNAME ist da...; set Alarm inaktiv&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG INAKTIV&#039; &#039;$ALIASNAME ist da...&#039;; set Alarm inaktiv&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039;&amp;quot;); # Pushover&lt;br /&gt;
 } 		&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;inaktiv&amp;quot;) &amp;amp;&amp;amp; ($GTAG1 eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; $GTAG2 eq &amp;quot;absent&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set Alarm aktiv; set teleBot send ALARMIERUNG AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Alarm aktiv; set Infopush msg &#039;ALARMIERUNG AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039; &#039;&#039; 0 &#039;&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Integration des RESIDENTS-MODUL ===&lt;br /&gt;
&lt;br /&gt;
Der hier beschriebene Code erweitert die Funktionen unter dem Punkt 5.93.&lt;br /&gt;
Das Notify muss daher mit der folgenden Zeile erweitert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_AnwesenheitCheck notify gtag.*.presence:.* { Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;), Anwesenheit_check_resi(&amp;quot;$NAME&amp;quot;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die RESIDENTS Funktion nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### RESIDENTS&lt;br /&gt;
sub Anwesenheit_check_resi($) {&lt;br /&gt;
my ($NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME); # ALIASNAME des GTAGs auslesen&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Als Standard sind alle GTAGs Roommates&lt;br /&gt;
$RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur GTAG Namen der Gäste (Roomguest)&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$ALIASNAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
&lt;br /&gt;
if (ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;absent&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE absent&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
 elsif(ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;present&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE home&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Fenster/Tür. -Kontakt Überwachung ===&lt;br /&gt;
&lt;br /&gt;
Erweiterung für die Überwachung von  Fenster/Tür. -Kontakten. Dazu sind zwei weitere Notifys notwendig die auf die Trigger der Kontakte regagieren&lt;br /&gt;
und so eine weitere Funktion in der 99_myUtils.pm ansprechen. Die Notifys triggern auf Kontakte die mit dem Namen Kontakt* beginnen.&lt;br /&gt;
Sollten die eigenen Fenster/Tür. -Kontakt anderen Namen besitzen, müssen die Skripte dementsprechend angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Kontaktmeldung notify Kontakt.*:contact:.* {Kontakt_Meldung(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Sabotagealarm notify Kontakt.*.sabotageError:.on {Kontakt_Sabotage(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die TÜRKONTAKTE-Meldung nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### TÜRKONTAKTE-Meldung/Zustand&lt;br /&gt;
sub Kontakt_Meldung($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME wurde $EVENT&amp;quot;;&lt;br /&gt;
if (ReadingsVal(&amp;quot;Alarm&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;on&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
fhem(&amp;quot;set teleBot send $ALIASNAME wurde $EVENT&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;$ALIASNAME&#039; &#039;$ALIASNAME wurde $EVENT&#039;&amp;quot;); # Nachricht über Pushover&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### TÜRKONTAKTE-Sabotagealarm&lt;br /&gt;
&lt;br /&gt;
sub Kontakt_Sabotage($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME meldet Sabotagealarm&amp;quot;;&lt;br /&gt;
fhem(&amp;quot;set teleBot send Alarm: $ALIASNAME meldet Sabotagealarm&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;Alarmanlage&#039; &#039;$ALIASNAME meldet Sabotagealarm&#039; &#039;&#039; 2 &#039; &#039; 60 600 &amp;quot;); # Nachricht über Pushover&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zur Benutzung / Fehlerhandling ===&lt;br /&gt;
&lt;br /&gt;
Der Alarm dummy hat den Zustand on:off.  Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert.&lt;br /&gt;
Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden.&lt;br /&gt;
Die Benachrichtigung kann aktuell per &#039;&#039;[[TelegramBot|Telegram]]&#039;&#039; sowie &#039;&#039;Pushover&#039;&#039; (&#039;&#039;&#039;Achtung mit zweiterem sind Abokosten verbunden!&#039;&#039;&#039;) realisiert werden.&lt;br /&gt;
Diskussion zum Thema im Forum unter: {{Link2Forum|Topic=64080}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Problemlösungen =&lt;br /&gt;
Falls es &#039;&#039;&#039;Probleme beim Starten des Skripts&#039;&#039;&#039; gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | grep lepresenced&lt;br /&gt;
sudo kill &amp;lt;pid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debuglevel lepresenced setzen:&lt;br /&gt;
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}&lt;br /&gt;
&lt;br /&gt;
Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, das Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden ist, durch den nötigen LOG-Eintrag ersetzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur das wichtigste Loggen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_WARNING&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Keinerlei LOG-Einträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_EMERG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;Problemen mit der Batterieüberwachung&#039;&#039;&#039; der Tags kann die Pi Firmware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden.&lt;br /&gt;
Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:&lt;br /&gt;
&amp;lt;pre&amp;gt;connect: Connection refused (111)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo rpi-update 8521fd34c8f66b6d109acce943f6e25ec93ec005&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehr dazu unter: {{Link2Forum|Topic=56960|Message=589165}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das BT-Device ist ständig &amp;quot;absent&amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Mögliche Lösung kann sein, das Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivitäten.&lt;br /&gt;
Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install bluez-hcidump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehler in Logdateien /var/log/syslog und /var/log/kernel&#039;&#039;&#039;&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634211] bt_err_ratelimited: 1 callbacks suppressed&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634231] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:12 raspberrypi kernel: [ 4906.647350] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.532081] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.655564] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene Logs geschrieben. Darunter maßgeblich &amp;quot;syslog&amp;quot; und &amp;quot;kern.log&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend):&lt;br /&gt;
Unterbinden der Einträge durch Anlage eines blocklist Eintrag:&lt;br /&gt;
&lt;br /&gt;
 1. Unter &amp;quot;/etc/rsyslog.d&amp;quot; eine Datei erzeugen mit dem Namen &amp;quot;01-blocklist.conf&amp;quot;&lt;br /&gt;
 2. Inhalt: (Die Ausdrücke in den &amp;quot;&amp;quot; sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die untenstehenden&amp;quot;)&lt;br /&gt;
    :msg,contains,&amp;quot;Bluetooth: hci0 advertising data length corrected&amp;quot; stop&lt;br /&gt;
    :msg,contains,&amp;quot;bt_err_ratelimited:&amp;quot; stop&lt;br /&gt;
 3. Dienst neu starten &amp;quot;sudo service rsyslog restart&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Weiter Infos werden im offiziellen Thema {{Link2Forum|Topic=28753|Message=499184|LinkText=hier}} diskutiert.&lt;br /&gt;
&lt;br /&gt;
Seit Version 0.82 kann es beim Start zu folgenden Meldungen im Log kommen. &lt;br /&gt;
 Sep 06 16:13:45 raspberrypi systemd[1]: Started lepresenced.&lt;br /&gt;
 Sep 06 16:13:45 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: Received &#039;Set scan parameters failed: Input/output error&#039;, ...tting...&lt;br /&gt;
 Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...&lt;br /&gt;
&lt;br /&gt;
Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst, indem es sich resettet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moderne iPhones und Android Geräte wechseln in den Schlaf-Modus&#039;&#039;&#039;, um Energie zu sparen. Somit sind die Geräte zur Anwesenheitserkennung nicht per Ping zu erreichen.&lt;br /&gt;
Durch das Programm hping3, lassen sich zyklisch Pakete an die Geräte senden, um sie wieder &amp;quot;aufzuwecken&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mehr im Forum [https://forum.fhem.de/index.php/topic,76342.0.html]&lt;br /&gt;
&lt;br /&gt;
= Versionsänderungen lepresenced =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--Version 0.81 (BasisVersion)&lt;br /&gt;
--Version 0.82 (stable  08/2017)&lt;br /&gt;
  -Neue Kommandozeilenoption &amp;quot;--debug&amp;quot;: Startet lepresenced im Vordergrund und gibt ausführliche Debug-Informationen auf STDOUT aus.&lt;br /&gt;
  -Sanity Check: lepresenced prüft beim Starten die Verfügbarkeit von hciconfig, hcitool und hcidump.&lt;br /&gt;
  -Model: lepresenced übermittelt das Reading model nun als lan-lepresenced. Das erlaubt die Erkennung von lepresenced in der FHEM-Statistik (sofern aktiviert).&lt;br /&gt;
--Version 0.83 (stable  09/2017)&lt;br /&gt;
  - Behebung von Systemstart Fehlern&lt;br /&gt;
  - Weitere Debug-Möglichkeiten. U. a. wird nun mitgezählt, ob hcitool lescan (&amp;quot;legacy&amp;quot;) und hcidump eine identische Zahl an Beacons empfangen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ansprechpartner =&lt;br /&gt;
# {{Link2FU|117|markusbloch }} (Markus) für das PRESENCE-Modul und collectord&lt;br /&gt;
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced &lt;br /&gt;
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anwesenheitserkennung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=31977</id>
		<title>AutoShuttersControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=31977"/>
		<updated>2019-12-15T07:05:12Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* BlockingTime */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Rollläden&lt;br /&gt;
|ModCategory=Automatisierung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=73_AutoShuttersControl.pm&lt;br /&gt;
|ModOwner=CoolTux ({{Link2FU|13684|Forum}}/[[Benutzer Diskussion:CoolTux|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Mit [[AutoShuttersControl]] oder kurz ASC können typische Aufgabenstellungen im Zusammenhang mit Rollläden u.ä. automatisiert werden, wie zum Beispiel das Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang oder das Anfahren von Lüftungspositionen beim Öffnen des zugehörigen Fensters. &lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
{{Hinweis|Das Modul befindet sich derzeit noch in der Entwicklung; der jeweils aktuelle Stand ist  diesem {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread im Forum&amp;quot;}} zu entnehmen.}}&lt;br /&gt;
Zur Nutzung des Moduls sollten folgende andere FHEM-Devices vorhanden sein:&lt;br /&gt;
* Rollläden&lt;br /&gt;
* Fensterkontakte und &lt;br /&gt;
* Bewohnerstatus auf Basis von Residents/Roomates in englisch. Ersatzweise andere Devices, z.B. Dummys, welche als &#039;&#039;state&#039;&#039; &#039;&#039;home&#039;&#039;, &#039;&#039;asleep&#039;&#039;, &#039;&#039;gotosleep&#039;&#039; und &#039;&#039;awoken&#039;&#039; setzen sowie ein Reading &#039;&#039;lastState&#039;&#039;.&lt;br /&gt;
* Optional:&lt;br /&gt;
** Ein Helligkeitssensor (Steuerung nach Helligkeit und Beschattung)&lt;br /&gt;
** Ein Device zur Bestimmung des Sonnenstands (nur für Beschattung). Unterstützt werden derzeit [[Modul Astro|Astro]] und [[Twilight]]&amp;lt;ref&amp;gt;Dabei müssen ggf. in [[Global|global]] auch Angaben zu &#039;&#039;longitude&#039;&#039; und &#039;&#039;latitude&#039;&#039; vorhanden sein&amp;lt;/ref&amp;gt;. &lt;br /&gt;
** Wenn Feiertage berücksichtigt werden sollen: Ein oder mehrere {{Link2CmdRef|Anker=holiday2we|Lang=en|Label=holiday2we}}-Angaben in [[Global|global]] samt entsprechender [[Wochenende, Feiertage und Schulferien#Feiertage mittels holiday-Datei|holiday]]-Dateien&amp;lt;ref&amp;gt;Es kann auch z.B. ein Dummy-Device verwendet werden, dieses sollte dann aber neben dem eigentlichen Feiertags-&#039;&#039;state&#039;&#039; auch in einem Reading &#039;&#039;tomorrow&#039;&#039; Angaben zu anstehenden Feiertagen enthalten.&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;Bitte verfahren Sie entsprechend, wenn Urlaubs- oder Ferientage wie Feiertage behandelt werden sollen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Moduls bzw. dessen Funktionalität erfolgt in mehreren Schritten:&lt;br /&gt;
* Definition des ASC-Devices&lt;br /&gt;
* Einstellung zentraler Vorgaben am ASC-Device&lt;br /&gt;
* Markieren der zukünftig zu steuernden Rollladen-Devices&lt;br /&gt;
* Einbinden der Rollladen-Devices in das ASC-Device&lt;br /&gt;
* Einstellen der individuellen Vorgaben je Rollladen (am Rollladen-Device)&lt;br /&gt;
Dabei geht man am einfachsten schrittweise vor und erweitert die Funktionalität nach und nach um die gewünschten Funktionen. Dann benötigt man jeweils nur einen kleinen Teil der vielen per Attribut einstellbaren Optionen, und kann die Auswirkungen der jeweiligen Änderung besser nachvollziehen. &lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
{{Hinweis|ASC kann auch verwendet werden, um lediglich Teilaufgaben der Rollladensteuerung zu erfüllen, also z.B. nur das morgendliche Öffnen der Rollläden. Allerdings geht dabei ein erheblicher Teil des Komforts verloren, der dadurch entsteht, dass die Steuerung innerhalb der vollintegrierten Lösung jeweils nachvollzieht, aus welchem Grund eine Fahrt erfolgt war und dies ggf. bei der nächsten Aktion berücksichtigt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Zunächst sollten die in den [[#Basics|Basics]] beschriebenen Geräte vorhanden und funktionsfähig sein. &lt;br /&gt;
&lt;br /&gt;
=== Define des ASC-Devices ===&lt;br /&gt;
Es genügt ein einfaches define ohne weitere Parameter.&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt neben der Anlage des Devices selbst auch, dass als weiteres globales Attribut &#039;&#039;ASC&#039;&#039; verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung zentraler Vorgaben ===&lt;br /&gt;
Es stehen am ASC-Device einige Attribute zur Verfügung, über die sich das Verhalten des ASC-Devices insgesamt steuern lässt, z.B. zur Vermeidung von morgendlichen oder abendlichen Fahrten sowie bei Gefahr von Schäden an den Rollläden durch Frost oder zur Reaktion auf Fensterkontakte. Details sind der Commandref zu entnehmen.&lt;br /&gt;
Diese Attribute können auch nachträglich noch geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Markieren zu steuernder Rollladen-Devices ===&lt;br /&gt;
Um einen oder mehrere Rollläden durch das ASC-Device zu steuern, wird für jeden Rollladen jeweils das neue globale Attribut &#039;&#039;ASC&#039;&#039; gesetzt. Der Wert ist mit 1 oder 2 festzulegen, wobei &#039;&#039;&#039;1&#039;&#039;&#039; bedeutet, dass &lt;br /&gt;
* die Offen-Position kleiner ist als die Geschlossen-Position, also typischerweise 0 &#039;&#039;offen&#039;&#039; bedeutet und 100 für &#039;&#039;geschlossen&#039;&#039; steht&lt;br /&gt;
* eine bestimmte Position mit &#039;&#039;&#039;position&#039;&#039;&#039; angefahren wird, also z.B. &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; position 70&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dies ist z.B. die  passende Wahl für ROLLO-Devices&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;2&#039;&#039;&#039; steht für ein umgekehrtes Verhalten und den Befehlsteil &#039;&#039;pct&#039;&#039;, also &#039;&#039;offen&#039;&#039; für &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; pct 100&amp;lt;/code&amp;gt;. Typischer Vertreter dieses Typs sind HomeMatic (CUL_HM-) Geräte oder die Shelly2-Aktoren.&lt;br /&gt;
&lt;br /&gt;
Aus dieser Vorgabe leitet das Modul dann jeweils bestimmte Voreinstellungen (&#039;&#039;defaults&#039;&#039;) für den Rolladen ab, ohne dass die betreffenden, dafür vorgesehenen Attribute ausdrücklich gesetzt werden müssen. Es genügt daher, nur jeweils die Einstellungen zu verändern, die anders gewünscht werden oder für den Rollladenaktortyp anders sein müssen (z.B. &#039;&#039;dim 99&#039;&#039; für vollständiges Öffnen eines ZWave-Aktors).&lt;br /&gt;
{{Hinweis|Das Vorstehende gilt jeweils für den nicht-invertierten Modus! Wer z.B. ein HomeMatic-Gerät mit &#039;&#039;levelinverse&#039;&#039; betreibt, sollte &#039;&#039;ASC&#039;&#039; auf &amp;quot;1&amp;quot; setzen usw.. Maßgeblich ist letztlich nur die Frage, ob die Offen-Positionsangabe nummerisch kleiner oder größer als die Geschlossen-Positionsangabe ist; die konkreten Zahlenwerte spielen dabei keine Rolle, die Angabe &#039;&#039;position&#039;&#039; oder &#039;&#039;pct&#039;&#039; kann auch später über ein weiteres Attribut passend eingestellt werden.}}&lt;br /&gt;
&lt;br /&gt;
=== Einbinden in das ASC-Device ===&lt;br /&gt;
Nachdem man das obige Attribut bei einem oder mehreren Rollladen-Devices gesetzt hat, kann mit &lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; scanForShutters&amp;lt;/code&amp;gt; ein Suchlauf gestartet werden, mit dem dann diese Rollläden durch das Modul gefunden und in die Steuerungslogik eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellen der individuellen Vorgaben ===&lt;br /&gt;
Nach der Einbindung sind an den Rollladen-Devices weitere Attribute verfügbar, mit denen die für den jeweiligen Rollladen geltenden Einstellungen vorgenommen werden können. &lt;br /&gt;
Die Beschreibung der Attribute ist in der commandref enthalten.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
===Readings im ASC-Device selbst ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|..._nextAstroTimeEvent || ||Uhrzeit des nächsten Astro-Events, Sonnenauf- oder Sonnenuntergang oder feste Zeit pro Rollonamen &lt;br /&gt;
|-&lt;br /&gt;
|..._lastPosValue || ||zuletzt abgesetzter Fahrbefehl pro Rollonamen&lt;br /&gt;
|-&lt;br /&gt;
|..._lastDelayPosValue || ||zuletzt abgesetzter Fahrbefehl, welcher beim nächsten zulässigen Event ausgeführt wird&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off || aktiviert den globalen Partymodus. Alle Rollläden, welche das Attribut &#039;&#039;AutoShuttersControl_Partymode&#039;&#039; bei sich auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, welcher durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, wird erst beim off-setzen (set &amp;lt;ASC-Device&amp;gt; partyMode off) ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|lockOut || on, off ||für das Aktivieren des Aussperrschutzes gemäß des entsprechenden Attributs &#039;&#039;AutoShuttersControl_lock-out&#039;&#039; im jeweiligen Rolladen (siehe Beschreibung bei den Attributen für die Rolladendevices)&lt;br /&gt;
|-&lt;br /&gt;
|room_... || ||Auflistung aller Rollläden, welche in den jeweiligen Räumen gefunden wurden, Bsp.: room_Schlafzimmer,Terrasse&lt;br /&gt;
|-&lt;br /&gt;
|state || ||Status des &amp;lt;ASC-Device&amp;gt; active, enabled, disabled&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday|| on,off ||legt fest, ob das Rolladendevice das Attribut &#039;&#039;AutoShuttersControl_Time_Up_WE_Holiday&#039;&#039; beachtet oder nicht&lt;br /&gt;
|-&lt;br /&gt;
|userAttrList || rolled out ||Status der UserAttribute, welche an die Rollläden gesendet werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings in den Rolllädendevices ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveUp ||Sonnenaufgangszeit für das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveDown ||Sonnenuntergangszeit für das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersLastDrive ||Grund des letzten Fahrens vom Rolladen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==set- und get-Befehle für das ASC-Device==&lt;br /&gt;
&lt;br /&gt;
=== set-Anweisungen ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Beschreibung  &lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off ||aktiviert den globalen Partymodus. Siehe Reading &#039;&#039;partyMode&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|lockOut ||on, off ||aktiviert den globalen Aussperrschutz. Siehe Reading &#039;&#039;lockOut&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|renewSetSunriseSunsetTimer || || erneuert bei allen Rollläden die Zeiten für Sunset und Sunrise und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|scanForShutters || ||sucht alle FHEM Devices mit dem Attribut &#039;&#039;AutoShuttersControl&#039;&#039; &#039;&#039;1&#039;&#039; oder &#039;&#039;2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday || on,off ||aktiviert/deaktiviert die Beachtung des Attributes &#039;&#039;AutoShuttersControl_Time_Up_WE_Holiday&#039;&#039; für Rollladen-Devices&lt;br /&gt;
|-&lt;br /&gt;
|createNewNotifyDev || ||Legt die interne Struktur für NOTIFYDEV neu an&lt;br /&gt;
|-&lt;br /&gt;
|selfDefence ||on, off||aktiviert/deaktiviert den Selbstschutz: wenn das Residents-Device &#039;&#039;absent&#039;&#039; meldet, &#039;&#039;selfDefence&#039;&#039; aktiv ist und ein Fenster im Haus noch offen steht, wird an diesem Fenster das Rollo runtergefahren&lt;br /&gt;
|-&lt;br /&gt;
|wiggle ||||bewegt einen Rollladen oder alle Rollläden (für Abschreckungszwecke bei der Alarmierung) um &#039;&#039;ASC_WiggleValue&#039;&#039;-%, und nach 1 Minute wieder zurück zur Ursprungsposition&lt;br /&gt;
|-&lt;br /&gt;
|||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get-Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| showShuttersInformations ||zeigt eine Übersicht der Automatik-Fahrzeiten&lt;br /&gt;
|-&lt;br /&gt;
| showNotifyDevsInformations ||zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Dient zur Kontrolle&lt;br /&gt;
|}&lt;br /&gt;
== Attribute ==&lt;br /&gt;
{{Hinweis|Die Attributnamen haben sich teilweise geändert, nachfolgend ist noch ein Stand vor Modulversion 0.6.5.x wiedergegeben. Die aktuellen Benennungen sind der Commandref zu entnehmen.}}&lt;br /&gt;
{{Hinweis|In der commandref findet sich häufig die Schreibweise &amp;lt;code&amp;gt;ASC_BrightnessSensor Sensorname[:brightness [400:800]]&amp;lt;/code&amp;gt;. Dabei sind die Angaben in den eckigen Klammern optional. Dies müssen also nicht angegeben werden, stattdessen verwendet das Modul dann Standardwerte (siehe cref), die in der cref zu findenden Angaben entsprechen dabei den defaults. Werden Werte angegeben, sind die eckigen Klammern &#039;&#039;&#039;wegzulassen&#039;&#039;&#039;! Beispiel: &amp;lt;code&amp;gt;ASC_BrightnessSensor hm_motion_1 70:100&amp;lt;/code&amp;gt; würde das brightness-Reading des Sensors hm_motion_1 verwenden und einen morgendlichen Schwellenwert von 70 bzw. 100 für abends.}}&lt;br /&gt;
===Attribute direkt am ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_antifreezeTemp || || ||Temperatur, ab welcher der Frostschutz greift und das Rollo nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening ||aktuell REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || || (in genau dieser Schreibweise)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || || || Höhe über Horizont, wenn beim Attribut &#039;&#039;AutoShuttersControl_autoAstroModeEvening&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning ||aktuell REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||(in genau dieser Schreibweise)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;AutoShuttersControl_autoAstroModeMorning&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlComfort ||on, off || ||aktiviert die Komfortfunktion. Bedeutet, dass ein Rollladen mit einem threestate (Drehgriff-) Sensor am Fenster beim Öffnen in die &amp;quot;Komfortposition&amp;quot; fährt. Diese wird beim Rollladendevice über das Attribut &#039;&#039;AutoShuttersControl_Pos_after_ComfortOpen&#039;&#039; eingestellt.&lt;br /&gt;
|- &lt;br /&gt;
|ASC_autoShuttersControlEvening ||on, off || ||ob Abends die Rollläden automatisch zeitgesteuert werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlMorning ||on, off || ||ob Morgens die Rollläden automatisch zeitgesteuert werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_temperatureReading || || ||Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_temperatureSensor || || ||Device für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_timeUpHolidayDevice || || ||Device zur Urlaubserkennung oder Sonstiges / muss &#039;&#039;0&#039;&#039; oder &#039;&#039;1&#039;&#039; im Reading &#039;&#039;state&#039;&#039; beinhalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDevice|| || ||Devicenamen des Residents-Device der obersten Ebene&lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDeviceReading|| || ||Status Reading des Residents-Device der obersten Ebene&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessMinVal|| || ||minimaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessMaxVal || || ||maximaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorDevice || || ||Device, welches bei Regen getriggert wird&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorReading || || ||das ensprechende Reading zum Regendevice&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorShuttersClosedPos || || ||Position in pct, welche der Rollladen bei Regen anfahren soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_shuttersDriveOffset  || || ||maximale zufällige Verzögerung in Sekunden bei der Berechnung der Fahrzeiten, &#039;&#039;0&#039;&#039; bedeutet keine Verzögerung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_twilightDevice || || ||Device, welches Informationen zum Sonnenstand liefert, wird unter anderem für die Beschattung verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_expert || || ||bei &#039;&#039;1&#039;&#039; werden erweiterte Informationen bezüglich des NotifyDevs unter &#039;&#039;set&#039;&#039; und &#039;&#039;get&#039;&#039; angezeigt&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Attribute in den Rolllädendevices===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC || 0, 1, 2|| ||0 = &amp;quot;kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles&amp;quot;,1 = &amp;quot;Inverse oder Rollo - Bsp.: Rollo Oben 0, Rollo Unten 100 und der Befehl zum prozentualen Fahren ist position&amp;quot;,2 = &amp;quot;Homematic Style - Bsp.: Rollo Oben 100, Rollo Unten 0 und der Befehl zum prozentualen Fahren ist pct&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze || soft, am, pm, hard, off|| ||Frostschutz, wenn &#039;&#039;soft&#039;&#039; fährt der Rollladen in die &#039;&#039;ASC_Antifreeze_Pos&#039;&#039;, bei &#039;&#039;hard/am/pm&#039;&#039; wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze_Pos || || ||Position, die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeEvening ||REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeEveningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;ASC_autoAstroModeEvening&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeMorning ||REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeMorningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;ASC_autoAstroModeMorning&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Closed_Pos || || ||in 10er Schritten von 0 bis 100,default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Down || astro, time, brightness || ||bei &#039;&#039;astro&#039;&#039; wird Sonnenuntergang berechnet, bei &#039;&#039;time&#039;&#039; wird der Wert aus &#039;&#039;ASC_Time_Down_Early&#039;&#039; als Fahrzeit verwendet und bei &#039;&#039;brightness&#039;&#039; muss &#039;&#039;ASC_Time_Down_Early&#039;&#039; und &#039;&#039;ASC_Time_Down_Late&#039;&#039; korrekt gesetzt werden. Der Timer läuft dann nach &#039;&#039;ASC_Time_Down_Late&#039;&#039;-Zeit,es wird aber in der Zeit zwischen &#039;&#039;ASC_Time_Down_Early&#039;&#039; und &#039;&#039;ASC_Time_Down_Late&#039;&#039; geschaut, ob die als Attribut im Moduldevice hinterlegte &#039;&#039;ASC_brightnessMinVal&#039;&#039; erreicht wurde. Wenn ja, wird der Rolladen runter gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Down ||always, home, absent, off || ||wann darf die Automatik herunterfahren. immer, niemals oder bei Abwesenheit des Roommate (ist kein Roommate und &#039;&#039;absent&#039;&#039; eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Up ||always, home, absent, off || ||wann darf die Automatik hochfahren. immer, niemals oder bei Abwesenheit des Roommate (ist kein Roommate und &#039;&#039;absent&#039;&#039; eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_Offset || || ||maximale zufällige Verzögerung in Sekunden bei der Berechnung der Fahrzeiten, &#039;&#039;0&#039;&#039; bedeutet sofort, &#039;&#039;-1&#039;&#039; bedeutet, dass das gleichwertige Attribut aus dem ASC-Device ausgewertet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Open_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Partymode || on, off || ||schaltet den Partymodus an oder aus. Wird dann am ASC Device &#039;&#039;set &amp;lt;ASC-DEVICE&amp;gt; partyMode on&#039;&#039; geschaltet, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf &#039;&#039;on&#039;&#039; haben, zwischengespeichert und erst später ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_Reading || || ||Name des Readings, welches die Position des Rollladen in Prozent angibt. Wird bei unbekannten Device-Typen auch als &#039;&#039;set&#039;&#039; Befehl zum Fahren verwendet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_after_ComfortOpen || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Reading || || ||Reading des Roommate-Device, welches den Status wieder gibt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Device || || ||mit Komma getrennte Namen des/der Roommate-Device/s welche den/die Bewohner des Rollladen-Raumes wiedergibt. Macht nur Sinn in Schlaf- oder Kinderzimmern&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Early || || ||Sunset früheste Zeit zum Runterfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Late || || ||Sunset späteste Zeit zum Runterfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Early || || ||Sunrise früheste Zeit zum Hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Late || || ||Sunrise späteste Zeit zum Hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_WE_Holiday || || ||Sunrise früheste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet).&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Up || astro, time, brightness || ||bei &#039;&#039;astro&#039;&#039; wird Sonnenaufgang berechnet, bei &#039;&#039;time&#039;&#039; wird der Wert aus &#039;&#039;ASC_Time_Up_Early&#039;&#039; als Fahrzeit verwendet und bei &#039;&#039;brightness&#039;&#039; müssen &#039;&#039;ASC_Time_Up_Early&#039;&#039; und &#039;&#039;ASC_Time_Up_Late&#039;&#039; korrekt gesetzt werden. Der Timer läuft dann nach &#039;&#039;ASC_Time_Up_Late&#039;&#039;-Zeit, es wird aber in der Zeit zwischen &#039;&#039;ASC_Time_Up_Early&#039;&#039; und &#039;&#039;ASC_Time_Up_Late&#039;&#039; geschaut, ob die als Attribut im Moduldevice hinterlegte &#039;&#039;ASC_brightnessMinVal&#039;&#039; erreicht wurde. Wenn ja, wird der Rolladen runter gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Window_Open || || ||auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec || || ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. Sein Reading &#039;&#039;state&#039;&#039; muss die Werte &#039;&#039;open&#039;&#039;, &#039;&#039;closed&#039;&#039; oder &#039;&#039;tilted&#039;&#039; enthalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_subType || || ||Typ des verwendeten Fensterkontakts: &#039;&#039;twostate&#039;&#039; (optisch oder magnetisch) oder &#039;&#039;threestate&#039;&#039; (Drehgriffkontakt)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOut || soft, hard || ||stellt entsprechend den Aussperrschutz ein. Bei global aktiven Aussperrschutz (&#039;&#039;set ASC-Device lockOut soft&#039;&#039;) und einem Fensterkontakt &#039;&#039;open&#039;&#039; bleibt dann der Rolladen oben. Dies gilt nur bei Steuerbefehle über das ASC-Modul. Stellt man global auf &#039;&#039;hard&#039;&#039;, wird bei entsprechender Möglichkeit versucht, den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_LockOutCmd || inhibit, blocked || ||set Befehl für das Rolladen-Device zum Sperren per Hardware. Der Befehl wird verwendet, wenn &#039;&#039;ASC_LockOut&#039;&#039; auf &#039;&#039;hard&#039;&#039; gesetzt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_Exclude || on, off || ||bei &#039;&#039;on&#039;&#039; wird dieser Rolladen bei aktiven &#039;&#039;selfDefence&#039;&#039; und offenen Fenster nicht runter gefahren, wenn Residents absent ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Brightness_Sensor || || ||Sensor-Device, welches für die Lichtwerte verwendet wird. ACHTUNG! Findet auch Verwendung bei ASC_Down - brightness&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessMinVal || || ||minimaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen / wird der Wert von &#039;&#039;-1&#039;&#039; nicht geändert, so wird automatisch der Wert aus dem Moduldevice genommen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessMaxVal || || ||maximaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen / wird der Wert von &#039;&#039;-1&#039;&#039; nicht geändert, so wird automatisch der Wert aus dem Moduldevice genommen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersPlace || window, terrace || ||wenn dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist und das Residents-Device in den Status &#039;&#039;gone&#039;&#039; geht und &#039;&#039;selfDefence&#039;&#039; aktiv ist, wird das Rollo geschlossen&lt;br /&gt;
|-  &lt;br /&gt;
|ASC_WiggleValue || || ||Wert, um welchen sich die Position des Rollladens bei &#039;&#039;Wiggle&#039;&#039; ändern soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_afterManual || || ||Wartezeit in Sekunden, die die Automatik nach einer manuellen Fahrt aussetzen soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforNightClose || || ||Vorgabezeit in Sekunden, innerhalb derer vor dem nächtlichen Schließen keine Öffnen-Fahrt mehr ausgeführt werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforDayOpen || || ||Vorgabezeit in Sekunden, innerhalb derer vor dem morgendlichen Öffnen keine Schließen-Fahrt mehr ausgeführt werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Direction || || ||Position in Grad, auf der das Fenster liegt - genau Osten wäre 90, Süden 180 und Westen 270&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Pos || || ||Position des Rollladens für die Beschattung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Angle_Left || || ||Vorlaufwinkel im Bezug zum Fenster, ab wann abgeschattet wird. Beispiel: Fenster 180° - 85° ==&amp;gt; ab Sonnenpos. 95° wird abgeschattet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Angle_Right || || ||Nachlaufwinkel im Bezug zum Fenster, bis wann abgeschattet wird. Beispiel: Fenster 180° + 85° ==&amp;gt; bis Sonnenpos. 265° wird abgeschattet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Mode || || ||absent,always,off,home / Vorgabe, wann Beschattungsaktionen durchzuführen sind&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_Sunny || || ||Brightness Wert ab welchen Beschattung statt finden soll, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_Cloudy || || ||Brightness Wert ab welchen die Beschattung aufgehoben werden soll, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Min_Elevation || || ||ab welcher Höhe des Sonnenstandes soll beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Min_OutsideTemperature || || ||ab welcher Temperatur soll Beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_WaitingPeriod || || ||wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDownTime_beforNightClose || || ||wie viele Sekunden vor dem abendlichen schlie&amp;amp;zlig;en soll der Rollladen in die Sichtschutzposition fahren, -1 bedeutet das diese Funktion unbeachtet bleiben soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDown_Pos || || ||Position den Rollladens für den Sichtschutz&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||    &lt;br /&gt;
|-  &lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hilfsmittel ==&lt;br /&gt;
{{Hinweis|Die Device-Namen sind auf die eigene Installation anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
=== Interne Übersicht ===&lt;br /&gt;
[[Bild:ASC Overview.JPG|thumb|right|weblink - Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
 define ASC_Jalousie_Info weblink htmlCode {AutoShuttersControl::GetShuttersInformation($defs{&#039;JalousieControl&#039;})}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Codezeilen sind im [[Import von Code Snippets|RAW]]-Format.}}&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Level ===&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText= Stand 2019-05-03&lt;br /&gt;
* Erfolgreich getestet mit Homematic Devices, Beta-User&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;light&#039;&#039; gewählt wird.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Schliessen bis&amp;gt;,&amp;lt;Öffnen auf&amp;gt;,&amp;lt;Beschattung&amp;gt;,&amp;lt;Komfort&amp;gt;,&amp;lt;Lüften&amp;gt;,&amp;lt;Privacy&amp;gt; (Rollladen_.*|Jalousie_.*)..:level,!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_Shading_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos&lt;br /&gt;
attr rg_ASC_Rolllaeden_Level commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:selectnumbers,0,5,100,0,lin&#039;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Zeiten ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC times.png|thumb|right|ReadingsGroup - Zeitenbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Up_WE/Hol&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; \&lt;br /&gt;
 (.*Rollo.*|.*Rollladen|Jalousie_.*):level,!?ASC_Time_Up_Early,!?ASC_Time_Up_Late,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, \&lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;, \&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,\&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:55,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,  \&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt; &#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;, \&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;, \&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039; }&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC RG Zeiten HM ZWave Siro.png|thumb|right|ReadingsGroup - CUL_HM+ZWave+Siro mit widgets]]Neue Version mit time-Widgets und pct/dim/position-widget (5-er Schritte), passend für CUL_HM, ZWave und Siro-Geräte:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;defmod rg_ASC_Rolllaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early  &amp;gt;,&amp;lt;Time_Up_WE  &amp;gt;,&amp;lt;Time_Up_Late  &amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; (Rollo_.*|Jalousie_.*)..:(level|dim|position),!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times commands {level =&amp;gt; &#039;pct:selectnumbers,0,5,100,0,lin&#039;, \&lt;br /&gt;
dim =&amp;gt; &#039;dim:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
position =&amp;gt; &#039;pct:selectnumbers,0,5,99,0,lin&#039;,\&lt;br /&gt;
ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,\&lt;br /&gt;
ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,\&lt;br /&gt;
ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:time&#039;, \&lt;br /&gt;
ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:time&#039;,\&lt;br /&gt;
ASC_Time_Up_WE_Holiday =&amp;gt;&#039;ASC_Time_Up_WE_Holiday:time&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Times room Rollladen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für die Beschattung ===&lt;br /&gt;
[[Bild:ReadingsGroup ASC shading.png|thumb|right|ReadingsGroup - Beschattungsbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
defmod rg_ASC_Rolllaeden_Shading readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Modus&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Richtung&amp;gt;,&amp;lt;°links&amp;gt;,&amp;lt;°rechts&amp;gt;,&amp;lt;Elevation&amp;gt;,&amp;lt;Sunny&amp;gt;,&amp;lt;Cloudy&amp;gt;,&amp;lt;Min Temp&amp;gt; (Rollo|Jalousie)_.*..:!?ASC_Shading_Mode,!?ASC_Shading_Pos,!?ASC_Shading_Direction,!?ASC_Shading_Angle_Left,!?ASC_Shading_Angle_Right,!?ASC_Shading_MinMax_Elevation,!?ASC_Shading_StateChange_Sunny,!?ASC_Shading_StateChange_Cloudy,!?ASC_Shading_Min_OutsideTemperature&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading alias Rollläden: Beschattung&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading commands {ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:knob,min:0,max:100,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round&#039;,\&lt;br /&gt;
ASC_Shading_Mode =&amp;gt; &#039;ASC_Shading_Mode:always,home,absent,off&#039;,\&lt;br /&gt;
ASC_Shading_Direction =&amp;gt; &#039;ASC_Shading_Direction:knob,min:0,max:360,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:1,cursor:true,lineCap:round&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Left =&amp;gt; &#039;ASC_Shading_Angle_Left:knob,min:0,max:85,angleArc:85,rotation:anticlockwise,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round,angleOffset:270&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Right =&amp;gt; &#039;ASC_Shading_Angle_Right:knob,min:0,max:85,angleArc:85,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round,&#039;,\&lt;br /&gt;
ASC_Shading_MinMax_Elevation =&amp;gt; &#039;ASC_Shading_MinMax_Elevation:knob,min:0,max:35,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:1,lineCap:round,angleArc:120,angleOffset:270&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Sunny =&amp;gt; &#039;ASC_Shading_StateChange_Sunny:knob,min:100,max:40000,angleArc:85,rotation:anticlockwise,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:20,lineCap:round,angleOffset:270&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Cloudy =&amp;gt; &#039;ASC_Shading_StateChange_Cloudy:knob,min:100,max:40000,angleArc:85,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:20,lineCap:round,&#039;,\&lt;br /&gt;
ASC_Shading_Min_OutsideTemperature =&amp;gt; &#039;ASC_Shading_Min_OutsideTemperature:knob,min:5,max:30,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:0.5,lineCap:round,angleArc:120,angleOffset:270&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Anderes {{Link2Forum|Topic=99980|Message=946357|LinkText=Foren-Beispiel}} für eine RG zu Beschattung (für V. 0.6.x):&lt;br /&gt;
[[Bild:ReadingsGroup ASC shading2.png|thumb|right|ReadingsGroup - Beschattungsbeispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-wrap: break-word;&amp;quot;&amp;gt;&lt;br /&gt;
defmod rg_ASC_Shading readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Grad&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Links&amp;gt;,&amp;lt;Rechts&amp;gt;,&amp;lt;Wait&amp;gt;,&amp;lt;ShadeIn&amp;gt;,&amp;lt;ShadeOut&amp;gt;,&amp;lt;Elevation&amp;gt;,&amp;lt;Temperature&amp;gt;,&amp;lt;Device&amp;gt;\&lt;br /&gt;
(Rollo_.*|Jalousie.*):!?ASC_Shading_Direction,!?ASC_Shading_Pos,!?ASC_Shading_Mode,!?ASC_Shading_Angle_Left,!?ASC_Shading_Angle_Right,!?ASC_Shading_WaitingPeriod,!?ASC_Shading_StateChange_Sunny,!?ASC_Shading_StateChange_Cloudy,!?ASC_Shading_MinMax_Elevation,!?ASC_Shading_Min_OutsideTemperature,!?ASC_BrightnessSensor\&lt;br /&gt;
&lt;br /&gt;
attr rg_ASC_Shading commands {ASC_Shading_Direction =&amp;gt; &#039;ASC_Shading_Direction:129,255,309&#039;,\&lt;br /&gt;
ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Mode =&amp;gt; &#039;ASC_Shading_Mode:absent,always,off,home&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Left =&amp;gt; &#039;ASC_Shading_Angle_Left:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Right =&amp;gt; &#039;ASC_Shading_Angle_Right:selectnumbers,0,5,100,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_WaitingPeriod =&amp;gt; &#039;ASC_Shading_WaitingPeriod:selectnumbers,0,60,1200,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Sunny =&amp;gt; &#039;ASC_Shading_StateChange_Sunny:selectnumbers,0,20,1000,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_StateChange_Cloudy =&amp;gt; &#039;ASC_Shading_StateChange_Cloudy:selectnumbers,0,20,1000,0,lin&#039;,\&lt;br /&gt;
ASC_Shading_MinMax_Elevation =&amp;gt;\&lt;br /&gt;
&#039;ASC_Shading_Min_Elevation:selectnumbers,0,1,40,0,lin&#039; ,\&lt;br /&gt;
ASC_Shading_Min_OutsideTemperature =&amp;gt;\&lt;br /&gt;
&#039;ASC_Shading_Min_OutsideTemperature:selectnumbers,0,1,30,0,lin&#039;}&lt;br /&gt;
attr rg_ASC_Shading room Rollladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für FIBARO Roller Shutter FGR-222 Devices ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Getestet von majestro84, Stand 2019-01-28.&lt;br /&gt;
* https://forum.fhem.de/index.php/topic,92628.msg897099.html#msg897099&lt;br /&gt;
* Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;dark&#039;&#039; gewählt wird}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Times.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt;define ASC_Jalousien_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_WE&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt;,&amp;lt;PartyMode&amp;gt;,&amp;lt;LockOut&amp;gt; (.*_Jalousie.*):position,!?ASC_Time_Up_Early,!?ASC_Time_Up_WE_Holiday,!?ASC_Time_Up_Late,!?ASC_Time_Down_Early,!?ASC_Time_Down_Late,!?ASC_Mode_Down,!?ASC_Mode_Up,!?ASC_Partymode,!?ASC_LockOut&lt;br /&gt;
&lt;br /&gt;
 attr ASC_Jalousien_Times commands {position =&amp;gt; &#039;dim:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,&lt;br /&gt;
 ASC_Partymode =&amp;gt; &#039;ASC_Partymode:on,off&#039;,&lt;br /&gt;
 ASC_LockOut =&amp;gt; &#039;ASC_LockOut:soft,hard,off&#039;,&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, &lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;,&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;}&lt;br /&gt;
 attr ASC_Jalousien_Times room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASC Jalousien Level.JPG|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:65%;word-break: break-all;word-wrap: break-word;&amp;quot;&amp;gt; define Jalousien_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;Comfort_Pos&amp;gt;,&amp;lt;Ventilate_Pos&amp;gt;,&amp;lt;PrivacyDown_Pos&amp;gt;,&amp;lt;Shading_Pos&amp;gt; (.*_Jalousie.*):!?ASC_Closed_Pos,!?ASC_Open_Pos,!?ASC_ComfortOpen_Pos,!?ASC_Ventilate_Pos,!?ASC_PrivacyDown_Pos,!?ASC_Shading_Pos&lt;br /&gt;
 attr Jalousien_Level commands { ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;}&lt;br /&gt;
 attr Jalousien_Level room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtungsbeispiel ==&lt;br /&gt;
=== Zielsetzung und Vorgaben ===&lt;br /&gt;
Es sollen alle Rollläden und Jalousien in einem Haus innerhalb bestimmter zeitlicher Grenzen Morgens und Abends sonnenstandsabhängig gefahren werden, an den Wochenenden und an Ferientagen soll etwas später geöffnet werden. Es sind Tür- und Fensterkontakte vorhanden (Türkontakte: twoState, Fensterkontakte: threeState), wobei bei jeder Öffnung ein eventuell geschlossener Rollladen geöffnet werden soll. Bei allen Rollladenaktoren, Tür- und Fensterkontakten handelt es sich um CUL_HM-Geräte.&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
Im global-Device sind Angaben zu latitude und longitude vorhanden, holiday2we wie folgt&amp;lt;ref&amp;gt;&#039;&#039;ferien&#039;&#039; ist eine automatisiert erstellte holiday-Datei nach diesem {{Link2Forum|Topic=85759|Message=885883|LinkText=Foren-Beitrag}}.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr global holiday2we bw,ferien&lt;br /&gt;
Weitere Angaben benötigen wir zunächst nicht, die Festlegung eines Astro-Devices erfolgt hier erst im Rahmen der Beschattung. &lt;br /&gt;
Dann erfolgt das &#039;&#039;Define des ASC-Devices&#039;&#039; wie oben beschrieben:&lt;br /&gt;
&amp;lt;code&amp;gt;define Rollladenautomatik AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Folgen die einzubindenden Rollladenaktoren einem einheitlichen Namensschema, können diese sodann z.B. mit &lt;br /&gt;
 attr (Jalousie|Rollladen)_.* ASC 2&lt;br /&gt;
auf einen Rutsch mit dem passenden ASC-Typ gekennzeichnet werden. Dann verteilen wir mir &lt;br /&gt;
 set Rollladenautomatik scanForShutters&lt;br /&gt;
die nachfolgend weiter zu bearbeitenden Attribute.&lt;br /&gt;
=== Schließen morgens und abends ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternative: Fahren nach brightness:&lt;br /&gt;
Will man insgesamt oder nur an einzelnen Rollläden stattdessen helligkeitsgesteuert fahren, muß für jeden Rollladen ein Helligkeitssensor definiert und entweder zentral oder am einzelnen Rollladen jeweils ein Höchst- bzw. Mindestwert festgelegt werden (&#039;&#039;ASC_BrightnessMinVal&#039;&#039; etc.), bei dessen Überschreitung geöffnet bzw. Unterschreitung geschlossen werden soll.}}&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Da wir sonnenstandsabhängig Fahrzeiten wollen, legen wir erst einmal fest, dass dies morgens und abends berücksichtigt werden soll:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeEvening CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeMorning CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoShuttersControlEvening on&lt;br /&gt;
attr Rollladenautomatik ASC_autoShuttersControlMorning on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aus der Angabe &#039;&#039;CIVIL&#039;&#039; und den Vorgaben in den einzelnen Rollladen wird dabei mit Hilfe von [[SUNRISE_EL]] die effektive Fahrzeit berechnet, dort finden sich auch weitere Hinweise, zu den meisten anderen Optionen für die ersten beiden Attribute.&lt;br /&gt;
Bei allen Fensteröffnungen soll auf eine Lüften-Position gefahren werden, also schalten wir diese Funktion ebenfalls zentral an&amp;lt;ref&amp;gt;Sonst wird bei threeState-Sensoren nur bei &#039;&#039;tilted&#039;&#039; auf die in &#039;&#039;ASC_Ventilate_Pos&#039;&#039; gefahren.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladenautomatik ASC_autoShuttersControlComfort on &lt;br /&gt;
Zuletzt legen wir noch einen Temperatur-Sensor fest. Dieser wird beim Frostschutz sowie bei der Beschattung berücksichtigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_temperatureSensor Aussentemperatur_Nord&lt;br /&gt;
attr Rollladenautomatik ASC_temperatureReading temperature&lt;br /&gt;
attr Rollladenautomatik ASC_freezeTemp 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tbd: &lt;br /&gt;
* Rain&lt;br /&gt;
* Wind&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
===== Fahrzeiten =====&lt;br /&gt;
Zur Konfiguration der Fahrzeiten bietet es sich an, eine ReadingsGroup zu nutzen, wie unter [[#Hilfsmittel|Hilfsmittel]] dargestellt. Alternativ kann man die Zeiten auch manuell in den einzelnen Rollläden hinterlegen.&lt;br /&gt;
===== Bewohner =====&lt;br /&gt;
Wird ein Raum von einer oder mehreren bestimmten Person/en bewohnt oder gibt es ein Sammel-Gerät für mehrere Bewohner, kann dies mit den Attributen &#039;&#039;ASC_Roommate_Device&#039;&#039; und &#039;&#039;ASC_Roommate_Reading&#039;&#039; einem Rollladen zugeordnet werden. Ist einer der Bewohner &#039;&#039;asleep&#039;&#039;, wird morgens erst geöffnet, wenn auch der letzte Roommate nicht mehr &#039;&#039;asleep&#039;&#039; ist.&lt;br /&gt;
===== Fensterkontakte  =====&lt;br /&gt;
Dann werden ggf. vorhandene Fensterkontakte mit &#039;&#039;ASC_WindowRec&#039;&#039; zugeordnet und der Sensortyp mit &#039;&#039;ASC_WindowRec_subType&#039;&#039; festgelegt. Im Falle von threeState-Sensoren wird das übergreifende &#039;&#039;ASC_autoShuttersControlComfort&#039;&#039; beachtet, wobei dann bei vollständiger Öffnung des Fensters auf den in &#039;&#039;ASC_ComfortOpen_Pos&#039;&#039; festgelegten Wert gefahren wird.&lt;br /&gt;
===== Frostschutz =====&lt;br /&gt;
Zuletzt können die Attribute &#039;&#039;ASC_Antifreeze&#039;&#039; und &#039;&#039;ASC_Antifreeze_Pos&#039;&#039; festgelegt werden, wenn die Frostschutzfunktion aktiviert werden soll.&lt;br /&gt;
=== Beschattung ===&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Benötigt werden Informationen zum Sonnenstand. Hierfür wird ein astro- oder twilight-Device benötigt. Ist ein solches definiert, wird dies - ggf. auch nach einem Neustart vom Modul automatisch erkannt und in das Attribut &#039;&#039;ASC_twilightDevice&#039;&#039; eingetragen. Wir legen daher zunächst ein entsprechendes Device an bzw. passen die Angabe ggf. an, wenn ein anderes als das eingetragene genutzt werden soll.&lt;br /&gt;
Weiter ist ein Temperatursensor für die Beschattung festzulegen (&#039;&#039;ASC_temperatureSensor.*&#039;&#039;-Attribute) wie bereits oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
Zum einen legt man einen Helligkeitssensor fest (&#039;&#039;ASC_Brightness_Sensor&#039;&#039; und &#039;&#039;ASC_Brightness_Reading&#039;&#039;). Dieser ist der eigentliche Trigger. Nur, wenn sich der Brightness Wert ändert, werden Azimut, Elevation, Temperatur und die Ein- und Ausfallswinkel ausgelesen und/oder berechnet und basierend auf diesen Werten entschieden ob shading in oder shading out stattfinden soll, die Schwellwerte werden in &#039;&#039;ASC_Shading_StateChange_Sunny&#039;&#039; (Beschattung soll eingeschaltet werden) und &#039;&#039;ASC_Shading_StateChange_Cloudy&#039;&#039; (Beschattung soll beendet werden) festgelegt, wobei immer nur gefahren wird, wenn auch alles andere - insbesondere die Mindesthöhe des Sonnenstands (&#039;&#039;ASC_Shading_Min_Elevation&#039;&#039;) und die Mindesttemperatur &#039;&#039;ASC_Shading_Min_OutsideTemperature&#039;&#039; - passt.&lt;br /&gt;
Dann sind die Winkelangaben festzulegen, ggf. kann ein Kompass zu Hilfe genommen werden (&#039;&#039;ASC_Shading_Direction&#039;&#039; ist die Richtung des Fensters, 90 Grad entspricht Ost, 180 Grad Süden, &#039;&#039;ASC_Shading_Angle_Left&#039;&#039; ist der Sonneneintritt ins Zimmer, wird von -Direction abgezogen, &#039;&#039;ASC_Shading_Angle_Right&#039;&#039; hat diesselbe Funktion für den Austrittswinkel.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen ===&lt;br /&gt;
==== Privacy ====&lt;br /&gt;
Werden hierfür Werte festgelegt, werden die betreffenden Rollläden die festgelegte Zeit vor dem abendlichen Schließen vorab teilweise geschlossen. Dies kann z.B. gewünscht sein, um Rollläden zur Straße hin mit viel Fußgängerverkehr zwar nicht vollständig abzudunkeln, aber gleichzeitig zu verhindern, dass von außen in Wohnräume geschaut werden kann, sobald dort das Licht angeschaltet wird&lt;br /&gt;
==== BlockingTime====&lt;br /&gt;
Bewirkt, dass nach einer manuellen Fahrt, eine vom ASC Modul initiierte Fahrt zunächst ausgesetzt wird, bis die im Attribute angegebene Zeit überschritten ist. Erst dann wird eine vom ASC Modul initiierte Fahrt tatsächlich durchgeführt.&lt;br /&gt;
Genau so wird ein Hochfahren eines Rollos durch das ASC Modul nicht mehr ausgeführt, wenn es innerhalb der Zeit von ASC_BlockingTime_beforNightClose und das Runterfahren wird nicht mehr erfolgen, wenn es innerhalb von ASC_BlockingTime_beforDayOpen ist.&lt;br /&gt;
Beispiel: Meine Tochter geht früh außer Haus und Ihre Rollos sind nicht hochgefahren. Diese fahren auch nicht mehr hoch, da die ausschließlich bei home (anwesend) fahren sollen. Nun kommt sie am Nachmittag um 16:23 Uhr nach Hause. Eigentlich sollten nun die Rollos fahren. Doch die Sonnenuntergangsfahrt (schließen) wäre schon 16:51 Uhr und damit innerhalb der 3600 ASC_BlockingTime_beforNightClose. Die Rollos bleiben also unten. Es lohnt sich für die paar Minuten einfach nicht mehr.&lt;br /&gt;
&lt;br /&gt;
==== wiggle====&lt;br /&gt;
Mit einem &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; wiggle&amp;lt;/code&amp;gt; können alle Rollladen mit einem entsprechenden Attribut zu einer kurzen Fahrt veranlasst werden, nach Ablauf von einer Minute wieder um denselben Wert zurück. Dabei wird jeweils in die Richtung gefahren, die den weiteren Weg ermöglicht. Wenn also zu 70% geschlossen ist, wird der Rollladen hoch fahren.&lt;br /&gt;
==== Partymode ====&lt;br /&gt;
Dieser wird am ASC-Device selbst aktiviert mittels &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; partyMode on&amp;lt;/code&amp;gt;. Alle Rollladen-Devices, welche das Attribut &#039;&#039;ASC_Partymode&#039;&#039; auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, der durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, beim Beenden des Modus durch &amp;lt;code&amp;gt;set ASC-Device partyMode off&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
==== lock-out ====&lt;br /&gt;
(tbd auch hier: Doku ist etwas verteilt, könnte man im Wiki jeweils unter einem eigenen Unterabschnitt im Zusammenhang darstellen)&lt;br /&gt;
&lt;br /&gt;
==== SelfDefense ====&lt;br /&gt;
Das bei einem absent nur da die Rollläden geschlossen werden wo das Fenster vergessen wurde zu schließen.&lt;br /&gt;
Beim wechsel in gone wird nur an den makierten Terassentüren (&#039;&#039;ASC_ShuttersPlace terrace&#039;&#039;) der Rollladen runter gefahren.&lt;br /&gt;
Weitere Attribute dazu: &#039;&#039;ASC_Self_Defense_Exclude&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sonstige Hinweise ==&lt;br /&gt;
* Werden Attribute geändert, kann es vereinzelt vorkommen, dass das ASC-Modul dies nicht mitbekommt und das tatsächliche Verhalten nicht den Erwartungen entspricht. In so einem Fall empfielt es sich, das NOTIFYDEV nochmals aufbauen zu lassen. Dazu werden zunächst mit &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; expert 1&amp;lt;/code&amp;gt; erweiterte Informationen bezüglich des NotifyDevs unter set und get aktiviert und anschließend ein &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; createNewNotifyDev&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=92628|LinkText=&amp;quot;Thread zum Modul im Forum&amp;quot;}}&lt;br /&gt;
* {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread zur Entwicklung im Forum&amp;quot;}} &lt;br /&gt;
* {{Link2Forum|Topic=73964|LinkText=&amp;quot;Thread zu den Scripten von user cluni&amp;quot;}}, die der Entwicklung des Moduls zugrunde liegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-SIN-2-RS-01-Rollladenmodul&amp;diff=30575</id>
		<title>EnOcean-SIN-2-RS-01-Rollladenmodul</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-SIN-2-RS-01-Rollladenmodul&amp;diff=30575"/>
		<updated>2019-05-30T14:43:57Z</updated>

		<summary type="html">&lt;p&gt;50watt: Initiale Version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=SIN-2-RS-01 Rollladenmodul.jpg&lt;br /&gt;
|Bildbeschreibung=SIN-2-RS-01-Rollladenmodul mit AAA-Batterie zum Größenvergleich&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Aktor, Empfänger, Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=1 (bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch &amp;lt;1W&lt;br /&gt;
|HWPoweredBy=230V&lt;br /&gt;
|HWSize=40x44x16.9mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Nodon&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-SIN-2-RS-01-Rollladenmodul&#039;&#039;&#039; ist ein Aktor&lt;br /&gt;
* für&lt;br /&gt;
** Unterputzmontage&lt;br /&gt;
* für die&lt;br /&gt;
** Steuerung von Rollladen- und Beschattungselementen&lt;br /&gt;
== Features ==&lt;br /&gt;
Aktor für Beschattungselemente und Rollladen&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
UTE-Teach-In:&lt;br /&gt;
#FHEM in Lernmodus schalten: &amp;lt;code&amp;gt;set &amp;lt;nowiki&amp;gt;&amp;lt;IODev&amp;gt; teach 600&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
#Taster am SIN-2-RS-01 dreimal drücken&lt;br /&gt;
#SIN-2-RS-01 wird in FHEM automatisch mit allen notwendigen Parametern angelegt.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration|fhem.cfg]]:&lt;br /&gt;
 defmod EnO_05100000 EnOcean 05100000               ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 IODev synoTCM                    ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 alias Rollladen Küche&lt;br /&gt;
 attr EnO_05100000 comMode biDir                    ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 comment Nodon SIN-2-RS-01 Rollladenmodul in der Küche (rechts oben neben dem Fenster)&lt;br /&gt;
 attr EnO_05100000 devChannel 1                     ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 devStateIcon closed:fts_shutter_100@green:opens open:fts_window_2w:closes open_ack:fts_window_2w@green:closes 25:fts_shutter_30  50:fts_shutter_50 75:fts_shutter_70 down:fts_shutter_down@red:stop up:fts_shutter_up@yellow:stop&lt;br /&gt;
 attr EnO_05100000 eep D2-05-00                     ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 eventMap /opens:AUF/closes:ZU/   ## übersetzt &amp;quot;opens&amp;quot; und &amp;quot;closes&amp;quot; zu &amp;quot;AUF&amp;quot; und &amp;quot;ZU&amp;quot;&lt;br /&gt;
 attr EnO_05100000 group Rollladen&lt;br /&gt;
 attr EnO_05100000 icon fts_shutter_updown&lt;br /&gt;
 attr EnO_05100000 manufID 046                      ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 room EnOcean,Küche&lt;br /&gt;
 attr EnO_05100000 shutTime 26                      ## Zeit in Sekunden, die der Rolladen von ganz geschlossen bis ganz offen braucht. Dient der ermittlung der aktuellen Position des Rollladens&lt;br /&gt;
 attr EnO_05100000 shutTimeCloses 28                ## Zeit in Sekunden, um sicher von einer Endposition zur anderen zu gelangen. Danach wird bei &amp;quot;opens&amp;quot; und &amp;quot;closes&amp;quot; gestoppt     &lt;br /&gt;
 attr EnO_05100000 subDef FFFB0000                  ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 subType blindsCtrl.00            ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 teachMethod UTE                  ## automatisch von FHEM erzeugt&lt;br /&gt;
 attr EnO_05100000 webCmd AUF:stop:ZU:position      ## erzeugt im Webfrontend deutsche Schaltflächen für &amp;quot;AUF&amp;quot; und &amp;quot;ZU&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
[[Datei:SIN-2-RS-01 im webfrontend.jpg|mini|SIN-2-RS-01 im Webfrontend]]&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Links ==&lt;br /&gt;
* Anleitung: [https://www.enocean-alliance.org/wp-content/uploads/2018/04/NodOn-SIN-2-RS-01-UserGuide-DE-180419-interactive.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:SIN-2-RS-01_im_webfrontend.jpg&amp;diff=30574</id>
		<title>Datei:SIN-2-RS-01 im webfrontend.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:SIN-2-RS-01_im_webfrontend.jpg&amp;diff=30574"/>
		<updated>2019-05-30T14:37:43Z</updated>

		<summary type="html">&lt;p&gt;50watt: Nodon SIN-2-RS-01 im Webfrontend&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
Nodon SIN-2-RS-01 im Webfrontend&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-SIN-2-RS-01-Rollladenmodul&amp;diff=30573</id>
		<title>EnOcean-SIN-2-RS-01-Rollladenmodul</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-SIN-2-RS-01-Rollladenmodul&amp;diff=30573"/>
		<updated>2019-05-30T14:01:54Z</updated>

		<summary type="html">&lt;p&gt;50watt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=SIN-2-RS-01 Rollladenmodul.jpg&lt;br /&gt;
|Bildbeschreibung=SIN-2-RS-01-Rollladenmodul mit AAA-Batterie zum Größenvergleich&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Aktor, Empfänger, Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=1 (bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch ca. 0,7W - 0,9W&lt;br /&gt;
|HWPoweredBy=230V&lt;br /&gt;
|HWSize=40x44x16.9mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Nodon&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-SIN-2-RS-01-Rollladenmodul&#039;&#039;&#039; ist ein Aktor&lt;br /&gt;
* für&lt;br /&gt;
** Unterputzmontage&lt;br /&gt;
* für die&lt;br /&gt;
** Steuerung von Rollladen- und Beschattungselementen&lt;br /&gt;
== Features ==&lt;br /&gt;
Aktor für Beschattungselemente und Rollladen&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:SIN-2-RS-01_Rollladenmodul.jpg&amp;diff=30572</id>
		<title>Datei:SIN-2-RS-01 Rollladenmodul.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:SIN-2-RS-01_Rollladenmodul.jpg&amp;diff=30572"/>
		<updated>2019-05-30T14:00:14Z</updated>

		<summary type="html">&lt;p&gt;50watt: SIN-2-RS-01 Rollladenmodul von Nodon, mit AAA Batterie zum Größenvergleich&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
SIN-2-RS-01 Rollladenmodul von Nodon, mit AAA Batterie zum Größenvergleich&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-SIN-2-RS-01-Rollladenmodul&amp;diff=30571</id>
		<title>EnOcean-SIN-2-RS-01-Rollladenmodul</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-SIN-2-RS-01-Rollladenmodul&amp;diff=30571"/>
		<updated>2019-05-30T13:58:43Z</updated>

		<summary type="html">&lt;p&gt;50watt: work in progress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=SIN-2-RS-01-Rollladenmodul.jpg&lt;br /&gt;
|Bildbeschreibung=SIN-2-RS-01-Rollladenmodul mit AAA-Batterie zum Größenvergleich&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Aktor, Empfänger, Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=1 (bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch ca. 0,7W - 0,9W&lt;br /&gt;
|HWPoweredBy=230V&lt;br /&gt;
|HWSize=40x44x16.9mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Nodon&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-SIN-2-RS-01-Rollladenmodul&#039;&#039;&#039; ist ein Aktor&lt;br /&gt;
* für&lt;br /&gt;
** Unterputzmontage&lt;br /&gt;
* für die&lt;br /&gt;
** Steuerung von Rollladen- und Beschattungselementen&lt;br /&gt;
== Features ==&lt;br /&gt;
Aktor für Beschattungselemente und Rollladen&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=30326</id>
		<title>AutoShuttersControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AutoShuttersControl&amp;diff=30326"/>
		<updated>2019-05-01T11:11:13Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Zielsetzung und Vorgaben */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Rollläden&lt;br /&gt;
|ModCategory=Automatisierung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=73_AutoShuttersControl.pm&lt;br /&gt;
|ModOwner=CoolTux ({{Link2FU|13684|Forum}}/[[Benutzer Diskussion:CoolTux|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Mit [[AutoShuttersControl]] oder kurz ASC können typische Aufgabenstellungen im Zusammenhang mit Rollläden u.ä. automatisiert werden, wie zum Beispiel das Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang oder das Anfahren von Lüftungspositionen beim Öffnen des zugehörigen Fensters. &lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
{{Hinweis|Das Modul befindet sich derzeit noch in der Entwicklung; der jeweils aktuelle Stand ist  diesem {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread im Forum&amp;quot;}} zu entnehmen.}}&lt;br /&gt;
Zur Nutzung des Moduls sollten folgende andere FHEM-Devices vorhanden sein:&lt;br /&gt;
* Rollläden&lt;br /&gt;
* Fensterkontakte und &lt;br /&gt;
* Bewohnerstatus auf Basis von Residents/Roomates in englisch. Ersatzweise andere Devices, z.B. Dummys, welche als &#039;&#039;state&#039;&#039; &#039;&#039;home&#039;&#039;, &#039;&#039;asleep&#039;&#039;, &#039;&#039;gotosleep&#039;&#039; und &#039;&#039;awoken&#039;&#039; setzen sowie ein Reading &#039;&#039;lastState&#039;&#039;.&lt;br /&gt;
* Optional:&lt;br /&gt;
** Ein Helligkeitssensor (Steuerung nach Helligkeit und Beschattung)&lt;br /&gt;
** Ein Device zur Bestimmung des Sonnenstands (nur für Beschattungf). Unterstützt werden derzeit [[Modul Astro|Astro]] und [[Twilight]]&amp;lt;ref&amp;gt;Dabei müssen ggf. in [[Global|global]] auch Angaben zu &#039;&#039;longitude&#039;&#039; und &#039;&#039;latitude&#039;&#039; vorhanden sein&amp;lt;/ref&amp;gt;. &lt;br /&gt;
** Wenn Feiertage berücksichtigt werden sollen: Ein oder mehrere {{Link2CmdRef|Anker=holiday2we|Lang=en|Label=holiday2we}}-Angaben in [[Global|global]] samt entsprechender [[Wochenende, Feiertage und Schulferien#Feiertage mittels holiday-Datei|holiday]]-Dateien&amp;lt;ref&amp;gt;Es kann auch z.B. ein Dummy-Device verwendet werden, dieses sollte dann aber neben dem eigentlichen Feiertags-&#039;&#039;state&#039;&#039; auch in einem Reading &#039;&#039;tomorrow&#039;&#039; Angaben zu anstehenden Feiertagen enthalten.&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;Bitte verfahren Sie entsprechend, wenn Urlaubs- oder Ferientage wie Feiertage behandelt werden sollen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Moduls bzw. dessen Funktionalität erfolgt in mehreren Schritten:&lt;br /&gt;
* Definition des ASC-Devices&lt;br /&gt;
* Einstellung zentraler Vorgaben am ASC-Device&lt;br /&gt;
* Markieren der zukünftig zu steuernden Rollladen-Devices&lt;br /&gt;
* Einbinden der Rollladen-Devices in das ASC-Device&lt;br /&gt;
* Einstellen der individuellen Vorgaben je Rollladen (am Rollladen-Device)&lt;br /&gt;
Dabei geht man am einfachsten schrittweise vor und erweitert die Funktionalität nach und nach um die gewünschten Funktionen. Dann benötigt man jeweils nur einen kleinen Teil der vielen per Attribut einstellbaren Optionen, und kann die Auswirkungen der jeweiligen Änderung besser nachvollziehen. &lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
{{Hinweis|ASC kann auch verwendet werden, um lediglich Teilaufgaben der Rollladensteuerung zu erfüllen, also z.B. nur das morgendliche Öffnen der Rollläden. Allerdings geht dabei ein erheblicher Teil des Komforts verloren, der dadurch entsteht, dass die Steuerung innerhalb der vollintegrierten Lösung jeweils nachvollzieht, aus welchem Grund eine Fahrt erfolgt war und dies ggf. bei der nächsten Aktion berücksichtigt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Zunächst sollten die in den [[#Basics|Basics]] beschriebenen Geräte vorhanden und funktionsfähig sein. &lt;br /&gt;
&lt;br /&gt;
=== Define des ASC-Devices ===&lt;br /&gt;
Es genügt ein einfaches define ohne weitere Parameter.&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies bewirkt neben der Anlage des Devices selbst auch, dass als weiteres globales Attribut &#039;&#039;ASC&#039;&#039; verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung zentraler Vorgaben ===&lt;br /&gt;
Es stehen am ASC-Device einige Attribute zur Verfügung, über die sich das Verhalten des ASC-Devices insgesamt steuern lässt, z.B. zur Vermeidung von morgendlichen oder abendlichen Fahrten sowie bei Gefahr von Schäden an den Rollläden durch Frost oder zur Reaktion auf Fensterkontakte. Details sind der Commandref zu entnehmen.&lt;br /&gt;
Diese Attribute können auch nachträglich noch geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Markieren zu steuernder Rollladen-Devices ===&lt;br /&gt;
Um einen oder mehrere Rollläden durch das ASC-Device zu steuern, wird für jeden Rollladen jeweils das neue globale Attribut &#039;&#039;ASC&#039;&#039; gesetzt. Der Wert ist mit 1 oder 2 festzulegen, wobei &#039;&#039;&#039;1&#039;&#039;&#039; bedeutet, dass &lt;br /&gt;
* die Offen-Position kleiner ist als die Geschlossen-Position, also typischerweise 0 &#039;&#039;offen&#039;&#039; bedeutet und 100 für &#039;&#039;geschlossen&#039;&#039; steht&lt;br /&gt;
* eine bestimmte Position mit &#039;&#039;&#039;position&#039;&#039;&#039; angefahren wird, also z.B. &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; position 70&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dies ist z.B. die  passende Wahl für ROLLO-Devices&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;2&#039;&#039;&#039; steht für ein umgekehrtes Verhalten und den Befehlsteil &#039;&#039;pct&#039;&#039;, also &#039;&#039;offen&#039;&#039; für &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; pct 100&amp;lt;/code&amp;gt;. Typischer Vertreter dieses Typs sind HomeMatic (CUL_HM-) Geräte oder die Shelly2-Aktoren.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden in das ASC-Device ===&lt;br /&gt;
Nachdem man das obige Attribut bei einem oder mehreren Rollladen-Devices gesetzt hat, kann mit &lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; scanForShutters&amp;lt;/code&amp;gt; ein Suchlauf gestartet werden, mit dem dann diese Rollläden durch das Modul gefunden und in die Steuerungslogik eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellen der individuellen Vorgaben ===&lt;br /&gt;
Nach der Einbindung sind an den Rollladen-Devices weitere Attribute verfügbar, mit denen die für den jeweiligen Rollladen geltenden Einstellungen vorgenommen werden können. &lt;br /&gt;
Die Beschreibung der Attribute ist in der commandref enthalten.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
===Readings im ASC-Device selbst ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|..._nextAstroTimeEvent || ||Uhrzeit des nächsten Astro-Events, Sonnenauf- oder Sonnenuntergang oder feste Zeit pro Rollonamen &lt;br /&gt;
|-&lt;br /&gt;
|..._lastPosValue || ||zuletzt abgesetzter Fahrbefehl pro Rollonamen&lt;br /&gt;
|-&lt;br /&gt;
|..._lastDelayPosValue || ||zuletzt abgesetzter Fahrbefehl, welcher beim nächsten zulässigen Event ausgeführt wird&lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off || aktiviert den globalen Partymodus. Alle Rollläden, welche das Attribut &#039;&#039;AutoShuttersControl_Partymode&#039;&#039; bei sich auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, welcher durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, wird erst beim off-setzen (set &amp;lt;ASC-Device&amp;gt; partyMode off) ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|lockOut || on, off ||für das Aktivieren des Aussperrschutzes gemäß des entsprechenden Attributs &#039;&#039;AutoShuttersControl_lock-out&#039;&#039; im jeweiligen Rolladen (siehe Beschreibung bei den Attributen für die Rolladendevices)&lt;br /&gt;
|-&lt;br /&gt;
|room_... || ||Auflistung aller Rollläden, welche in den jeweiligen Räumen gefunden wurden, Bsp.: room_Schlafzimmer,Terrasse&lt;br /&gt;
|-&lt;br /&gt;
|state || ||Status des &amp;lt;ASC-Device&amp;gt; active, enabled, disabled&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday|| on,off ||legt fest, ob das Rolladendevice das Attribut &#039;&#039;AutoShuttersControl_Time_Up_WE_Holiday&#039;&#039; beachtet oder nicht&lt;br /&gt;
|-&lt;br /&gt;
|userAttrList || rolled out ||Status der UserAttribute, welche an die Rollläden gesendet werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings in den Rolllädendevices ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Bedeutung  &lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveUp ||Sonnenaufgangszeit für das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_DriveDown ||Sonnenuntergangszeit für das Rollo&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersLastDrive ||Grund des letzten Fahrens vom Rolladen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==set- und get-Befehle für das ASC-Device==&lt;br /&gt;
&lt;br /&gt;
=== set-Anweisungen ===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Beschreibung  &lt;br /&gt;
|-&lt;br /&gt;
|partyMode ||on, off ||aktiviert den globalen Partymodus. Siehe Reading &#039;&#039;partyMode&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|lockOut ||on, off ||aktiviert den globalen Aussperrschutz. Siehe Reading &#039;&#039;lockOut&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|renewSetSunriseSunsetTimer || || erneuert bei allen Rollläden die Zeiten für Sunset und Sunrise und setzt die internen Timer neu.&lt;br /&gt;
|-&lt;br /&gt;
|scanForShutters || ||sucht alle FHEM Devices mit dem Attribut &#039;&#039;AutoShuttersControl&#039;&#039; &#039;&#039;1&#039;&#039; oder &#039;&#039;2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|sunriseTimeWeHoliday || on,off ||aktiviert/deaktiviert die Beachtung des Attributes &#039;&#039;AutoShuttersControl_Time_Up_WE_Holiday&#039;&#039; für Rollladen-Devices&lt;br /&gt;
|-&lt;br /&gt;
|createNewNotifyDev || ||Legt die interne Struktur für NOTIFYDEV neu an&lt;br /&gt;
|-&lt;br /&gt;
|selfDefence ||on, off||aktiviert/deaktiviert den Selbstschutz: wenn das Residents-Device &#039;&#039;absent&#039;&#039; meldet, &#039;&#039;selfDefence&#039;&#039; aktiv ist und ein Fenster im Haus noch offen steht, wird an diesem Fenster das Rollo runtergefahren&lt;br /&gt;
|-&lt;br /&gt;
|wiggle ||||bewegt einen Rollladen oder alle Rollläden (für Abschreckungszwecke bei der Alarmierung) um &#039;&#039;ASC_WiggleValue&#039;&#039;-%, und nach 1 Minute wieder zurück zur Ursprungsposition&lt;br /&gt;
|-&lt;br /&gt;
|||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get-Anweisungen ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| showShuttersInformations ||zeigt eine Übersicht der Automatik-Fahrzeiten&lt;br /&gt;
|-&lt;br /&gt;
| showNotifyDevsInformations ||zeigt eine Übersicht der abgelegten NOTIFYDEV Struktur. Dient zur Kontrolle&lt;br /&gt;
|}&lt;br /&gt;
== Attribute ==&lt;br /&gt;
&lt;br /&gt;
===Attribute direkt am ASC-Device ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_antifreezeTemp || || ||Temperatur, ab welcher der Frostschutz greift und das Rollo nicht mehr fährt. Der letzte Fahrbefehl wird gespeichert&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEvening ||aktuell REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || || (in genau dieser Schreibweise)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeEveningHorizon || || || Höhe über Horizont, wenn beim Attribut &#039;&#039;AutoShuttersControl_autoAstroModeEvening&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorning ||aktuell REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||(in genau dieser Schreibweise)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoAstroModeMorningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;AutoShuttersControl_autoAstroModeMorning&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlComfort ||on, off || ||aktiviert die Komfortfunktion. Bedeutet, dass ein Rollladen mit einem threestate (Drehgriff-) Sensor am Fenster beim Öffnen in die &amp;quot;Komfortposition&amp;quot; fährt. Diese wird beim Rollladendevice über das Attribut &#039;&#039;AutoShuttersControl_Pos_after_ComfortOpen&#039;&#039; eingestellt.&lt;br /&gt;
|- &lt;br /&gt;
|ASC_autoShuttersControlEvening ||on, off || ||ob Abends die Rollläden automatisch zeitgesteuert werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_autoShuttersControlMorning ||on, off || ||ob Morgens die Rollläden automatisch zeitgesteuert werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_temperatureReading || || ||Reading für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_temperatureSensor || || ||Device für die Außentemperatur&lt;br /&gt;
|-&lt;br /&gt;
|ASC_timeUpHolidayDevice || || ||Device zur Urlaubserkennung oder Sonstiges / muss &#039;&#039;0&#039;&#039; oder &#039;&#039;1&#039;&#039; im Reading &#039;&#039;state&#039;&#039; beinhalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDevice|| || ||Devicenamen des Residents-Device der obersten Ebene&lt;br /&gt;
|-&lt;br /&gt;
|ASC_residentsDeviceReading|| || ||Status Reading des Residents-Device der obersten Ebene&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessMinVal|| || ||minimaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_brightnessMaxVal || || ||maximaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorDevice || || ||Device, welches bei Regen getriggert wird&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorReading || || ||das ensprechende Reading zum Regendevice&lt;br /&gt;
|-&lt;br /&gt;
|ASC_rainSensorShuttersClosedPos || || ||Position in pct, welche der Rollladen bei Regen anfahren soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_shuttersDriveOffset  || || ||maximale zufällige Verzögerung in Sekunden bei der Berechnung der Fahrzeiten, &#039;&#039;0&#039;&#039; bedeutet keine Verzögerung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_twilightDevice || || ||Device, welches Informationen zum Sonnenstand liefert, wird unter anderem für die Beschattung verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_expert || || ||bei &#039;&#039;1&#039;&#039; werden erweiterte Informationen bezüglich des NotifyDevs unter &#039;&#039;set&#039;&#039; und &#039;&#039;get&#039;&#039; angezeigt&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Attribute in den Rolllädendevices===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Datentyp/&amp;lt;BR/&amp;gt;Wertebereich !! Default-Wert !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|ASC || 0, 1, 2|| ||0 = &amp;quot;kein Anlegen der Attribute beim ersten Scan bzw. keine Beachtung eines Fahrbefehles&amp;quot;,1 = &amp;quot;Inverse oder Rollo - Bsp.: Rollo Oben 0, Rollo Unten 100 und der Befehl zum prozentualen Fahren ist position&amp;quot;,2 = &amp;quot;Homematic Style - Bsp.: Rollo Oben 100, Rollo Unten 0 und der Befehl zum prozentualen Fahren ist pct&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze || soft, am, pm, hard, off|| ||Frostschutz, wenn &#039;&#039;soft&#039;&#039; fährt der Rollladen in die &#039;&#039;ASC_Antifreeze_Pos&#039;&#039;, bei &#039;&#039;hard/am/pm&#039;&#039; wird gar nicht oder innerhalb der entsprechenden Tageszeit nicht gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Antifreeze_Pos || || ||Position, die angefahren werden soll, wenn der Fahrbefehl komplett schließen lautet, aber der Frostschutz aktiv ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeEvening ||REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeEveningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;ASC_autoAstroModeEvening&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeMorning ||REAL, CIVIL, NAUTIC, ASTRONOMIC, HORIZON || ||aktuell REAL,CIVIL,NAUTIC,ASTRONOMIC&lt;br /&gt;
|-&lt;br /&gt;
|ASC_AutoAstroModeMorningHorizon || || ||Höhe über Horizont, wenn beim Attribut &#039;&#039;ASC_autoAstroModeMorning&#039;&#039; &#039;&#039;HORIZON&#039;&#039; ausgewählt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Closed_Pos || || ||in 10er Schritten von 0 bis 100,default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Down || astro, time, brightness || ||bei &#039;&#039;astro&#039;&#039; wird Sonnenuntergang berechnet, bei &#039;&#039;time&#039;&#039; wird der Wert aus &#039;&#039;ASC_Time_Down_Early&#039;&#039; als Fahrzeit verwendet und bei &#039;&#039;brightness&#039;&#039; muss &#039;&#039;ASC_Time_Down_Early&#039;&#039; und &#039;&#039;ASC_Time_Down_Late&#039;&#039; korrekt gesetzt werden. Der Timer läuft dann nach &#039;&#039;ASC_Time_Down_Late&#039;&#039;-Zeit,es wird aber in der Zeit zwischen &#039;&#039;ASC_Time_Down_Early&#039;&#039; und &#039;&#039;ASC_Time_Down_Late&#039;&#039; geschaut, ob die als Attribut im Moduldevice hinterlegte &#039;&#039;ASC_brightnessMinVal&#039;&#039; erreicht wurde. Wenn ja, wird der Rolladen runter gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Down ||always, home, absent, off || ||wann darf die Automatik herunterfahren. immer, niemals oder bei Abwesenheit des Roommate (ist kein Roommate und &#039;&#039;absent&#039;&#039; eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Mode_Up ||always, home, absent, off || ||wann darf die Automatik hochfahren. immer, niemals oder bei Abwesenheit des Roommate (ist kein Roommate und &#039;&#039;absent&#039;&#039; eingestellt, wird gar nicht gesteuert)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Drive_Offset || || ||maximale zufällige Verzögerung in Sekunden bei der Berechnung der Fahrzeiten, &#039;&#039;0&#039;&#039; bedeutet sofort, &#039;&#039;-1&#039;&#039; bedeutet, dass das gleichwertige Attribut aus dem ASC-Device ausgewertet werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Open_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Partymode || on, off || ||schaltet den Partymodus an oder aus. Wird dann am ASC Device &#039;&#039;set &amp;lt;ASC-DEVICE&amp;gt; partyMode on&#039;&#039; geschaltet, werden alle Fahrbefehle an den Rollläden, welche das Attribut auf &#039;&#039;on&#039;&#039; haben, zwischengespeichert und erst später ausgeführt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_Reading || || ||Name des Readings, welches die Position des Rollladen in Prozent angibt. Wird bei unbekannten Device-Typen auch als &#039;&#039;set&#039;&#039; Befehl zum Fahren verwendet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Pos_after_ComfortOpen || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Reading || || ||Reading des Roommate-Device, welches den Status wieder gibt&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Roommate_Device || || ||mit Komma getrennte Namen des/der Roommate-Device/s welche den/die Bewohner des Rollladen-Raumes wiedergibt. Macht nur Sinn in Schlaf- oder Kinderzimmern&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Early || || ||Sunset früheste Zeit zum Runterfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Down_Late || || ||Sunset späteste Zeit zum Runterfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Early || || ||Sunrise früheste Zeit zum Hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_Late || || ||Sunrise späteste Zeit zum Hochfahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Time_Up_WE_Holiday || || ||Sunrise früheste Zeit zum Hochfahren am Wochenende und/oder Urlaub (holiday2we wird beachtet).&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Up || astro, time, brightness || ||bei &#039;&#039;astro&#039;&#039; wird Sonnenaufgang berechnet, bei &#039;&#039;time&#039;&#039; wird der Wert aus &#039;&#039;ASC_Time_Up_Early&#039;&#039; als Fahrzeit verwendet und bei &#039;&#039;brightness&#039;&#039; müssen &#039;&#039;ASC_Time_Up_Early&#039;&#039; und &#039;&#039;ASC_Time_Up_Late&#039;&#039; korrekt gesetzt werden. Der Timer läuft dann nach &#039;&#039;ASC_Time_Up_Late&#039;&#039;-Zeit, es wird aber in der Zeit zwischen &#039;&#039;ASC_Time_Up_Early&#039;&#039; und &#039;&#039;ASC_Time_Up_Late&#039;&#039; geschaut, ob die als Attribut im Moduldevice hinterlegte &#039;&#039;ASC_brightnessMinVal&#039;&#039; erreicht wurde. Wenn ja, wird der Rolladen runter gefahren&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Pos || || ||in 10er-Schritten von 0 bis 100, default Vorgabe ist abhängig vom Attribut &#039;&#039;ASC&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Ventilate_Window_Open || || ||auf lüften, wenn das Fenster gekippt/geöffnet wird und aktuelle Position unterhalb der Lüften-Position ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec || || ||Name des Fensterkontakts, an welchen Fenster der Rollladen angebracht ist. Sein Reading &#039;&#039;state&#039;&#039; muss die Werte &#039;&#039;open&#039;&#039;, &#039;&#039;closed&#039;&#039; oder &#039;&#039;tilted&#039;&#039; enthalten.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_WindowRec_subType || || ||Typ des verwendeten Fensterkontakts: &#039;&#039;twostate&#039;&#039; (optisch oder magnetisch) oder &#039;&#039;threestate&#039;&#039; (Drehgriffkontakt)&lt;br /&gt;
|-&lt;br /&gt;
|ASC_lock-out || soft, hard || ||stellt entsprechend den Aussperrschutz ein. Bei global aktiven Aussperrschutz (&#039;&#039;set ASC-Device lockOut soft&#039;&#039;) und einem Fensterkontakt &#039;&#039;open&#039;&#039; bleibt dann der Rolladen oben. Dies gilt nur bei Steuerbefehle über das ASC-Modul. Stellt man global auf &#039;&#039;hard&#039;&#039;, wird bei entsprechender Möglichkeit versucht, den Rollladen hardwareseitig zu blockieren. Dann ist auch ein Fahren über die Taster nicht mehr möglich.&lt;br /&gt;
|-&lt;br /&gt;
|ASC_lock-outCmd || inhibit, blocked || ||set Befehl für das Rolladen-Device zum Sperren per Hardware. Der Befehl wird verwendet, wenn &#039;&#039;ASC_lock-out&#039;&#039; auf &#039;&#039;hard&#039;&#039; gesetzt ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Self_Defense_Exclude || on, off || ||bei &#039;&#039;on&#039;&#039; wird dieser Rolladen bei aktiven &#039;&#039;selfDefence&#039;&#039; und offenen Fenster nicht runter gefahren, wenn Residents absent ist&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Brightness_Sensor || || ||Sensor-Device, welches für die Lichtwerte verwendet wird. ACHTUNG! Findet auch Verwendung bei ASC_Down - brightness&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessMinVal || || ||minimaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen / wird der Wert von &#039;&#039;-1&#039;&#039; nicht geändert, so wird automatisch der Wert aus dem Moduldevice genommen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BrightnessMaxVal || || ||maximaler Lichtwert, bei dem Schaltbedingungen noch geprüft werden sollen / wird der Wert von &#039;&#039;-1&#039;&#039; nicht geändert, so wird automatisch der Wert aus dem Moduldevice genommen&lt;br /&gt;
|-&lt;br /&gt;
|ASC_ShuttersPlace || window, terrace || ||wenn dieses Attribut auf &#039;&#039;terrace&#039;&#039; gesetzt ist und das Residents-Device in den Status &#039;&#039;gone&#039;&#039; geht und &#039;&#039;selfDefence&#039;&#039; aktiv ist, wird das Rollo geschlossen&lt;br /&gt;
|-  &lt;br /&gt;
|ASC_WiggleValue || || ||Wert, um welchen sich die Position des Rollladens bei &#039;&#039;Wiggle&#039;&#039; ändern soll &lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_afterManual || || ||Wartezeit in Sekunden, die die Automatik nach einer manuellen Fahrt aussetzen soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforNightClose || || ||Vorgabezeit in Sekunden, innerhalb derer vor dem nächtlichen Schließen keine Öffnen-Fahrt mehr ausgeführt werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_BlockingTime_beforDayOpen || || ||Vorgabezeit in Sekunden, innerhalb derer vor dem morgendlichen Öffnen keine Schließen-Fahrt mehr ausgeführt werden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Direction || || ||Position in Grad, auf der das Fenster liegt - genau Osten wäre 90, Süden 180 und Westen 270&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Pos || || ||Position des Rollladens für die Beschattung&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Angle_Left || || ||Vorlaufwinkel im Bezug zum Fenster, ab wann abgeschattet wird. Beispiel: Fenster 180° - 85° ==&amp;gt; ab Sonnenpos. 95° wird abgeschattet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Angle_Right || || ||Nachlaufwinkel im Bezug zum Fenster, bis wann abgeschattet wird. Beispiel: Fenster 180° + 85° ==&amp;gt; bis Sonnenpos. 265° wird abgeschattet&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Mode || || ||absent,always,off,home / Vorgabe, wann Beschattungsaktionen durchzuführen sind&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_Sunny || || ||Brightness Wert ab welchen Beschattung statt finden soll, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_StateChange_Cloudy || || ||Brightness Wert ab welchen die Beschattung aufgehoben werden soll, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Min_Elevation || || ||ab welcher Höhe des Sonnenstandes soll beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_Min_OutsideTemperature || || ||ab welcher Temperatur soll Beschattet werden, immer in Abhängikkeit der anderen einbezogenden Sensorwerte&lt;br /&gt;
|-&lt;br /&gt;
|ASC_Shading_WaitingPeriod || || ||wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDownTime_beforNightClose || || ||wie viele Sekunden vor dem abendlichen schlie&amp;amp;zlig;en soll der Rollladen in die Sichtschutzposition fahren, -1 bedeutet das diese Funktion unbeachtet bleiben soll&lt;br /&gt;
|-&lt;br /&gt;
|ASC_PrivacyDown_Pos || || ||Position den Rollladens für den Sichtschutz&lt;br /&gt;
|-&lt;br /&gt;
| || || ||&lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||    &lt;br /&gt;
|-  &lt;br /&gt;
| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || ||        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hilfsmittel ==&lt;br /&gt;
{{Hinweis|Die Device-Namen sind auf die eigene Installation anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
=== Interne Übersicht ===&lt;br /&gt;
&lt;br /&gt;
 define ASC_Jalousie_Info weblink htmlCode {AutoShuttersControl::GetShuttersInformation($defs{&#039;JalousieControl&#039;})}&lt;br /&gt;
&lt;br /&gt;
[[Datei:ASC Overview.JPG|600px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Level ===&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Erfolgreich getestet mit Homematic Devices, Stand 2019-01-28 no_Legend}}&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Codezeilen wurden aus der Config Datei kopiert.}}&lt;br /&gt;
 &lt;br /&gt;
[[Datei:RG AutoShuttersControl Homematic.png|600px|]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; define rg_ASC_Rollaeden_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;ASC&amp;gt;,&amp;lt;Antifreeze&amp;gt;,&amp;lt;Antifreeze_Pos&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;ASC_Ventilate_Pos&amp;gt; \&lt;br /&gt;
 (.*Rollladen.*|.*Rollladen|Jalousie_.*):?ASC,?ASC_Antifreeze,?ASC_Antifreeze_Pos,?ASC_Closed_Pos,?ASC_Open_Pos,?ASC_Ventilate_Pos&lt;br /&gt;
 setuuid rg_ASC_Rollaeden_Level 5c4308e1-f33f-abd1-167d-cc1b5f137cf793c8&lt;br /&gt;
 attr rg_ASC_Rollaeden_Level commands {ASC =&amp;gt; &#039;ASC:0,1,2&#039;,\&lt;br /&gt;
 ASC_Antifreeze =&amp;gt; &#039;ASC_Antifreeze:off,soft,hard,am,pm&#039;,\&lt;br /&gt;
 ASC_Antifreeze_Pos =&amp;gt;&#039;ASC_Antifreeze_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;}&lt;br /&gt;
 attr rg_ASC_Rollaeden_Level room 9.72_Rolladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== readingsGroup für Zeiten ===&lt;br /&gt;
&amp;lt;pre&amp;gt; define rg_ASC_Rollaeden_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Up_WE/Hol&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt; \&lt;br /&gt;
 (.*Rollladen.*|.*Rollladen|Jalousie_.*):level,?ASC_Time_Up_Early,?ASC_Time_Up_Late,?ASC_Time_Up_WE_Holiday,?ASC_Time_Down_Early,?ASC_Time_Down_Late,?ASC_Mode_Down,?ASC_Mode_Up&lt;br /&gt;
 setuuid rg_ASC_Rollaeden_Times 5c4308e1-f33f-abd1-94a7-fbf717635760f863&lt;br /&gt;
 attr rg_ASC_Rollaeden_Times commands {level =&amp;gt; &#039;pct:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100&#039;, \&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, \&lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;, \&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,\&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,  \&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt; &#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;, \&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;, \&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039; }&lt;br /&gt;
 attr rg_ASC_Rollaeden_Times room 9.72_Rolladen&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  readingsGroup für das Einstellen der Beschattungs-Attribute ===&lt;br /&gt;
[[Datei:ReadingsGroup ASC shading.png|350px|thumb|right|Beispiel]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod rg_ASC_Rolllaeden_Shading readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Modus&amp;gt;,&amp;lt;Position&amp;gt;,&amp;lt;Richtung&amp;gt;,&amp;lt;°links&amp;gt;,&amp;lt;°rechts&amp;gt;,&amp;lt;Min Elevation&amp;gt;,&amp;lt;Min Temp&amp;gt; (Rollladen|Jalousie)_.*..:?ASC_Shading_Mode,?ASC_Shading_Pos,?ASC_Shading_Direction,?ASC_Shading_Angle_Left,?ASC_Shading_Angle_Right,?ASC_Shading_Min_Elevation,?ASC_Shading_Min_OutsideTemperature&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading alias Rollläden: Beschattung&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading commands {ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:knob,min:0,max:100,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round&#039;,\&lt;br /&gt;
ASC_Shading_Mode =&amp;gt; &#039;ASC_Shading_Mode:always,home,absent,off&#039;,\&lt;br /&gt;
ASC_Shading_Direction =&amp;gt; &#039;ASC_Shading_Direction:knob,min:0,max:360,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:1,cursor:true,lineCap:round&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Left =&amp;gt; &#039;ASC_Shading_Angle_Left:knob,min:0,max:85,angleArc:85,rotation:anticlockwise,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round,angleOffset:270&#039;,\&lt;br /&gt;
ASC_Shading_Angle_Right =&amp;gt; &#039;ASC_Shading_Angle_Right:knob,min:0,max:85,angleArc:85,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:5,lineCap:round,&#039;,\&lt;br /&gt;
ASC_Shading_Min_Elevation =&amp;gt; &#039;ASC_Shading_Min_Elevation:knob,min:15,max:35,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:1,lineCap:round,angleArc:20,angleOffset:55,rotation:anticlockwise&#039;,\&lt;br /&gt;
ASC_Shading_Min_OutsideTemperature =&amp;gt; &#039;ASC_Shading_Min_OutsideTemperature:knob,min:5,max:25,width:50,height:50,fgColor:#FF9900,bgColor:#CCCCCC,step:0.5,lineCap:round,angleArc:120,angleOffset:270&#039;}&lt;br /&gt;
attr rg_ASC_Rolllaeden_Shading room Steuerung-&amp;gt;Rollladen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Die Farbgebung entspricht dem Standard, wenn unter dem Style f18 der Farbpreset &#039;&#039;dark&#039;&#039; gewählt wird. &lt;br /&gt;
===  readingsGroup für FIBARO Roller Shutter FGR-222 Devices ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Getestet von majestro84 https://forum.fhem.de/index.php/topic,92628.msg897099.html#msg897099; Stand 2019-01-28.}}&lt;br /&gt;
[[Datei:ASC Jalousien Level.JPG|600px|]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ASC Jalousien Times.JPG|600px|]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; define ASC_Jalousien_Times readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Stand&amp;gt;,&amp;lt;Time_Up_Early&amp;gt;,&amp;lt;Time_Up_WE&amp;gt;,&amp;lt;Time_Up_Late&amp;gt;,&amp;lt;Time_Down_Early&amp;gt;,&amp;lt;Time_Down_Late&amp;gt;,&amp;lt;Mode_Down&amp;gt;,&amp;lt;Mode_Up&amp;gt;,&amp;lt;PartyMode&amp;gt;,&amp;lt;LockOut&amp;gt; (.*_Jalousie.*):position,?ASC_Time_Up_Early,?ASC_Time_Up_WE_Holiday,?ASC_Time_Up_Late,?ASC_Time_Down_Early,?ASC_Time_Down_Late,?ASC_Mode_Down,?ASC_Mode_Up,?ASC_Partymode,?ASC_LockOut&lt;br /&gt;
 attr ASC_Jalousien_Times commands {position =&amp;gt; &#039;dim:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Mode_Down =&amp;gt; &#039;ASC_Mode_Down:always,absent,off&#039;,&lt;br /&gt;
 ASC_Mode_Up =&amp;gt; &#039;ASC_Mode_Up:always,absent,off&#039;,&lt;br /&gt;
 ASC_Partymode =&amp;gt; &#039;ASC_Partymode:on,off&#039;,&lt;br /&gt;
 ASC_LockOut =&amp;gt; &#039;ASC_LockOut:soft,hard,off&#039;,&lt;br /&gt;
 ASC_Time_Down_Early =&amp;gt; &#039;ASC_Time_Down_Early:15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00&#039;, &lt;br /&gt;
 ASC_Time_Down_Late  =&amp;gt; &#039;ASC_Time_Down_Late:20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30&#039;,&lt;br /&gt;
 ASC_Time_Up_Early =&amp;gt; &#039;ASC_Time_Up_Early:05:00,05:05,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_Late =&amp;gt;&#039;ASC_Time_Up_Late:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;,&lt;br /&gt;
 ASC_Time_Up_WE_Holiday =&amp;gt; &#039;ASC_Time_Up_WE_Holiday:06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00&#039;}&lt;br /&gt;
 attr ASC_Jalousien_Times room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; define Jalousien_Level readingsGroup &amp;lt;Gerät&amp;gt;,&amp;lt;Closed_Pos&amp;gt;,&amp;lt;Open_Pos&amp;gt;,&amp;lt;Comfort_Pos&amp;gt;,&amp;lt;Ventilate_Pos&amp;gt;,&amp;lt;PrivacyDown_Pos&amp;gt;,&amp;lt;Shading_Pos&amp;gt; (.*_Jalousie.*):?ASC_Closed_Pos,?ASC_Open_Pos,?ASC_ComfortOpen_Pos,?ASC_Ventilate_Pos,?ASC_PrivacyDown_Pos,?ASC_Shading_Pos&lt;br /&gt;
 attr Jalousien_Level commands { ASC_Closed_Pos =&amp;gt; &#039;ASC_Closed_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Open_Pos =&amp;gt; &#039;ASC_Open_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_ComfortOpen_Pos =&amp;gt; &#039;ASC_ComfortOpen_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Ventilate_Pos =&amp;gt; &#039;ASC_Ventilate_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_PrivacyDown_Pos =&amp;gt; &#039;ASC_PrivacyDown_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;,&lt;br /&gt;
 ASC_Shading_Pos =&amp;gt; &#039;ASC_Shading_Pos:0,10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,99&#039;}&lt;br /&gt;
 attr Jalousien_Level room Jalousien&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtungsbeispiel ==&lt;br /&gt;
=== Zielsetzung und Vorgaben ===&lt;br /&gt;
Es sollen alle Rollläden und Jalousien in einem Haus innerhalb bestimmter zeitlicher Grenzen Morgens und Abends sonnenstandsabhängig gefahren werden, an den Wochenenden und an Ferientagen soll etwas später geöffnet werden. Es sind Tür- und Fensterkontakte vorhanden (Türkontakte: twoState, Fensterkontakte: threeState), wobei bei jeder Öffnung ein eventuell geschlossener Rollladen geöffnet werden soll. Bei allen Rollladenaktoren, Tür- und Fensterkontakten handelt es sich um CUL_HM-Geräte.&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
Im global-Device sind Angaben zu latitude und longitude vorhanden, holiday2we wie folgt&amp;lt;ref&amp;gt;&#039;&#039;ferien&#039;&#039; ist eine automatisiert erstellte holiday-Datei nach diesem {{Link2Forum|Topic=85759|Message=885883|LinkText=Foren-Beitrag}}.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr global holiday2we bw,ferien&lt;br /&gt;
Weitere Angaben benötigen wir zunächst nicht, die Festlegung eines Astro-Devices erfolgt hier erst im Rahmen der Beschattung. &lt;br /&gt;
Dann erfolgt das &#039;&#039;Define des ASC-Devices&#039;&#039; wie oben beschrieben:&lt;br /&gt;
&amp;lt;code&amp;gt;define Rollladenautomatik AutoShuttersControl&amp;lt;/code&amp;gt;&lt;br /&gt;
Folgen die einzubindenden Rollladenaktoren einem einheitlichen Namensschema, können diese sodann z.B. mit &lt;br /&gt;
 attr (Jalousie|Rollladen)_.* ASC 2&lt;br /&gt;
auf einen Rutsch mit dem passenden ASC-Typ gekennzeichnet werden. Dann verteilen wir mir &lt;br /&gt;
 set Rollladenautomatik scanForShutters&lt;br /&gt;
die nachfolgend weiter zu bearbeitenden Attribute.&lt;br /&gt;
=== Schließen morgens und abends ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternative: Fahren nach brightness:&lt;br /&gt;
Will man insgesamt oder nur an einzelnen Rollläden stattdessen helligkeitsgesteuert fahren, muß für jeden Rollladen ein Helligkeitssensor definiert und entweder zentral oder am einzelnen Rollladen jeweils ein Höchst- bzw. Mindestwert festgelegt werden (&#039;&#039;ASC_BrightnessMinVal&#039;&#039; etc.), bei dessen Überschreitung geöffnet bzw. Unterschreitung geschlossen werden soll.}}&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Da wir sonnenstandsabhängig Fahrzeiten wollen, legen wir erst einmal fest, dass dies morgens und abends berücksichtigt werden soll:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeEvening CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoAstroModeMorning CIVIL&lt;br /&gt;
attr Rollladenautomatik ASC_autoShuttersControlEvening on&lt;br /&gt;
attr Rollladenautomatik ASC_autoShuttersControlMorning on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aus der Angabe &#039;&#039;CIVIL&#039;&#039; und den Vorgaben in den einzelnen Rollladen wird dabei mit Hilfe von [[SUNRISE_EL]] die effektive Fahrzeit berechnet, dort finden sich auch weitere Hinweise, zu den meisten anderen Optionen für die ersten beiden Attribute.&lt;br /&gt;
Bei allen Fensteröffnungen soll auf eine Lüften-Position gefahren werden, also schalten wir diese Funktion ebenfalls zentral an&amp;lt;ref&amp;gt;Sonst wird bei threeState-Sensoren nur bei &#039;&#039;tilted&#039;&#039; auf die in &#039;&#039;ASC_Ventilate_Pos&#039;&#039; gefahren.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladenautomatik ASC_autoShuttersControlComfort on &lt;br /&gt;
Zuletzt legen wir noch einen Temperatur-Sensor fest. Dieser wird beim Frostschutz sowie bei der Beschattung berücksichtigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Rollladenautomatik ASC_temperatureSensor Aussentemperatur_Nord&lt;br /&gt;
attr Rollladenautomatik ASC_temperatureReading temperature&lt;br /&gt;
attr Rollladenautomatik ASC_freezeTemp 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tbd: &lt;br /&gt;
* Rain&lt;br /&gt;
* Wind&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
===== Fahrzeiten =====&lt;br /&gt;
Zur Konfiguration der Fahrzeiten bietet es sich an, eine ReadingsGroup zu nutzen, wie unter [[#Hilfsmittel|Hilfsmittel]] dargestellt. Alternativ kann man die Zeiten auch manuell in den einzelnen Rollläden hinterlegen.&lt;br /&gt;
===== Bewohner =====&lt;br /&gt;
Wird ein Raum von einer oder mehreren bestimmten Person/en bewohnt oder gibt es ein Sammel-Gerät für mehrere Bewohner, kann dies mit den Attributen &#039;&#039;ASC_Roommate_Device&#039;&#039; und &#039;&#039;ASC_Roommate_Reading&#039;&#039; einem Rollladen zugeordnet werden. Ist einer der Bewohner &#039;&#039;asleep&#039;&#039;, wird morgens erst geöffnet, wenn auch der letzte Roommate nicht mehr &#039;&#039;asleep&#039;&#039; ist.&lt;br /&gt;
===== Fensterkontakte  =====&lt;br /&gt;
Dann werden ggf. vorhandene Fensterkontakte zugeordnet und der Typ festgelegt, wobei im Falle von threeState-Sensoren das übergreifende &#039;&#039;ASC_autoShuttersControlComfort&#039;&#039; beachtet wird, wobei dann bei vollstäniger Öffnung des Fensters auf den in &#039;&#039;ASC_ComfortOpen_Pos&#039;&#039; festgelegten Wert gefahren wird.&lt;br /&gt;
===== Frostschutz =====&lt;br /&gt;
Zuletzt können die Attribute &#039;&#039;ASC_Antifreeze&#039;&#039; und &#039;&#039;ASC_Antifreeze_Pos&#039;&#039; festgelegt werden, wenn die Frostschutzfunktion aktiviert werden soll.&lt;br /&gt;
=== Beschattung ===&lt;br /&gt;
==== Konfiguration des ASC-Devices ====&lt;br /&gt;
Benötigt werden Informationen zum Sonnenstand. Hierfür wird ein astro- oder twilight-Device benötigt. Ist ein solches definiert, wird dies - ggf. auch nach einem Neustart vom Modul automatisch erkannt und in das Attribut &#039;&#039;ASC_twilightDevice&#039;&#039; eingetragen. Wir legen daher zunächst ein entsprechendes Device an bzw. passen die Angabe ggf. an, wenn ein anderes als das eingetragene genutzt werden soll.&lt;br /&gt;
Weiter ist ein Temperatursensor für die Beschattung festzulegen (&#039;&#039;ASC_temperatureSensor.*&#039;&#039;-Attribute) wie bereits oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration der Rollladendevices ====&lt;br /&gt;
Zum einen legt man einen Helligkeitssensor fest (&#039;&#039;ASC_Brightness_Sensor&#039;&#039; und &#039;&#039;ASC_Brightness_Reading&#039;&#039;). Dieser ist der eigentliche Trigger. Nur, wenn sich der Brightness Wert ändert, werden Azimut, Elevation, Temperatur und die Ein- und Ausfallswinkel ausgelesen und/oder berechnet und basierend auf diesen Werten entschieden ob shading in oder shading out stattfinden soll, die Schwellwerte werden in &#039;&#039;ASC_Shading_StateChange_Sunny&#039;&#039; (Beschattung soll eingeschaltet werden) und &#039;&#039;ASC_Shading_StateChange_Cloudy&#039;&#039; (Beschattung soll beendet werden) festgelegt, wobei immer nur gefahren wird, wenn auch alles andere - insbesondere die Mindesthöhe des Sonnenstands (&#039;&#039;ASC_Shading_Min_Elevation&#039;&#039;) und die Mindesttemperatur &#039;&#039;ASC_Shading_Min_OutsideTemperature&#039;&#039; - passt.&lt;br /&gt;
Dann sind die Winkelangaben festzulegen, ggf. kann ein Kompass zu Hilfe genommen werden (&#039;&#039;ASC_Shading_Direction&#039;&#039; ist die Richtung des Fensters, 90 Grad entspricht Ost, 180 Grad Süden, &#039;&#039;ASC_Shading_Angle_Left&#039;&#039; ist der Sonneneintritt ins Zimmer, wird von -Direction abgezogen, &#039;&#039;ASC_Shading_Angle_Right&#039;&#039; hat diesselbe Funktion für den Austrittswinkel.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Funktionen ===&lt;br /&gt;
==== Privacy ====&lt;br /&gt;
Werden hierfür Werte festgelegt, werden die betreffenden Rollläden die festgelegte Zeit vor dem abendlichen Schließen vorab teilweise geschlossen. Dies kann z.B. gewünscht sein, um Rollläden zur Straße hin mit viel Fußgängerverkehr zwar nicht vollständig abzudunkeln, aber gleichzeitig zu verhindern, dass von außen in Wohnräume geschaut werden kann, sobald dort das Licht angeschaltet wird&lt;br /&gt;
==== BlockingTime====&lt;br /&gt;
Bewirkt, dass nach einer manuellen Fahrt wird eine vom ASC Modul initiierte Fahrt zunächst ausgesetzt wird, bis die im Attribute angegebene Zeit überschritten ist. Erst dann wird eine dann vom ASC Modul initiierte Fahrt tatsächlich durchgeführt.&lt;br /&gt;
Genau so wird ein hochfahren eines Rollos durch das ASC Modul nicht mehr ausgeführt wenn es innerhalb der Zeit von ASC_BlockingTime_beforNightClose und das runterfahren wird nicht mehr erfolgen wenn es innerhalb von ASC_BlockingTime_beforDayOpen ist.&lt;br /&gt;
Beispiel: Meine Tochter geht früh aus Haus und Ihre Rollos sind nicht hoch gefahren. Diese fahren auch nicht mehr hoch da die ausschließlich bei home (anwesend) fahren sollen. Nun kommt sie am Nachmittag um 16:23 Uhr nach Hause, eigentlich sollten nun die Rollos fahren. Doch die Sonnenuntergangsfahrt (schließen) wäre schon 16:51 Uhr und damit innerhalb der 3600 ASC_BlockingTime_beforNightClose. Die Rollos bleiben also unten. Es lohnt sich für die paar Minuten einfach nicht mehr.&lt;br /&gt;
==== wiggle====&lt;br /&gt;
Mit einem &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; wiggle&amp;lt;/code&amp;gt; können alle Rollladen mit einem entsprechenden Attribut zu einer kurzen Fahrt veranlasst werden, nach Ablauf von einer Minute wieder um denselben Wert zurück. Dabei wird jeweils in die Richtung gefahren, die den weiteren Weg ermöglicht. Wenn also zu 70% geschlossen ist, wird der Rollladen hoch fahren.&lt;br /&gt;
==== Partymode ====&lt;br /&gt;
Dieser wird am ASC-Device selbst aktiviert mittels &amp;lt;code&amp;gt;set &amp;lt;ASC-Device&amp;gt; partyMode on&amp;lt;/code&amp;gt;. Alle Rollladen-Devices, welche das Attribut &#039;&#039;ASC_Partymode&#039;&#039; auf &#039;&#039;on&#039;&#039; gestellt haben, werden nicht mehr gesteuert. Der letzte Schaltbefehl, der durch ein Fensterevent oder Bewohnerstatus an die Rollläden gesendet wurde, beim Beenden des Modus durch &amp;lt;code&amp;gt;set ASC-Device partyMode off&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
==== lock-out ====&lt;br /&gt;
(tbd auch hier: Doku ist etwas verteilt, könnte man im Wiki jeweils unter einem eigenen Unterabschnitt im Zusammenhang darstellen)&lt;br /&gt;
&lt;br /&gt;
==== SelfDefense ====&lt;br /&gt;
Das bei einem absent nur da die Rollläden geschlossen werden wo das Fenster vergessen wurde zu schließen.&lt;br /&gt;
Beim wechsel in gone wird nur an den makierten Terassentüren (&#039;&#039;ASC_ShuttersPlace terrace&#039;&#039;) der Rollladen runter gefahren.&lt;br /&gt;
Weitere Attribute dazu: &#039;&#039;ASC_Self_Defense_Exclude&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sonstige Hinweise ==&lt;br /&gt;
* Werden Attribute geändert, kann es vereinzelt vorkommen, dass das ASC-Modul dies nicht mitbekommt und das tatsächliche Verhalten nicht den Erwartungen entspricht. In so einem Fall empfielt es sich, das NOTIFYDEV nochmals aufbauen zu lassen mit &amp;lt;code&amp;gt;set &amp;lt;ASC-Modul&amp;gt; createNewNotifyDev&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=92628|LinkText=&amp;quot;Thread zum Modul im Forum&amp;quot;}}&lt;br /&gt;
* {{Link2Forum|Topic=90751|LinkText=&amp;quot;Thread zur Entwicklung im Forum&amp;quot;}} &lt;br /&gt;
* {{Link2Forum|Topic=73964|LinkText=&amp;quot;Thread zu den Scripten von user cluni&amp;quot;}}, die der Entwicklung des Moduls zugrunde liegen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen&amp;diff=28694</id>
		<title>EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen&amp;diff=28694"/>
		<updated>2018-12-16T11:47:25Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Probleme */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=452_FU-EBIM_JR_oT.jpg&lt;br /&gt;
|Bildbeschreibung=PEHA 452 FU-EBIM_JR o.T.&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Empfänger, Aktor und Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=2 (bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch &amp;lt; 0,5 W&lt;br /&gt;
|HWPoweredBy=230V~&lt;br /&gt;
|HWSize=&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Peha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen]] ist ein  &lt;br /&gt;
* Unterputzaktor&lt;br /&gt;
** 2-Kanal mit Positionserkennung&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Bidirektionaler 2-Kanal-Jalousieaktor mit Positionserkennung (und/durch Energiemessung)&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
Der Aktor kann nicht vollautomatisch per autocreate in FHEM angelegt werden. Die Einbindung in FHEM kann entweder über die Nutzung des gerätespezifischen EEP (empfohlen) &#039;&#039;&#039;oder&#039;&#039;&#039; über die manuelle Vorgehensweise erfolgen.  &lt;br /&gt;
&lt;br /&gt;
===== Nutzung des EEP =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* FHEM-Device &amp;lt;name&amp;gt; (hier: Jalousie) mit der Sender-ID des Aktors (hier: FFB4C911) und dem EEP für den Aktor (A5-11-03) durch Eingabe in das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] definieren:&lt;br /&gt;
: &amp;lt;code&amp;gt;define Jalousie EnOcean FFB4C911 A5-11-03&amp;lt;/code&amp;gt;&lt;br /&gt;
: Hierdurch wird ein FHEM-Device mit allen grundlegenden Attributen angelegt. Nur das Attribut &amp;lt;code&amp;gt;manufID&amp;lt;/code&amp;gt; sollte noch auf den unten im Config-Auszug gezeigten Wert für PEHA geändert werden, bevor das FHEM-Device am Aktor angelernt wird.&lt;br /&gt;
* Am Aktor anlernen&lt;br /&gt;
** Aktor in Lernmodus bringen&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set Jalousie teach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zum FHEM-Device wird bei der Anlage über das EEP automatisch ein Plot angelegt.&lt;br /&gt;
&lt;br /&gt;
===== Alternative: manuelle Vorgehensweise =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* EnOcean-FHEM-Device &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; mit der Sender-ID des Aktors definieren&lt;br /&gt;
* Das Attribut &amp;lt;code&amp;gt;subDef&amp;lt;/code&amp;gt; mit einer freien SenderId des TCMs anlegen ODER falls keine freie Sender-ID bekannt ist, das Attribut komplett weglassen, damit die Vergabe automatisch durch FHEM erfolgt&lt;br /&gt;
* Die Attribute &amp;lt;code&amp;gt;gwCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manufID&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;subType&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;subTypeSet&amp;lt;/code&amp;gt; wie nachfolgend im Config-Auszug anlegen&lt;br /&gt;
* Am Aktor anlernen&lt;br /&gt;
** Aktor in Lernmodus bringen&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; teach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Anschließend muss die Laufzeit für ein vollständiges Öffnen bzw. Schließen der Jalousie ermittelt werden: &lt;br /&gt;
&lt;br /&gt;
Dazu die Jalousie durch Ansteuerung mit FHEM 3x vollständig öffen bzw. schließen lassen. Bei aktuellen Aktorversionen ist danach die Laufzeit automatisch ermittelt. Im Reading &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; wird dann die aktuelle Position der Jalousie in % angezeigt und der Aktor kann mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; position position/% α/°&amp;lt;/code&amp;gt; prozentual -zusätzlich zu den laufzeitabhängigen Befehlen- angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Führt dieses Vorgehen nicht zu einer korrekten Anzeige der Position, so muss bei älteren Aktorversionen mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; runtimeSet &amp;lt;tu/s&amp;gt; &amp;lt;td/s&amp;gt;&amp;lt;/code&amp;gt; die Laufzeit für ein vollständiges Öffnen bzw. Schließen der Jalousie manuell gemessen und im Aktor hinterlegt werden. Die Laufzeitwerte können in diesem Fall nicht nachträglich vom Aktor abgefragt werden. Sie stehen &amp;quot;nur&amp;quot; in den Readings des Aktors. Es empfiehlt sich diese Werte separat festzuhalten. Hierzu kann man beispielsweise Attribut &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt; des FHEM-Device nutzen.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration]]:&lt;br /&gt;
 define Jalousie EnOcean FFB4C911                 &amp;lt;----- SenderId des Aktors&lt;br /&gt;
 attr Jalousie eep A5-11-03 &lt;br /&gt;
 attr Jalousie gwCmd blindCmd&lt;br /&gt;
 attr Jalousie manufID 001&lt;br /&gt;
 attr Jalousie subDef FFAEEE86                    &amp;lt;----- freie SenderID des TCM&lt;br /&gt;
 attr Jalousie subType shutterCtrlState.01&lt;br /&gt;
 attr Jalousie subTypeSet gateway&lt;br /&gt;
 attr Jalousie webCmd opens:stop:closes:position&lt;br /&gt;
&lt;br /&gt;
=== Logbeispiel ===&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie position: 40&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie anglePos: 0&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie alarm: off&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie endPosition: not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie shutterState: closes &lt;br /&gt;
 2014-09-13_12:28:58 Jalousie serviceOn: no&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie positionMode: normal&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie position: 50&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie anglePos: 0&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie alarm: off&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie endPosition: not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie shutterState: closes&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie serviceOn: no&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie positionMode: normal&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
In ersten Versionen des Aktors gab es Probleme mit der Winkelverstellung der Lammellen. Diese Probleme sollen in aktuellen Versionen behoben sein. Details: {{Link2Forum|Topic=40102|Message=336564}}&lt;br /&gt;
&lt;br /&gt;
Ausfälle sind häufig auf eine reduzierte Kapazität des X2-Kondensators im verwendeten Kondensatornetzteil zurück zu führen. Ersatz durch gleichen 470nF 305V X2 schafft Abhilfe. Allerdings muss auch der 270 V Varistor gegen einen 250 V Typ ausgetauscht werden, sonst hat man das Problem ein Jahr später wieder. Dieser Austausch betrifft sicherheitsrelevante Teile mit Netzspannung und darf nur durch Elektrofachkräfte durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== Anzeige Rollladenstand im WebFrontend ===&lt;br /&gt;
Durch die folgenden zwei Attribute wird der Rollladenstand im WebFrontend bildlich dargestellt und bei Fahrten animiert visualisiert (positionMode: inverse; einstellbar über den Befehl &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; positionLogic inverse&amp;lt;/code&amp;gt;):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Jalousie stateFormat position&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Jalousie devStateIcon 0:fts_shutter_100 100:fts_window_2w 1\d.*:fts_shutter_90 2\d.*:fts_shutter_80 3\d.*:fts_shutter_70 4\d.*:fts_shutter_60 5\d.*:fts_shutter_50 6\d.*:fts_shutter_40 7\d.*:fts_shutter_30 8\d.*:fts_shutter_20 9\d.*:fts_shutter_10 \d.*:fts_shutter_90&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt/Anleitung: [http://www.peha.de/cms/front_content.php?getFile=1&amp;amp;client=1&amp;amp;file=../../edi/import/de/Dokumente/PEHA_M_452FU_EBIM_JR_OT.pdf PDF]&lt;br /&gt;
* Forenbeitrag zur FHEM-Einbindung: {{Link2Forum|Topic=26692}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen&amp;diff=28688</id>
		<title>EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen&amp;diff=28688"/>
		<updated>2018-12-16T10:41:38Z</updated>

		<summary type="html">&lt;p&gt;50watt: Bild hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=452_FU-EBIM_JR_oT.jpg&lt;br /&gt;
|Bildbeschreibung=PEHA 452 FU-EBIM_JR o.T.&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Empfänger, Aktor und Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=2 (bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch &amp;lt; 0,5 W&lt;br /&gt;
|HWPoweredBy=230V~&lt;br /&gt;
|HWSize=&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Peha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen]] ist ein  &lt;br /&gt;
* Unterputzaktor&lt;br /&gt;
** 2-Kanal mit Positionserkennung&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Bidirektionaler 2-Kanal-Jalousieaktor mit Positionserkennung (und/durch Energiemessung)&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
Der Aktor kann nicht vollautomatisch per autocreate in FHEM angelegt werden. Die Einbindung in FHEM kann entweder über die Nutzung des gerätespezifischen EEP (empfohlen) &#039;&#039;&#039;oder&#039;&#039;&#039; über die manuelle Vorgehensweise erfolgen.  &lt;br /&gt;
&lt;br /&gt;
===== Nutzung des EEP =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* FHEM-Device &amp;lt;name&amp;gt; (hier: Jalousie) mit der Sender-ID des Aktors (hier: FFB4C911) und dem EEP für den Aktor (A5-11-03) durch Eingabe in das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] definieren:&lt;br /&gt;
: &amp;lt;code&amp;gt;define Jalousie EnOcean FFB4C911 A5-11-03&amp;lt;/code&amp;gt;&lt;br /&gt;
: Hierdurch wird ein FHEM-Device mit allen grundlegenden Attributen angelegt. Nur das Attribut &amp;lt;code&amp;gt;manufID&amp;lt;/code&amp;gt; sollte noch auf den unten im Config-Auszug gezeigten Wert für PEHA geändert werden, bevor das FHEM-Device am Aktor angelernt wird.&lt;br /&gt;
* Am Aktor anlernen&lt;br /&gt;
** Aktor in Lernmodus bringen&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set Jalousie teach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zum FHEM-Device wird bei der Anlage über das EEP automatisch ein Plot angelegt.&lt;br /&gt;
&lt;br /&gt;
===== Alternative: manuelle Vorgehensweise =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* EnOcean-FHEM-Device &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; mit der Sender-ID des Aktors definieren&lt;br /&gt;
* Das Attribut &amp;lt;code&amp;gt;subDef&amp;lt;/code&amp;gt; mit einer freien SenderId des TCMs anlegen ODER falls keine freie Sender-ID bekannt ist, das Attribut komplett weglassen, damit die Vergabe automatisch durch FHEM erfolgt&lt;br /&gt;
* Die Attribute &amp;lt;code&amp;gt;gwCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manufID&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;subType&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;subTypeSet&amp;lt;/code&amp;gt; wie nachfolgend im Config-Auszug anlegen&lt;br /&gt;
* Am Aktor anlernen&lt;br /&gt;
** Aktor in Lernmodus bringen&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; teach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Anschließend muss die Laufzeit für ein vollständiges Öffnen bzw. Schließen der Jalousie ermittelt werden: &lt;br /&gt;
&lt;br /&gt;
Dazu die Jalousie durch Ansteuerung mit FHEM 3x vollständig öffen bzw. schließen lassen. Bei aktuellen Aktorversionen ist danach die Laufzeit automatisch ermittelt. Im Reading &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; wird dann die aktuelle Position der Jalousie in % angezeigt und der Aktor kann mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; position position/% α/°&amp;lt;/code&amp;gt; prozentual -zusätzlich zu den laufzeitabhängigen Befehlen- angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Führt dieses Vorgehen nicht zu einer korrekten Anzeige der Position, so muss bei älteren Aktorversionen mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; runtimeSet &amp;lt;tu/s&amp;gt; &amp;lt;td/s&amp;gt;&amp;lt;/code&amp;gt; die Laufzeit für ein vollständiges Öffnen bzw. Schließen der Jalousie manuell gemessen und im Aktor hinterlegt werden. Die Laufzeitwerte können in diesem Fall nicht nachträglich vom Aktor abgefragt werden. Sie stehen &amp;quot;nur&amp;quot; in den Readings des Aktors. Es empfiehlt sich diese Werte separat festzuhalten. Hierzu kann man beispielsweise Attribut &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt; des FHEM-Device nutzen.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration]]:&lt;br /&gt;
 define Jalousie EnOcean FFB4C911                 &amp;lt;----- SenderId des Aktors&lt;br /&gt;
 attr Jalousie eep A5-11-03 &lt;br /&gt;
 attr Jalousie gwCmd blindCmd&lt;br /&gt;
 attr Jalousie manufID 001&lt;br /&gt;
 attr Jalousie subDef FFAEEE86                    &amp;lt;----- freie SenderID des TCM&lt;br /&gt;
 attr Jalousie subType shutterCtrlState.01&lt;br /&gt;
 attr Jalousie subTypeSet gateway&lt;br /&gt;
 attr Jalousie webCmd opens:stop:closes:position&lt;br /&gt;
&lt;br /&gt;
=== Logbeispiel ===&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie position: 40&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie anglePos: 0&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie alarm: off&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie endPosition: not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie shutterState: closes &lt;br /&gt;
 2014-09-13_12:28:58 Jalousie serviceOn: no&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie positionMode: normal&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie position: 50&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie anglePos: 0&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie alarm: off&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie endPosition: not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie shutterState: closes&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie serviceOn: no&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie positionMode: normal&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
In ersten Versionen des Aktors gab es Probleme mit der Winkelverstellung der Lammellen. Diese Probleme sollen in aktuellen Versionen behoben sein. Details: {{Link2Forum|Topic=40102|Message=336564}}&lt;br /&gt;
&lt;br /&gt;
Ausfälle sind häufig auf eine reduzierte Kapazität des X2-Kondensators im verwendenten Kondensatornetzteil zurück zu führen. Ersatz durch gleichen 470nF 305V X2 schafft Abhilfe. Allerdings muss auch der 270 V Varistor gegen einen 250 V Typ ausgetauscht werden, sonst hat man das Problem ein Jahr später wieder. Dieser Austausch betrifft sicherheitsrelevante Teile mit Netzspannung und darf nur durch Elektrofachkräfte durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== Anzeige Rollladenstand im WebFrontend ===&lt;br /&gt;
Durch die folgenden zwei Attribute wird der Rollladenstand im WebFrontend bildlich dargestellt und bei Fahrten animiert visualisiert (positionMode: inverse; einstellbar über den Befehl &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; positionLogic inverse&amp;lt;/code&amp;gt;):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Jalousie stateFormat position&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Jalousie devStateIcon 0:fts_shutter_100 100:fts_window_2w 1\d.*:fts_shutter_90 2\d.*:fts_shutter_80 3\d.*:fts_shutter_70 4\d.*:fts_shutter_60 5\d.*:fts_shutter_50 6\d.*:fts_shutter_40 7\d.*:fts_shutter_30 8\d.*:fts_shutter_20 9\d.*:fts_shutter_10 \d.*:fts_shutter_90&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt/Anleitung: [http://www.peha.de/cms/front_content.php?getFile=1&amp;amp;client=1&amp;amp;file=../../edi/import/de/Dokumente/PEHA_M_452FU_EBIM_JR_OT.pdf PDF]&lt;br /&gt;
* Forenbeitrag zur FHEM-Einbindung: {{Link2Forum|Topic=26692}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen&amp;diff=28687</id>
		<title>EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen&amp;diff=28687"/>
		<updated>2018-12-16T10:39:16Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=platzHalter.png&lt;br /&gt;
|Bildbeschreibung=todo&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Empfänger, Aktor und Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=2 (bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch &amp;lt; 0,5 W&lt;br /&gt;
|HWPoweredBy=230V~&lt;br /&gt;
|HWSize=&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Peha&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[EnOcean-D-452-FU-EBIM-JR-Aktor-Beschattungselemente-Rollladen]] ist ein  &lt;br /&gt;
* Unterputzaktor&lt;br /&gt;
** 2-Kanal mit Positionserkennung&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Bidirektionaler 2-Kanal-Jalousieaktor mit Positionserkennung (und/durch Energiemessung)&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
Der Aktor kann nicht vollautomatisch per autocreate in FHEM angelegt werden. Die Einbindung in FHEM kann entweder über die Nutzung des gerätespezifischen EEP (empfohlen) &#039;&#039;&#039;oder&#039;&#039;&#039; über die manuelle Vorgehensweise erfolgen.  &lt;br /&gt;
&lt;br /&gt;
===== Nutzung des EEP =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* FHEM-Device &amp;lt;name&amp;gt; (hier: Jalousie) mit der Sender-ID des Aktors (hier: FFB4C911) und dem EEP für den Aktor (A5-11-03) durch Eingabe in das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] definieren:&lt;br /&gt;
: &amp;lt;code&amp;gt;define Jalousie EnOcean FFB4C911 A5-11-03&amp;lt;/code&amp;gt;&lt;br /&gt;
: Hierdurch wird ein FHEM-Device mit allen grundlegenden Attributen angelegt. Nur das Attribut &amp;lt;code&amp;gt;manufID&amp;lt;/code&amp;gt; sollte noch auf den unten im Config-Auszug gezeigten Wert für PEHA geändert werden, bevor das FHEM-Device am Aktor angelernt wird.&lt;br /&gt;
* Am Aktor anlernen&lt;br /&gt;
** Aktor in Lernmodus bringen&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set Jalousie teach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zum FHEM-Device wird bei der Anlage über das EEP automatisch ein Plot angelegt.&lt;br /&gt;
&lt;br /&gt;
===== Alternative: manuelle Vorgehensweise =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* EnOcean-FHEM-Device &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; mit der Sender-ID des Aktors definieren&lt;br /&gt;
* Das Attribut &amp;lt;code&amp;gt;subDef&amp;lt;/code&amp;gt; mit einer freien SenderId des TCMs anlegen ODER falls keine freie Sender-ID bekannt ist, das Attribut komplett weglassen, damit die Vergabe automatisch durch FHEM erfolgt&lt;br /&gt;
* Die Attribute &amp;lt;code&amp;gt;gwCmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manufID&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;subType&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;subTypeSet&amp;lt;/code&amp;gt; wie nachfolgend im Config-Auszug anlegen&lt;br /&gt;
* Am Aktor anlernen&lt;br /&gt;
** Aktor in Lernmodus bringen&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; teach&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Anschließend muss die Laufzeit für ein vollständiges Öffnen bzw. Schließen der Jalousie ermittelt werden: &lt;br /&gt;
&lt;br /&gt;
Dazu die Jalousie durch Ansteuerung mit FHEM 3x vollständig öffen bzw. schließen lassen. Bei aktuellen Aktorversionen ist danach die Laufzeit automatisch ermittelt. Im Reading &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; wird dann die aktuelle Position der Jalousie in % angezeigt und der Aktor kann mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; position position/% α/°&amp;lt;/code&amp;gt; prozentual -zusätzlich zu den laufzeitabhängigen Befehlen- angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Führt dieses Vorgehen nicht zu einer korrekten Anzeige der Position, so muss bei älteren Aktorversionen mit &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; runtimeSet &amp;lt;tu/s&amp;gt; &amp;lt;td/s&amp;gt;&amp;lt;/code&amp;gt; die Laufzeit für ein vollständiges Öffnen bzw. Schließen der Jalousie manuell gemessen und im Aktor hinterlegt werden. Die Laufzeitwerte können in diesem Fall nicht nachträglich vom Aktor abgefragt werden. Sie stehen &amp;quot;nur&amp;quot; in den Readings des Aktors. Es empfiehlt sich diese Werte separat festzuhalten. Hierzu kann man beispielsweise Attribut &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt; des FHEM-Device nutzen.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration]]:&lt;br /&gt;
 define Jalousie EnOcean FFB4C911                 &amp;lt;----- SenderId des Aktors&lt;br /&gt;
 attr Jalousie eep A5-11-03 &lt;br /&gt;
 attr Jalousie gwCmd blindCmd&lt;br /&gt;
 attr Jalousie manufID 001&lt;br /&gt;
 attr Jalousie subDef FFAEEE86                    &amp;lt;----- freie SenderID des TCM&lt;br /&gt;
 attr Jalousie subType shutterCtrlState.01&lt;br /&gt;
 attr Jalousie subTypeSet gateway&lt;br /&gt;
 attr Jalousie webCmd opens:stop:closes:position&lt;br /&gt;
&lt;br /&gt;
=== Logbeispiel ===&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie position: 40&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie anglePos: 0&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie alarm: off&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie endPosition: not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie shutterState: closes &lt;br /&gt;
 2014-09-13_12:28:58 Jalousie serviceOn: no&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie positionMode: normal&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie position: 50&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie anglePos: 0&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie alarm: off&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie endPosition: not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie not_reached&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie shutterState: closes&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie serviceOn: no&lt;br /&gt;
 2014-09-13_12:28:58 Jalousie positionMode: normal&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
In ersten Versionen des Aktors gab es Probleme mit der Winkelverstellung der Lammellen. Diese Probleme sollen in aktuellen Versionen behoben sein. Details: {{Link2Forum|Topic=40102|Message=336564}}&lt;br /&gt;
&lt;br /&gt;
Ausfälle sind häufig auf eine reduzierte Kapazität des X2-Kondensators im verwendenten Kondensatornetzteil zurück zu führen. Ersatz durch gleichen 470nF 305V X2 schafft Abhilfe. Allerdings muss auch der 270 V Varistor gegen einen 250 V Typ ausgetauscht werden, sonst hat man das Problem ein Jahr später wieder. Dieser Austausch betrifft sicherheitsrelevante Teile mit Netzspannung und darf nur durch Elektrofachkräfte durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== Anzeige Rollladenstand im WebFrontend ===&lt;br /&gt;
Durch die folgenden zwei Attribute wird der Rollladenstand im WebFrontend bildlich dargestellt und bei Fahrten animiert visualisiert (positionMode: inverse; einstellbar über den Befehl &amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; positionLogic inverse&amp;lt;/code&amp;gt;):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Jalousie stateFormat position&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Jalousie devStateIcon 0:fts_shutter_100 100:fts_window_2w 1\d.*:fts_shutter_90 2\d.*:fts_shutter_80 3\d.*:fts_shutter_70 4\d.*:fts_shutter_60 5\d.*:fts_shutter_50 6\d.*:fts_shutter_40 7\d.*:fts_shutter_30 8\d.*:fts_shutter_20 9\d.*:fts_shutter_10 \d.*:fts_shutter_90&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt/Anleitung: [http://www.peha.de/cms/front_content.php?getFile=1&amp;amp;client=1&amp;amp;file=../../edi/import/de/Dokumente/PEHA_M_452FU_EBIM_JR_OT.pdf PDF]&lt;br /&gt;
* Forenbeitrag zur FHEM-Einbindung: {{Link2Forum|Topic=26692}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:452_FU-EBIM_JR_oT.jpg&amp;diff=28686</id>
		<title>Datei:452 FU-EBIM JR oT.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:452_FU-EBIM_JR_oT.jpg&amp;diff=28686"/>
		<updated>2018-12-16T10:36:52Z</updated>

		<summary type="html">&lt;p&gt;50watt: PEHA D-452-FU-EBI-JR&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
PEHA D-452-FU-EBI-JR&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Anwesenheitssimulation&amp;diff=27613</id>
		<title>Anwesenheitssimulation</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Anwesenheitssimulation&amp;diff=27613"/>
		<updated>2018-08-05T15:29:44Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Beispiel: Lichter schalten */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine häufige Anwendung von Hausautomatisierungstechnik ist die Anwesenheitssimulation.&lt;br /&gt;
Dabei sollen automatisch bei Abwesenheit Aktivitäten simuliert werden, die dem Beobachter von außen den Eindruck vermitteln das Haus sein bewohnt.&lt;br /&gt;
__TOC__&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Denkbar sind eine ganze Reihe von Aktivitäten:&lt;br /&gt;
* Lichter ein- und ausschalten&lt;br /&gt;
* Geräusche abspielen&lt;br /&gt;
* Rollläden bewegen&lt;br /&gt;
* Betrieb eines Fernsehers simulieren&lt;br /&gt;
* Rasensprenger ein- und ausschalten&lt;br /&gt;
* Verstellbare Antennen, Kameras o.Ä. bewegen&lt;br /&gt;
Jeder Aktor der von außen wahrnehmbar ist könnte zur Anwendung kommen.&lt;br /&gt;
Entscheiden dabei ist die glaubwürdige Erscheinung dieser Aktivitäten.&lt;br /&gt;
Ist die Simulation von außen als solche erkennbar, so bewirkt sie gerade das Gegenteil von dem, was man damit erreichen möchte.&lt;br /&gt;
Ein potentieller Einbrecher würde durch die Anwesenheitssimulation nicht abgeschreckt sondern angelockt.&lt;br /&gt;
&lt;br /&gt;
Eher ungeeignete Beispiele sind Zeitschaltuhren die nur in ein oder zwei Räumen immer zur gleichen Zeit das Licht einschalten.&lt;br /&gt;
Im Handel werden gerade für die Simulation von Fernsehern teilweise extrem schlechte Geräte angeboten.&lt;br /&gt;
Sie spielen zyklisch immer das gleiche Muster mit teilweise harten, auffälligen und einprägsamen Farbwechseln.&lt;br /&gt;
Ist dann der Zyklus auch noch relativ kurz, ist jedem Beobachter sehr schnell klar, dass in diesem Haus eine Simulation läuft.&lt;br /&gt;
&lt;br /&gt;
Betätigungszeiten von Lampen und Rollläden sollten den üblichen Gewohnheiten der Bewohner entsprechen, aber nicht mit messbar mechanischer Präzision durchgeführt werden.&lt;br /&gt;
Gerade organisierte Banden reduzieren ihr Risiko durch sorgfältige Beobachtung, was sich heutzutage mit wetterfesten Action/Wild-Kameras sehr einfach und unauffällig bewerkstelligen lässt.&lt;br /&gt;
Es sollte nie vergessen werden, dass die gegnerische Seite auch über technische Möglichkeiten verfügt.&lt;br /&gt;
Zeigt ein solches Video präzise wiederkehrende Schaltzeiten, werden die Lichter wohl kaum von Bewohnern betätigt.&lt;br /&gt;
&lt;br /&gt;
Eine perfekte Anwesenheitssimulation ist extrem aufwändig wenn nicht unmöglich.&lt;br /&gt;
Der Briefkasten müssten geleert werden, Vorhänge bewegt, die Einfahrt gefegt und nicht zuletzt sollte man ab und zu jemanden sehen der dort wohnt.&lt;br /&gt;
Manche Einbrecher präparieren die Haustüre (stecken z.B. etwas in den Türspalt) um einige Tage danach sehen zu können ob die Türe überhaupt einmal bewegt wurde.&lt;br /&gt;
Kaum jemand wird seine Hausautomatisierung hin und wieder die Haustüre entriegeln und öffnen lassen.&lt;br /&gt;
&lt;br /&gt;
== Methoden ==&lt;br /&gt;
Anwesenheitssimulation ist immer ein Kompromiss zwischen Aufwand und Glaubwürdigkeit.&lt;br /&gt;
&lt;br /&gt;
=== Statistik ===&lt;br /&gt;
Für Betätigungszeiten von Lampen und Jalousien gibt es Systeme die über die Betätigungszeiten der Bewohner eine Statistik erstellen.&lt;br /&gt;
Sind die Bewohner nicht anwesend, führt das System zu ähnlichen aber eben nicht exakt gleichen Zeiten Betätigungen aus.&lt;br /&gt;
Im einfachsten Fall werden für jedes Signal (z.B. Licht an/aus) Wahrscheinlichkeitsverteilungen bestimmt.&lt;br /&gt;
Bei der Simulation wird dann regelmäßig &amp;quot;gewürfelt&amp;quot; ob das Signal betätigt werden soll.&lt;br /&gt;
&lt;br /&gt;
Komplizierter (aber auch glaubwürdiger) wird es, wenn man Zusammenhänge zwischen Signalen berücksichtigt.&lt;br /&gt;
Ein Bewohner schaltet jeden Abend in einem bestimmten Raum das Licht an und lässt gleich darauf den Rollladen herunter.&lt;br /&gt;
Bei der reinen Betrachtung einzelner Betätigungen könnte es vorkommen, dass erst der Rollladen herunter gelassen wird und man das danach eingeschaltete Licht nicht sieht.&lt;br /&gt;
Die dafür nötigen Auswertungen des Verhaltens der Bewohner sind deutlich aufwändiger.&lt;br /&gt;
&lt;br /&gt;
Ein Kompromiss ist die explizite Vorgabe von Zusammenhängen, so dass das Hausautomatisierungssystem wieder nur die Verteilungen bestimmen muss.&lt;br /&gt;
Geht z.B. nachts jemand auf die Toilette, so schaltet er erst das Licht im Gang an und etwas später in der Toilette.&lt;br /&gt;
Auf dem Rückweg dann umgekehrt.&lt;br /&gt;
Eine Simulation sollte also so eingestellt werden, dass vor dem Einschalten der Toilettenbeleuchtung auch der Gang eingeschaltet wird und auch etwas länger an bleibt.&lt;br /&gt;
&lt;br /&gt;
=== Vernetzung ===&lt;br /&gt;
Die Vernetzung von Sensoren und Aktoren bei der Hausautomatisierung erlaubt es außerdem, Reaktionen wesentlich vielfältiger als üblich zu gestalten.&lt;br /&gt;
Außenbeleuchtung mit Bewegungsmeldern sind jedem Einbrecher wohl bekannt.&lt;br /&gt;
Es ist vielleicht lästig plötzlich im Licht zu stehen aber erschrecken kann man damit niemanden.&lt;br /&gt;
Wesentlich irritierender ist es, wenn plötzlich im Haus ein Licht oder Geräusch an geht.&lt;br /&gt;
In diesem Fall ist der Zusammenhang zum Bewegungsmelder nicht unmittelbar erkennbar&lt;br /&gt;
Die einfache Vernetzung ermöglicht hier schon einen verbesserten Effekt.&lt;br /&gt;
Mit etwas Fantasie lassen sich andere Anwendungen finden.&lt;br /&gt;
Tagsüber könnte ein Bewegungsmelder statt eines Lichts z.B. den Rasensprenger einschalten.&lt;br /&gt;
&lt;br /&gt;
== Möglichkeiten in FHEM ==&lt;br /&gt;
* [[RandomTimer|98_RandomTimer.pm]] &#039;&#039;Hilfsmodul, mit dem in einem bestimmten Zeitraum zu zufälligen Zeitpunkten Schaltvorgänge ausgelöst werden können&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: Lichter schalten ===&lt;br /&gt;
Im Handel sind Schaltuhren mit Zufallsfunktion. Diese müssen aber oft umständlich eingestellt werden und lassen sich dann oft auch nicht anderweitig schalten. Man müsste immer wenn man das Haus länger verlässt die Schaltuhren alle aktivieren.&lt;br /&gt;
Komfortabler und auch nicht unbedingt teurer geht das mit FHEM.&lt;br /&gt;
Man benötigt &lt;br /&gt;
# ein Gerät auf dem FHEM läuft (z.B. ein [[Raspberry_Pi|Raspberry Pi]] oder [[BeagleBone Black]]) mit&lt;br /&gt;
# einem [[CUL]] und &lt;br /&gt;
# ein paar preiswerte Funkschalter (z.B. intertechno ITR-1500 drei Stück für unter 28€).&lt;br /&gt;
Damit lässt sich ein System zur zentralen Steuerung von Lampen, Fernsehern, Radios u.A. realisieren.&lt;br /&gt;
Das FHEM installieren und den [[CUL]] konfigurieren.&lt;br /&gt;
Dann die Funkschalter im FHEM mit einem frei gewählten 26-Bit Code anmelden (siehe [[Intertechno_Code_Berechnung#Definition]]).&lt;br /&gt;
 define sw_it_01 IT 01010101010101010101010101 0 0000&lt;br /&gt;
 define sw_it_02 IT 01010101010101010101010101 0 0001&lt;br /&gt;
 define sw_it_03 IT 01010101010101010101010101 0 0010&lt;br /&gt;
Wer möchte kann auch jedem Schalter seinen eigenen 26-Bit Code geben.&lt;br /&gt;
Dem Modul mitteilen, dass es sich um gewöhnliche Schalter (keine Dimmer) handelt.&lt;br /&gt;
 attr sw_it_XX model itswitch&lt;br /&gt;
Das &amp;lt;code&amp;gt;XX&amp;lt;/code&amp;gt; muss für jeden Schalter durch seine Nummer ersetzt werden.&lt;br /&gt;
Jetzt kann man auf der Anzeige &amp;quot;Everything&amp;quot; die Schalter finden und durch klick auf &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; betätigen. Um die Funkschalter an zu lernen muss man in den ersten 5 Sekunden nach dem Einstecken die Funktion &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; betätigen. Hat man das für alle Schalter durchgeführt, kann man sie jetzt über FHEM bedienen.&lt;br /&gt;
&lt;br /&gt;
==== Zufällig ====&lt;br /&gt;
Um eine zufällige Betätigung zu erreichen, kann das Modul [[RandomTimer]] verwendet werden:&lt;br /&gt;
 define &amp;lt;name&amp;gt; RandomTimer &amp;lt;timespec_start&amp;gt; &amp;lt;device&amp;gt; &amp;lt;timespec_stop&amp;gt; [&amp;lt;timeToSwitch&amp;gt;]&lt;br /&gt;
Wollen wir z.B. den Schalter &amp;lt;code&amp;gt;sw_it_01&amp;lt;/code&amp;gt; zwischen 20:00 und 22:00 für eine Stunden einschalten können wir das mit diesem Befehl erreichen:&lt;br /&gt;
 define rand_sw_01 RandomTimer 20:00 sw_it_01 22:00 3600&lt;br /&gt;
&lt;br /&gt;
==== Sonnenauf und -untergang ====&lt;br /&gt;
Das Modul [[SUNRISE_EL]] stellt die anhand der geographischen Position errechneten Zeiten für den Sonnenaufgang und den Sonnenuntergang zur Verfügung.&lt;br /&gt;
Dazu stellt man zunächst die eigene Position ein (z.B. Berlin):&lt;br /&gt;
 attr global latitude 52.51861&lt;br /&gt;
 attr global longitude 13.40833&lt;br /&gt;
Soll der Funkschalter &amp;lt;code&amp;gt;sw_it_01&amp;lt;/code&amp;gt; immer Nachts eingeschaltet sein erreicht man das mit&lt;br /&gt;
 define sw_it_01_aus at *{sunrise(0)} set sw_it_01 off&lt;br /&gt;
 define sw_it_01_ein at *{sunset(0)}  set sw_it_01 on&lt;br /&gt;
Optional kann man den Zeitraum noch vorgeben (siehe [[SUNRISE_EL]]).&lt;br /&gt;
Eine ähnliche Funktion unter Einbeziehung der Wetterlage bietet das Modul [[Twilight]].&lt;br /&gt;
Mit ihm kann ein Twilight-Objekt für Berlin angelegt werden:&lt;br /&gt;
 define myTL Twilight 52.51861 13.40833 1 638242&lt;br /&gt;
Die letzte Ziffer ist die Yahoo-Wetter-ID die man im [https://www.yahoo.com/news/weather/ Yahoo-Wetter-Dienst] ermitteln kann indem man {{Taste|Change location}} betätigt und dann die Nummer der URL entnimmt.&lt;br /&gt;
Dieses Twilight-Objekt kann nun für Schaltaktionen verwendet werden.&lt;br /&gt;
 define sw_it_01_ein at *{twilight(&amp;quot;myTL&amp;quot;,&amp;quot;sr_indoor&amp;quot;,&amp;quot;7:30&amp;quot;,&amp;quot;9:00&amp;quot;)} set sw_it_01 on&lt;br /&gt;
 define sw_it_01_aus at *{twilight(&amp;quot;myTL&amp;quot;,&amp;quot;ss_indoor&amp;quot;,&amp;quot;17:30&amp;quot;,&amp;quot;22:30&amp;quot;)} set sw_it_01 off&lt;br /&gt;
&lt;br /&gt;
==== Kombination Zufall und Sonnenlauf ====&lt;br /&gt;
Die Start- und Stopzeit des [[RandomTimer]] kann auch von rechnerischen Sonnenunter- oder -aufgang abhängig gemacht werden:&lt;br /&gt;
 define rand_sw_01 RandomTimer *{sunset_abs()} sw_it_01 *{sunset_abs(3*3600)} 3600&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Lampen schalten ===&lt;br /&gt;
* [[:Kategorie:Schalter (Empfänger)]]&lt;br /&gt;
* [[FS20 ST Steckdosenfunkschalter]]&lt;br /&gt;
* Funkschalter von Intertechno u.Ä. (siehe [[Intertechno Code Berechnung]])&lt;br /&gt;
&lt;br /&gt;
=== Rollläden, Jalousien u.Ä. ===&lt;br /&gt;
* [[:Kategorie:Rollladensteuerung]]&lt;br /&gt;
* [[EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen]]&lt;br /&gt;
* [[EnOcean-FSB14-RS485-Bus-Schaltaktor-2-Kanal-Beschattungselemente-Rollladen]]&lt;br /&gt;
&lt;br /&gt;
=== Betrieb eines Fernsehers simulieren ===&lt;br /&gt;
* [[HM-LC-RGBW-WM Funk-RGBW-Controller]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Anwesenheitssimulation Anwesenheitssimulation] in der deutsche Wikipedia&lt;br /&gt;
* [http://www.elv.de/mein-elv-projekt-anwesenheitssimulation.html ELV - Wissen immer noch alle, dass Sie nicht da sind?]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HOMEMODE&amp;diff=27593</id>
		<title>HOMEMODE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HOMEMODE&amp;diff=27593"/>
		<updated>2018-08-02T20:14:10Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Grundkonfiguration */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul wurde entworfen um den gesamten Heim-/Hausstatus in einem Gerät abzubilden und viele grundlegende Automationen durch Hinzufügen weiterer Geräte bereitzustellen.&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HOMEMODE&lt;br /&gt;
|ModFTopic=64317&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=22_HOMEMODE.pm&lt;br /&gt;
|ModOwner=DeeSPe&lt;br /&gt;
}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls &#039;&#039;22_HOMEMODE.pm&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Das Modul &#039;&#039;22_HOMEMODE.pm&#039;&#039; wurde entworfen um den gesamten Heim-/Hausstatus in einem Gerät abzubilden.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier aufgeführte Anleitung entspricht dem Modul in Version 1.4.2.&lt;br /&gt;
&lt;br /&gt;
Viele allgemein typische Automationen sind bereits fertig integriert.&lt;br /&gt;
&lt;br /&gt;
Die jeweils per Event auszuführenden Befehle können in den entsprechenden &#039;&#039;HomeCMD...&#039;&#039; Atributen hinterlegt werden und so in der Detail Ansicht des HOMEMODE Geräts übersichtlich angezeigt und bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen vieler notify/DOIF ist durch den Einsatz von &#039;&#039;HOMEMODE&#039;&#039; unnötig.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wurde das Modul für die Verwendung mit HomeKit als GUI optimiert. Alle möglichen Mappings für Homebridge sind bereits enthalten und können über einen set Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:HOMEMODE_Device.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
Um Modul &#039;&#039;22_HOMEMODE.pm&#039;&#039; benutzen zu können benötigt man als Mindestvoraussetzung ein bereits angelegtes RESIDENTS Gerät mit entsprechenden ROOMMATE/GUEST Geräten.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Automationen==&lt;br /&gt;
Alle Automationen sind optional.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele:&lt;br /&gt;
*Änderung des Zustands von ROOMMATE/GUEST Geräten anhand von PRESENCE Geräten&lt;br /&gt;
*Bereistellung von CMD Attributen für mögliche Events rund um den Heim-/Hausstatus&lt;br /&gt;
*Bereistellung von Platzhaltern innerhalb der CMD Attribute, z.B. %MODE%, %SEASON% oder %PREVMODE% für die Werte der Readings mode, season und prevMode&lt;br /&gt;
*Einbindung von Kontakt Sensoren, für z.B. Offen-Warnungen nach bestimmten Zeitraum oder Alarm Meldungen in bestimmten Alarm Modus - kann pro Kontakt Sensor konfiguriert werden&lt;br /&gt;
*Einbindung von Bewegungs Sensoren, für z.B. automatische Licht Schaltungen oder Alarm Meldungen in bestimmten Alarm Modus - kann pro Bewegungs Sensor konfiguriert werden&lt;br /&gt;
*Darstellungen und Auslösen von Sabotage Alarmen der eingebundenen Kontakt- und Bewegungssensoren&lt;br /&gt;
*Einbindung von jeweils einem Temperatur und Luftfeuchtigkeitssensor&lt;br /&gt;
*Einbindung eines lokalen Yahoo Wetter Devices zur Ermittlung und Ausgabe der lokalen Wetterdaten und Erzeugung der Wettervorhersage&lt;br /&gt;
*Einbindung von Power und Energy Sensoren zur Ermittlung der Gesamtmengen&lt;br /&gt;
*Einbindung von Calendar/holiday Devices für spezielle im HOMEMODE Device verfügbar zu machende Events&lt;br /&gt;
*von Uhrzeit abhängiger Anwesend-Modus&lt;br /&gt;
*Bewohner unabhängige Tageszeit-Modus&lt;br /&gt;
*Alarm-Modus&lt;br /&gt;
*DND-Modus&lt;br /&gt;
*Überwachung von Batteriewerten&lt;br /&gt;
&lt;br /&gt;
=HOMEMODE-Gerät=&lt;br /&gt;
==Definition==&lt;br /&gt;
Das HOMEMODE Gerät - hier mit dem Namen &#039;&#039;Home&#039;&#039; versehen - selbst wird über&lt;br /&gt;
 define Home HOMEMODE&lt;br /&gt;
bei Vorhandensein nur eines RESIDENTS Geräts definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung mehrerer RESIDENTS Geräte muss das Master RESIDENTS Gerät beim Definieren mit angegeben werden&lt;br /&gt;
 define Home HOMEMODE rgr_Residents&lt;br /&gt;
Dieses Modul verwendet das globale Attribut &#039;&#039;language&#039;&#039; zur Bestimmung der Anzeigedaten (Standard: EN=english). Für deutsche Ausgabedaten kann das Attribut&lt;br /&gt;
 attr global language DE&lt;br /&gt;
gesetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Alternativ kann auch nur das HOMEMODE Gerät auf deutsch geändert werden&lt;br /&gt;
 attr Home HomeLanguage DE&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle==&lt;br /&gt;
&#039;&#039;set &amp;lt;required&amp;gt; [optional]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 set Home anyoneElseAtHome &amp;lt;on/off&amp;gt;&lt;br /&gt;
einschalten wenn jemand anderes zu Hause ist der kein registrierter ROOMMATE/GUEST ist, z.B. Hund/Katze oder unregistrierte Gäste&amp;lt;br&amp;gt;&lt;br /&gt;
wenn eingeschaltet, dann wird der Alarm Mode beim Verlassen statt auf armaway nur auf armhome gestellt&amp;lt;br&amp;gt;&lt;br /&gt;
schaltet man ein und hat schon Haus/Wohnung verlassen, so wird der Alarm Mode von armaway auf armhome gestellt&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%AEAH%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home dnd &amp;lt;on/off&amp;gt;&lt;br /&gt;
schaltet den &amp;quot;Bitte nicht stören&amp;quot; Modus ein&amp;lt;br&amp;gt;&lt;br /&gt;
z.B. um Benachrichtigungen zu deaktivieren&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DND%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home dnd-for-minutes &amp;lt;MINUTES&amp;gt;&lt;br /&gt;
schaltet den &amp;quot;Bitte nicht stören&amp;quot; Modus für die angegebenen Minuten ein&amp;lt;br&amp;gt;&lt;br /&gt;
kehrt danach zum vorherigen (tageszeitabhängigen) Modus zurück&lt;br /&gt;
&lt;br /&gt;
 set Home deviceDisable &amp;lt;DEVICE&amp;gt;&lt;br /&gt;
deaktiviert das Gerät für sämtliche HOMEMODE Automationen&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DISABLED%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DEVICE%&#039;&#039;&#039; und &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home deviceEnable &amp;lt;DEVICE&amp;gt;&lt;br /&gt;
reaktiviert das Gerät für sämtliche HOMEMODE Automationen&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DISABLED%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DEVICE%&#039;&#039;&#039; und &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home location &amp;lt;arrival/home/bed/underway/wayhome&amp;gt;&lt;br /&gt;
manueller Ortswechsel&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%LOCATION%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home mode &amp;lt;morning/day/afternoon/evening/night/gotosleep/asleep/absent/gone/home&amp;gt;&lt;br /&gt;
manueller Moduswechsel&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%MODE%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVMODE%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home modeAlarm &amp;lt;armaway/armhome/armnight/disarm&amp;gt;&lt;br /&gt;
schaltet den angegebenen Alarm Modus ein&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%AMODE%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVAMODE%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home modeAlarm-for-minutes &amp;lt;armaway/armhome/armnight/disarm&amp;gt; &amp;lt;MINUTES&amp;gt;&lt;br /&gt;
schaltet den angegebenen Alarm Modus für die angegebenen Minuten ein&lt;br /&gt;
kehrt danach zum vorherigen Alarm Modus zurück&lt;br /&gt;
&lt;br /&gt;
 set Home updateHomebridgeMapping&lt;br /&gt;
aktualisiert das Attribut homebridgeMapping des HOMEMODDE Device abhängig von den verfügbaren Informationen&lt;br /&gt;
&lt;br /&gt;
 set Home updateInternalForce&lt;br /&gt;
führt eine Aktualisierung der Internals des HOMEMODE Device aus&amp;lt;br&amp;gt;&lt;br /&gt;
das sollte manuell benutzt werden nachdem das Modul aktualisiert und nur ein reload statt restart gemacht wurde&amp;lt;br&amp;gt;&lt;br /&gt;
auch wenn man überwachte/kontrollierte Geräte ändert sollte man diesen Befehl manuell ausführen, z.B. neue ROOMMATE/GUEST im RESIDENTS Device hinzufügt, oder Geräte in FHEM hinzufügt die dem selben Devspec wie bisher entsprechen (Steckdosen, Sensoren)&lt;br /&gt;
&lt;br /&gt;
==Get-Befehle==&lt;br /&gt;
&#039;&#039;get &amp;lt;required&amp;gt; [optional]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 get Home contactsOpen &amp;lt;all/doorsinside/doorsoutside/doorsmain/outside/windows&amp;gt;&lt;br /&gt;
Liste von all/doorsinside/doorsoutside/doorsmain/outside/windows offenen Kontakten&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%OPEN%&#039;&#039;&#039;, &#039;&#039;&#039;%OPENCT%&#039;&#039;&#039; und &#039;&#039;&#039;%OPENHR%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home devicesDisabled&lt;br /&gt;
Anzeige der für HOMEMODE deaktivierten Geräte&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DISABLED%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home mode&lt;br /&gt;
Anzeige von mode&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%MODE%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home modeAlarm&lt;br /&gt;
Anzeige von modeAlarm&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%AMODE%&#039;&#039;&#039; und &#039;&#039;&#039;%MODEALARM%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home publicIP&lt;br /&gt;
holen der öffentlichen IP Adresse&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%IP%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home sensorsTampered&lt;br /&gt;
Liste aller sabotierten Sensoren&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%TAMPERED%&#039;&#039;&#039;, &#039;&#039;&#039;%TAMPEREDCT%&#039;&#039;&#039; und &#039;&#039;&#039;%TAMPEREDHR%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home weather &amp;lt;long/short&amp;gt;&lt;br /&gt;
Wetterinfo im angegebenen Format anzeigen&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%WEATHER%&#039;&#039;&#039; und &#039;&#039;&#039;%WEATHERLONG%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home weatherForecast [TAG]&lt;br /&gt;
Wettervorhersage für angegebenen Tag&amp;lt;br&amp;gt;&lt;br /&gt;
wenn kein Tag angegeben wird, so wird die Vorhersage für morgen (2) ausgegeben&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%FORECAST%&#039;&#039;&#039; (morgen) und &#039;&#039;&#039;%FORECASTTODAY%&#039;&#039;&#039; (heute) sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
==webCmd==&lt;br /&gt;
Die Schaltmöglichkeiten sind absichtlich gering gehalten, denn im normalen Betrieb sollte nicht mehr benötigt werden als die hier gebotenen.&amp;lt;br&amp;gt;&lt;br /&gt;
Es lässt sich der Alarm Mode manuell umschalten und beim Klick auf das devStateIcon wird der DND Mode an- und ausgeschaltet.&lt;br /&gt;
&lt;br /&gt;
=Konfiguration=&lt;br /&gt;
&lt;br /&gt;
==Grundkonfiguration==&lt;br /&gt;
&lt;br /&gt;
Diese Grundkonfiguration sollte immer als erstes erfolgen um entsprechend darauf weiter aufzubauen. Als zweiter Schritt ist dann die erweiterte Konfiguration angedacht.&lt;br /&gt;
&lt;br /&gt;
Bei der Namensvergabe der Attribute vom HOMEMODE Device wurde nach einem möglichst kurzem Prefix gesucht und nach vielen Tests wurde sich für das Prefix &amp;quot;Home&amp;quot; entschieden. Das hat den Vorteil, dass alle Attribute beisammen stehen und diese auch (durch den Großbuchstaben am Anfang) ziemlich weit oben in der Liste der Attribute stehen. Ebenso wurde bei der Namensvergabe versucht, selbsterklärende Namen zu wählen. Das hat den Vorteil, dass man relativ einfach genau erkennen kann wofür das Attribut steht, allerdings auch den Nachteil, dass einige Attributnamen ganz schön lang werden.&lt;br /&gt;
&lt;br /&gt;
===Attribute===&lt;br /&gt;
&lt;br /&gt;
====HomeAdvancedUserAttr====&lt;br /&gt;
Als Erstes wird empfohlen, gerade für Anfänger, das Attribut &amp;quot;HomeAdvancedUserAttr&amp;quot; auf 1 zu setzen. Dadurch werden viel mehr HomeCMD Attribute freigeschaltet. Diese werden im Attribut userattr des HOMEMODE Device hinzugefügt.&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoAlarmModes====&lt;br /&gt;
Als Nächstes sollte man sich entscheiden, ob die Alarm Modus evtl. nicht automatisch zum jeweiligen Modus des HOMEMODE Device geschaltet werden sollen. Standardmäßig werden die Alarm Modus automatisch gesteuert. Ist das nicht erwünscht, so ist der Wert dieses Attributs auf 0 zu setzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Modus &amp;quot;absent&amp;quot; des HOMEMODE Device wird automatisch auf &amp;quot;armaway&amp;quot; geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Modus &amp;quot;home&amp;quot; des HOMEMODE Device wird automatisch auf &amp;quot;disarm&amp;quot; geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Modus &amp;quot;asleep&amp;quot; des HOMEMODE Device wird automatisch auf &amp;quot;armnight&amp;quot; geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
Alarm Modus &amp;quot;armhome&amp;quot; kann nur manuell gesetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 oder 1&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
====HomeAutoArrival====&lt;br /&gt;
Ist hier ein Wert größer 0 angegeben, so wird bei Ankunft jedes ROOMMATE/GUEST die location des jeweiligen ROOMMATE/GUEST für die hier angegeben Zeit in Minuten auf &amp;quot;arrival&amp;quot; gesetzt. Beim ersten nach Hause kommenden ROOMMATE/GUEST wird zusätzlich die location des HOMEMODE Device für die hier eingestellte Zeit in Minuten auf &amp;quot;arrival&amp;quot; gesetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Nach Ablauf der hier eingestellten Minuten wechselt das jeweilige Device von &amp;quot;arrival&amp;quot; auf &amp;quot;home&amp;quot;, sofern es noch die location &amp;quot;arrival&amp;quot; hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 5999.9&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoAsleep====&lt;br /&gt;
Ist hier ein Wert größer 0 angegeben, so wird beim Schlafengehen (gotosleep) jedes ROOMMATE/GUEST ein Timer gestartet, der den jeweiligen ROOMMATE/GUEST nach der hier angegeben Zeit in Minuten auf &amp;quot;asleep&amp;quot; setzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 5999.9&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoAwoken====&lt;br /&gt;
Ist hier ein Wert größer 0 angegeben, so wird beim Erwachen (&amp;quot;awoken&amp;quot; oder &amp;quot;home nach asleep&amp;quot;) jedes ROOMMATE/GUEST dieser auf &amp;quot;awoken&amp;quot; gesetzt und ein Timer gestartet, der den jeweiligen ROOMMATE/GUEST nach der hier angegeben Zeit in Minuten auf &amp;quot;home&amp;quot; setzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 5999.9&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoDaytime====&lt;br /&gt;
Standardmäßig wird mode anhand der Tageszeit automatisch gesetzt. Ist das nicht gewünscht, kann das über den Wert 0 deaktiviert werden. Dann stehen allerdings tageszeitabhängigen mode(s) nicht mehr zur Verfügung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 oder 1&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
====HomeResidentCmdDelay====&lt;br /&gt;
Normalerweise werden die Events der ROOMMATE/GUEST vor denen des HOMEMODE Device ausgeführt. Um das zu ändern wird die Ausführung der ROOMMATE/GUEST HomeCMD Attribute um die hier eingestellte Zeit in Sekunden verzögert.&amp;lt;br&amp;gt;&lt;br /&gt;
Je genauer der Name des jeweiligen HomeCMD Attributs beschrieben wird, desto später wird dieser ausgeführt.&amp;lt;br&amp;gt;&lt;br /&gt;
Das heißt z.B. dass HomeCMDmode vor HomeCMDmode-absent und dieser wiederrum vor HomeCMDmode-absent-ROOMMATE/GUEST-NAME ausgeführt wird usw.&amp;lt;br&amp;gt;&lt;br /&gt;
Um das normale Verhalten wiederherzustellen ist der Wert dieses Attributs auf 0 zu setzen. Dann wird HomeCMDmode-absent-ROOMMATE/GUEST-NAME vor HomeCMDmode-absent und vor HomeCMDmode ausgeführt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis unendlich in Sekunden&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
==Konfiguration Presence Devices (automatische anwesend/abwesend Umschaltung von ROOMMATE/GUEST)==&lt;br /&gt;
Damit die automatische Zuordnung der Presence Devices zu ihren ROOMMATE/GUEST Devices zuverlässig funktioniert, ist es nötig dass der Hauptteil des Namens des ROOMMATE/GUEST innerhalb des Namens des zugehörigen PRESENCE Device(s) vorkommt.&amp;lt;br&amp;gt;&lt;br /&gt;
Im Attribut HomePresenceDeviceType kann man den zu suchenden TYPE von Presence Device vorgeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Per Default werden nur Devices vom TYPE PRESENCE gesucht und versucht den ROOMMATE/GUEST zuzuweisen.&amp;lt;br&amp;gt;&lt;br /&gt;
Falls man z.B. auch Devices vom TYPE dummy zur Anwesenheitssteuerung benutzt, kann man diese im Attribut HomePresenceDeviceType mit hinzunehmen. Es sind alles Device TYPEn möglich die ein &amp;quot;presence&amp;quot; Reading mit den Werten &amp;quot;present/appeared&amp;quot; und &amp;quot;absent/disappeared&amp;quot; bereitstellen. Mehrere TYPEn sind möglich da in diesem Attribut ein Regex erwartet wird. z.B.: dummy oder PRESENCE|dummy oder PRESENCE|dummy|ONKYO_AVR.&lt;br /&gt;
&lt;br /&gt;
===Beispiel===&lt;br /&gt;
Der Device Name meines ROOMMATE ist &amp;quot;rr_Dan&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Auf der Suche nach dem zugehörigen Presence Device wird der erste Teil (rr_ oder rg_) weggeschnitten und der Rest in Kleinbuchstaben umgewandelt.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit dem was übrig bleibt, bei mir also nur dan, werden die möglichen Presence Devices versucht zu erkennen.&amp;lt;br&amp;gt;&lt;br /&gt;
Mein zugehöriges Presence Device heißt, historisch gewachsen, PRESENCE_rr_Dan und würde somit problemlos zugeordnet werden können.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Namen der zugehörigen Presence Devives könnten in ihrer kürzesten Form auch wie folgt sein um meinen ROOMMATE/GUEST Device zugeordnet zu werden:&amp;lt;br&amp;gt;&lt;br /&gt;
 pdan&lt;br /&gt;
 danp&lt;br /&gt;
 ZDan&lt;br /&gt;
 DANZ&lt;br /&gt;
 wenndannsonst&lt;br /&gt;
Aber Achtung, es funktioniert nicht mehr wenn die Namen nicht eindeutig sind. Wenn es z.B. eine rr_Dana geben würde mit Presence Device Name &amp;quot;pdani&amp;quot;, dann würde dieser Name auch bei mir (dan) passen. Das könnte man aber auch bewußt nutzen um mit einem Presence Device 2 ROOMMATE/GUEST Devices gleichzeitig zu steuern.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn die Namen wirklich absolut eindeutig sind, dann könnte man den Regex im Attribut HomePresenceDeviceType sogar auf &amp;quot;.*&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Werden pro ROOMMATE/GUEST mehrere Presence Devices gefunden und zugeordnet, so wird automatisch dass Attribut HomePresenceDeviceAbsentCount-&amp;lt;NAME-ROOMMATE/GUEST&amp;gt; auf die Anzahl der gefundenen Presence Devices gesetzt, so dass der/die jeweilige ROOMMATE/GUEST immer erst als abwesend gewertet wird sobald alle zugehörigen Presence Devices abwesend sind. Analog dazu gibt es noch das Attribut HomePresenceDevicePresentCount-&amp;lt;NAME-ROOMMATE/GUEST&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Attribute===&lt;br /&gt;
&lt;br /&gt;
====HomeAutoPresence====&lt;br /&gt;
Ist dieses Attribut auf 1 gesetzt, so werden die ROOMMATE/GUEST Devices automatisch zum Status ihrer zugehörigen PRESENCE Devices geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
PRESENCE Device present - ROOMMATE/GUEST home&amp;lt;br&amp;gt;&lt;br /&gt;
PRESENCE Device absent - ROOMMATE/GUEST absent&amp;lt;br&amp;gt;&lt;br /&gt;
Falls es sich bei den von Euch benutzen PRESENCE Devices nicht um Devices vom TYPE PRESENCE handeln sollte, sondern z.B. um PRESENCE und dummy, so kann dieses im Attribut HomePresenceDeviceType als Regex konfiguriert werden! z.B.: PRESENCE|dummy&amp;lt;br&amp;gt;&lt;br /&gt;
Damit ein Device als Presence Device erkannt werden kann, muss dieses über ein presence Reading verfügen.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 oder 1&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoPresenceSuppressState====&lt;br /&gt;
unterdrücke Anwesenheitsänderung in angegebenen State(s) der RESIDENTS&amp;lt;br&amp;gt;&lt;br /&gt;
z.B. für &amp;quot;mysteriös&amp;quot; verschwindende Anwesenheitsgeräte in der Nacht&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: asleep|awoken|gotosleep&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomePresenceDeviceType====&lt;br /&gt;
Regex des TYPEs/der TYPEn von Presence Devices&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: Regex der Device TYPEn&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: PRESENCE&lt;br /&gt;
&lt;br /&gt;
==Erweiterte Konfiguration==&lt;br /&gt;
Um das HOMEMODE Device vollumfänglich zu benutzen ist es sinnvoll weitere Devices (zur Überwachung) hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Die bereits möglichen hinzuzufügenden Devices werden hier folgend nach Attributnamen erklärt.&lt;br /&gt;
&lt;br /&gt;
===Attribute zum Hinzufügen weiterer Geräte===&lt;br /&gt;
&lt;br /&gt;
====HomeEventsCalendarDevices====&lt;br /&gt;
Hier ist ein Devspec von holiday/Calendar Device(s) anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Es wird empfohlen die holiday/Calendar Namen in Großbuchstaben anzulegen, da dann die daraus resultierenden Platzhalter ebenfalls Großbuchstaben sind und somit zu den anderen Platzhaltern passen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Es werden alle Typen von holiday Events (1,2,3,4,5) unterstützt.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Calendar sind auch gleichzeitig startende/laufende Events möglich, sie müssen nur unterschiedliche Titel haben (summary).&amp;lt;br&amp;gt;&lt;br /&gt;
Der jeweilige Event Text kann auch Leerzeichen enthalten, welche in den HomeCMD Attributen durch Bindestriche (-) ersetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039;, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; in den HomeCMDevent Attributen zur Verfügung. &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039; wird dann durch den Namen, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; durch das aktuelle Event und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; durch das vorherige Event des jeweiligen Kalenders ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec von holiday/Calendar Geräten&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeEventsHolidayDevices====&lt;br /&gt;
Hier ist ein Devspec von holiday/Calendar Device(s) anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Es wird empfohlen die holiday/Calendar Namen in Großbuchstaben anzulegen, da dann die daraus resultierenden Platzhalter ebenfalls Großbuchstaben sind und somit zu den anderen Platzhaltern passen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Es werden alle Typen von holiday Events (1,2,3,4,5) unterstützt.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Calendar sind auch gleichzeitig startende/laufende Events möglich, sie müssen nur unterschiedliche Titel haben (summary).&amp;lt;br&amp;gt;&lt;br /&gt;
Der jeweilige Event Text kann auch Leerzeichen enthalten, welche in den HomeCMD Attributen durch Bindestriche (-) ersetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039;, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; in den HomeCMDevent Attributen zur Verfügung. &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039; wird dann durch den Namen, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; durch das aktuelle Event und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; durch das vorherige Event des jeweiligen Kalenders ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec von holiday/Calendar Geräten&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorAirpressure====&lt;br /&gt;
Luftdrucksensor aussen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Name des Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorHumidityOutside====&lt;br /&gt;
Hier ist der Name des (Haupt)Aussensensors für Luftfeuchtigkeit anzugeben. Dieser muss ein Reading humidity besitzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Falls der Sensor für (Aussen)Luftfeuchtigkeit und Aussentemperatur ein und der selbe ist, so muss dieser nur einmalig im Attribut HomeSensorTemperatureOutside hinterlegt werden. Dieser muss dann die beiden Readings humidity und temperature haben. Im Bedarfsfall können diese Readings auch vorher entsprechend durch eigene userReadings erstellt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser Sensor stellt den Platzhalter &#039;&#039;&#039;%HUMIDITY%&#039;&#039;&#039; für den Wert des Readings humidity zur Verfügung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Device Name mit Reading humidity&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorTemperatureOutside====&lt;br /&gt;
Hier ist der Name des (Haupt)Aussentemperatursensors anzugeben. Dieser muss mindestens ein Reading temperature besitzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Falls der Sensor für Aussentemperatur auch ein Reading humidity besitzen sollte und dieses auch der Sensor für die Aussenlufteuchtigkeit ist, so muss dieser nur einmalig hier in diesem Attribut hinterlegt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser Sensor stellt den Platzhalter &#039;&#039;&#039;%TEMPERATURE%&#039;&#039;&#039; für den Wert des Readings temperature zur Verfügung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Device Name mit Reading temperature und optional humidity&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContact====&lt;br /&gt;
Hier können alle Kontakt Sensoren als Devspec hinterlegt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; in den HomeCMDcontact Attributen zur Verfügung. &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; wird dann durch den Alias, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; durch den Namen und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; durch den aktuellen state des zuletzt ausgelösten Kontakts ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;In meinem Falle sind das optische und magnetische Kontaktsensoren vom HomeMatic. HM-SEC-SCo und HM-SEC-SC-2.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Darum ist bei mir als Devspec &#039;&#039;&#039;model=HM-SEC-SC(o|-2)&#039;&#039;&#039; eingetragen um alle diese Kontaktsensoren zu erfassen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nach Übernehmen des Attributs werden alle gefundenen Kontaktsensoren mit ihren Namen im Internal SENSORSCONTACT des HOMEMODE Device einzeln aufgelistet und können dort auch direkt angeklickt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Des weiteren werden beim Übernehmen dieses Attributs jedem Kontaktsensor folgende Attribute im Attribut userattr hinzugefügt:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====HomeContactType=====&lt;br /&gt;
Typ des Kontakts - wird versucht anhand des Namen/Alias beim Hinzufügen zum HOMEMODE Device zu ermitteln, sollte jedoch für jeden Kontaktsensor einzeln überprüft werden&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: doorinside,dooroutside,doormain,window&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: vorgegebene Werteauswahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: window&lt;br /&gt;
&lt;br /&gt;
=====HomeModeAlarmActive=====&lt;br /&gt;
Regex der Alarm Mode(s) in denen der Kontaktsensor eine erfolgte Öffnung als Alarm melden soll.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: armaway|armhome|armnight&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex von Alarm Modes&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: armaway&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenDontTriggerModes=====&lt;br /&gt;
Regex der Mode(s) des HOMEMODE Device in denen keine Offen Warnungen erfolgen sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist ein Kontakt geöffnet während die hier eingestellten Mode(s) eintreten, so wird der noch bestehende Timer abgebrochen. Entgegengesetzt startet er wieder sobal die hier eingestellten Mode(s) verlassen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist hier z.B. &amp;quot;gotosleep|asleep&amp;quot; eingestellt, so kann man z.B. das Fenster schon vor dem Auslösen von gotosleep oder asleep öffnen und der bestehende Offenwarnung-Timer wird dann abgebrochen. Sobald man am Morgen z.B. awoken oder home auslöst, so wird ein neuer Timer gestartet der einen dann an das noch offene Fenster erinnert.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: alle Modes des HOMEMODE Device&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex von Modes&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenDontTriggerModesResidents=====&lt;br /&gt;
Devspec der ROOMMATE/GUEST Devices deren Status statt der Modes des HOMEMODE Device für Attribut HomeOpenDontTriggerModes benutzt werden soll.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: alle überwachten ROOMMATE/GUEST&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenMaxTrigger=====&lt;br /&gt;
Maximale Anzahl an Warnmeldungen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis ~&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: ganze Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenTimes=====&lt;br /&gt;
Leerzeichenseparierte Liste von Offen Warnung Zeiten in Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Der erste Wert entspricht der ersten Zeit, der zweite Wert der zweiten Zeit usw.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Anzahl sollte dem Wert im Attribut HomeOpenMaxTrigger entsprechen. Wenn hier weniger Zeiten vorgegeben werden, so wird für weitere Offen Warnungen immer die letzte hier angegebene Zeit verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit einer Kommmastelle, z.B. 2.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 10&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenTimesDividers=====&lt;br /&gt;
Leerzeichenseparierte Liste von Offenwarnzeit Teilern.&amp;lt;br&amp;gt;&lt;br /&gt;
Es müssen so viele Werte angegeben werden wie in HomeSeasons Jahreszeiten hinterlegt worden sind (Default 4).&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer normalen Offenwarnzeit von 10 Minuten und den hier anzugebenen Teilern z.B. &amp;quot;2 1 2 3&amp;quot; ergeben sich für Frühling und Herbst Offenwarnzeiten von jeweils 5 Minuten und im Winter 3.3 Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte überschreiben die Werte aus dem Attribut HomeSensorsContactOpenTimeDividers des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit einer Kommmastelle, z.B. 2 1 2 2.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeReadings=====&lt;br /&gt;
Zwei leerzeichenseparierte Readings für open und sabotage Status.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings überschreiben die Werte aus dem Attribut HomeSensorsContactReadings des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
=====HomeValues=====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte überschreiben die Werte aus dem Attribut HomeSensorsContactValues des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|tilted|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactReadings====&lt;br /&gt;
Zwei leerzeichenseparierte Readings für open und sabotage Status.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeReadings in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactValues====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeValues in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|tilted|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactOpenTimeDividers====&lt;br /&gt;
Leerzeichenseparierte Liste von Offenwarnzeit Teilern.&amp;lt;br&amp;gt;&lt;br /&gt;
Es müssen so viele Werte angegeben werden wie in HomeSeasons Jahreszeiten hinterlegt worden sind (Default 4).&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer normalen Offenwarnzeit von 10 Minuten und den hier anzugebenen Teilern z.B. &amp;quot;2 1 2 3&amp;quot; ergeben sich für Frühling und Herbst Offenwarnzeiten von jeweils 5 Minuten und im Winter 3.3 Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeOpenTimesDividers in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit max. einer Kommmastelle, z.B. 2 1 2 2.5 (für 4 Jahreszeiten)&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactOpenTimeMin====&lt;br /&gt;
Minimale Zeit in Minuten die mindestens für eine Offenwarnung gewartet werden soll - im Falle dass sich durch den Teiler evtl. zu kleine Werte ergeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: eine Zahle mit max. einer Kommmastelle, z.B. 2.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactOpenTimes====&lt;br /&gt;
Leerzeichenseparierte Liste von Offen Warnung Zeiten in Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Der erste Wert entspricht der ersten Zeit, der zweite Wert der zweiten Zeit usw.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Anzahl sollte dem Wert im Attribut HomeOpenMaxTrigger entsprechen. Wenn hier weniger Zeiten vorgegeben werden, so wird für weitere Offen Warnungen immer die letzte hier angegebene Zeit verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit max. einer Kommmastelle, z.B. 7.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 10&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsLuminance====&lt;br /&gt;
Devspec von (Innen-)Lichtsensoren deren Durchschnittswert berechnet werden soll&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsMotion====&lt;br /&gt;
Hier können alle Bewegungs Sensoren als Devspec hinterlegt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; in den HomeCMDmotion Attributen zur Verfügung. &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; wird dann durch den Alias, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; durch den Namen und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; durch den aktuellen state des zuletzt ausgelösten Kontakts ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;In meinem Falle sind das Fibaro Motion Sensor Gen4/5.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Darum ist bei mir als Devspec &#039;&#039;&#039;modelId=010f-0801-1001|010f-0800-1001&#039;&#039;&#039; eingetragen um alle diese Bewegungssensoren zu erfassen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Damit bei den Gen5 Sensoren auch das open im reading state steht, habe ich mir bei diesen Sensoren ein userReading angelegt.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nach Übernehmen des Attributs werden alle gefundenen Bewegungssensoren mit ihren Namen im Internal SENSORSMOTION des HOMEMODE Device einzeln aufgelistet und können dort auch direkt angeklickt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Des weiteren werden beim Übernehmen dieses Attributs jedem Bewegungssensor folgende Attribute im Attribut userattr hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
=====HomeModeAlarmActive=====&lt;br /&gt;
Regex der Alarm Mode(s) in denen der Bewegungssensor eine erfolgte Öffnung als Alarm melden soll.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: armaway|armhome|armnight&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex von Alarm Modes&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: armaway&lt;br /&gt;
&lt;br /&gt;
=====HomeReadings=====&lt;br /&gt;
2 leerzeichenseparierte Readings für open und sabotage.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings überschreiben die Werte aus dem Attribut HomeSensorsMotionReadings des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
=====HomeSensorLocation=====&lt;br /&gt;
Standort des Bewegungssensors (außen oder innen) - wird standardmäßig beim Hinzufügen zum HOMEMODE Device auf &amp;quot;inside&amp;quot; gesetzt, sollte jedoch für jeden Kontaktsensor einzeln überprüft werden&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: inside,outside&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: vorgegebene Werteauswahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: inside&lt;br /&gt;
&lt;br /&gt;
=====HomeValues=====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte überschreiben die Werte aus dem Attribut HomeSensorsMotionValues des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsMotionReadings====&lt;br /&gt;
2 leerzeichenseparierte Readings für open und sabotage.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeReadings in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsMotionValues====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeValues in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsPowerEnergy====&lt;br /&gt;
Hier können alle Energie Sensoren als Devspec hinterlegt werden. Diese müssen die beiden Readings power und energy besitzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Anhand dieser Readings wird dann der Gesamtverbrauch und die derzeitige gesamte Leistungsaufnahme berechnet.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;In meinem Falle sind das Fibaro Wall Plugs Gen4/5.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Darum ist bei mir als Devspec &#039;&#039;&#039;modelId=010f-0600-1000|010f-0602-1001&#039;&#039;&#039; eingetragen um alle diese Energie Sensoren zu erfassen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec mit vorhandenen energy und power Readings&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsSmoke====&lt;br /&gt;
Devspec mit Rauchmeldern&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorWindspeed====&lt;br /&gt;
Sensor für Windgeschwindigkeit&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Name des Sensors und Reading der Windgeschwindigkeit separiert mit : (z.B. ga_Windsensor:wind)&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsBattery====&lt;br /&gt;
Devspec von Batteriesensoren mit einem Reading &amp;quot;battery&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTriggerAnyoneElseAtHome====&lt;br /&gt;
auslösendes Gerät für anyoneElseAtHome&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: device:reading:valueOn:valueOff&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTriggerPanic====&lt;br /&gt;
auslösendes Gerät für Panikalarm&amp;lt;br&amp;gt;&lt;br /&gt;
valueOff ist optional, wird es weggelassen, so fungiert valueOn als toggle&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: device:reading:valueOn[:valueOff]&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTwilightDevice====&lt;br /&gt;
Hier ist der Name des lokalen Twilight Device anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Device stellt zusätzlich die Platzhalter &#039;&#039;&#039;%LIGHT%&#039;&#039;&#039;, &#039;&#039;&#039;%TWILIGHT%&#039;&#039;&#039; und &#039;&#039;&#039;%TWILIGHTEVENT%&#039;&#039;&#039; in den HomeCMD Attributen zur Verfügung. &#039;&#039;&#039;%LIGHT%&#039;&#039;&#039; wird dann durch das Reading light, &#039;&#039;&#039;%TWILIGHT%&#039;&#039;&#039; durch das Reading twilight und &#039;&#039;&#039;%TWILIGHTEVENT%&#039;&#039;&#039; durch das aktuelle Twilight Event ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeUWZ====&lt;br /&gt;
Hier ist der Name des lokalen UWZ Geräts anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%UWZ%&#039;&#039;&#039;, &#039;&#039;&#039;%UWZSHORT%&#039;&#039;&#039; und &#039;&#039;&#039;%UWZLONG%&#039;&#039;&#039; sind verfügbar in allen HomeCMD Attributen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Name des UWZ Geräts&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeYahooWeatherDevice====&lt;br /&gt;
Hier ist der Name des lokalen Yahoo Weather Geräts anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Device stellt zusätzlich einige Platzhalter zur Verfügung. Für die genaue Beschreibung derer siehe &amp;quot;Platzhalter&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
===HomeText Attribute===&lt;br /&gt;
Die HomeText Attribute sind größtenteils zur Übersetzung einiger benötigter Begriffe gedacht.&amp;lt;br&amp;gt;&lt;br /&gt;
In den speziellen Attributen die mit HomeTextWeather anfangen, sind ganze Texte mit entsprechenden Platzhaltern einzufügen.&lt;br /&gt;
&lt;br /&gt;
====HomeTextAndAreIs====&lt;br /&gt;
Übersetzung für &amp;quot;and&amp;quot;, &amp;quot;are&amp;quot; und &amp;quot;is&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort/Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: and|are|is&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 und|sind|ist&lt;br /&gt;
&lt;br /&gt;
====HomeTextClosedOpen====&lt;br /&gt;
Übersetzung für &amp;quot;closed&amp;quot; und &amp;quot;open&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: closed|open&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 geschlossen|geöffnet&lt;br /&gt;
&lt;br /&gt;
====HomeTextNosmokeSmoke====&lt;br /&gt;
Übersetzung für &amp;quot;no smoke&amp;quot; und &amp;quot;smoke&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: no smoke|smoke&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 kein Rauch|Rauch&lt;br /&gt;
&lt;br /&gt;
====HomeTextRisingConstantFalling====&lt;br /&gt;
Übersetzung für &amp;quot;rising&amp;quot;, &amp;quot;constant&amp;quot; und &amp;quot;falling&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: rising|constant|falling&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 steigend|gleichbleibend|fallend&lt;br /&gt;
&lt;br /&gt;
====HomeTextTodayTomorrowAfterTomorrow====&lt;br /&gt;
Übersetzung für &amp;quot;today&amp;quot;, &amp;quot;tomorrow&amp;quot; und &amp;quot;day after tomorrow&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: today|tomorrow|day after tomorrow&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 Heute|Morgen|Übermorgen&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherNoForecast====&lt;br /&gt;
Übersetzung für &amp;quot;No forecast available&amp;quot; - Text wenn keine Wettervorhersage verfügbar ist&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: No forecast available&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 Es ist leider keine Wettervorhersage für den angegebenen Tag verfügbar!&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherForecastInSpecDays====&lt;br /&gt;
Text mit Platzhaltern für Wettervorhersage in 4-10 Tagen&amp;lt;br&amp;gt;&lt;br /&gt;
spezielle Platzhalter die nur in diesem Attribut gültig sind: &#039;&#039;&#039;%CONDITION%&#039;&#039;&#039;, &#039;&#039;&#039;%DAY%&#039;&#039;&#039;, &#039;&#039;&#039;%HIGH%&#039;&#039;&#039; und &#039;&#039;&#039;%LOW%&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 In %DAY% Tagen %CONDITION% bei Temperaturen von %LOW% bis %HIGH%°C.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherForecastToday====&lt;br /&gt;
Text mit Platzhaltern für Wettervorhersage für heute&amp;lt;br&amp;gt;&lt;br /&gt;
spezielle Platzhalter die nur in diesem Attribut gültig sind: &#039;&#039;&#039;%CONDITION%&#039;&#039;&#039;, &#039;&#039;&#039;%DAY%&#039;&#039;&#039;, &#039;&#039;&#039;%HIGH%&#039;&#039;&#039; und &#039;&#039;&#039;%LOW%&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 %DAY% %CONDITION% bei Temperaturen von %LOW% bis %HIGH%°C. Aktuelle Temperatur %TEMPERATURE%°C bei einer Luftfeuchtigkeit von %HUMIDITY%%. Die gefühlte Temperatur ist %WINDCHILL%°C bei einer Windgeschwindigkeit von %WIND%km/h.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherForecastTomorrow====&lt;br /&gt;
Text mit Platzhaltern für Wettervorhersage für morgen/übermorgen&amp;lt;br&amp;gt;&lt;br /&gt;
spezielle Platzhalter die nur in diesem Attribut gültig sind: &#039;&#039;&#039;%CONDITION%&#039;&#039;&#039;, &#039;&#039;&#039;%DAY%&#039;&#039;&#039;, &#039;&#039;&#039;%HIGH%&#039;&#039;&#039; und &#039;&#039;&#039;%LOW%&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 %DAY% %CONDITION% bei Temperaturen von %LOW% bis %HIGH%°C.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherLong====&lt;br /&gt;
Langer Text mit Platzhaltern für aktuelle Wetterdaten&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 Es %TOBE% %CONDITION% bei %TEMPERATURE%°C und %HUMIDITY%% Luftfeuchtigkeit. Die gefühlte Temperatur ist %WINDCHILL%°C bei einer Windgeschwindigkeit von %WIND%km/h. Der Luftdruck ist %PRESSURETREND% bei %PRESSURE%hPa.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherShort====&lt;br /&gt;
Kurzer Text mit Platzhaltern für aktuelle Wetterdaten&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 %CONDITION%, %TEMPERATURE%°C, %HUMIDITY%% Luftfeuchtigkeit, Luftdruck %PRESSURE%hPa&lt;br /&gt;
&lt;br /&gt;
===weitere Attribute===&lt;br /&gt;
Viele weitere Dinge lassen sich anpassen.&lt;br /&gt;
&lt;br /&gt;
====HomeAdvancedDetails====&lt;br /&gt;
mehr Details anzeigen, abhängig von den zu HOMEMODE hinzugefügten Geräten&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: none, detail, both, room&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Auswahlliste&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: none&lt;br /&gt;
&lt;br /&gt;
====HomeDaytimes====&lt;br /&gt;
Eigene Tageszeiten als Paare aus Zeit|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: Zeit|Wort Paare separiert mit Leerzeichen&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Zeit|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 05:00|morning 10:00|day 14:00|afternoon 18:00|evening 23:00|night&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 00:00|Mitternacht&lt;br /&gt;
 00:05|Nacht&lt;br /&gt;
 06:30|Morgen&lt;br /&gt;
 10:00|Vormittag&lt;br /&gt;
 13:00|Mittag&lt;br /&gt;
 14:30|Nachmittag&lt;br /&gt;
 17:30|Vorabend&lt;br /&gt;
 19:00|Abend&lt;br /&gt;
 23:00|Spätabend&lt;br /&gt;
&lt;br /&gt;
====HomeIcewarningOnOffTemps====&lt;br /&gt;
2 leerzeichenseparierte Temperaturen für das Ein- und Ausschalten der Eiswarnung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei leerzeichenseparierte Temperaturen mit maximal einer Kommastelle&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 2 3&lt;br /&gt;
&lt;br /&gt;
====HomeModeAlarmArmDelay====&lt;br /&gt;
Zeit in Sekunden um das aktivieren der Alarmschaltung zu verzögern.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 99999&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl (gleiche Verzögerung für alle modeAlarm) oder 3 leerzeichenseparierte Zahlen für jeden modeAlarm (Reihenfolge: armaway armnight armhome)&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAtTmpRoom====&lt;br /&gt;
Diesen Raum zu temporäre at(s) hinzufügen die von HOMEMODE generiert werden&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomePresenceDeviceAbsentCount-&amp;lt;ROOMMATE/GUEST&amp;gt;====&lt;br /&gt;
Anzahl der dem ROOMMATE/GUEST zugeordneten Presence Geräte um den jeweiligen ROOMMATE/GUEST auf &amp;quot;absent&amp;quot; zu setzen&amp;lt;br&amp;gt;&lt;br /&gt;
Das Attribut ist nur verfügbar wenn mehr als ein Presence Gerät pro ROOMMATE/GUEST gefunden/zugeordnet wurde&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis ~&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: maximale Anzahl von verfügbaren Presence Geräten für jeden ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
====HomePresenceDevicePresentCount-&amp;lt;ROOMMATE/GUEST&amp;gt;====&lt;br /&gt;
Anzahl der dem ROOMMATE/GUEST zugeordneten Presence Geräte um den jeweiligen ROOMMATE/GUEST auf &amp;quot;present&amp;quot; zu setzen&amp;lt;br&amp;gt;&lt;br /&gt;
Das Attribut ist nur verfügbar wenn mehr als ein Presence Gerät pro ROOMMATE/GUEST gefunden/zugeordnet wurde&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis ~&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
====HomePublicIpCheckInterval====&lt;br /&gt;
Interval in Minuten für die Überprüfung der öffentlichen IP-Adresse&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 99999&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0 (deaktiviert)&lt;br /&gt;
&lt;br /&gt;
====HomeSeasons====&lt;br /&gt;
Eigene Jahreszeiten als Paare aus Datum|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: Datum|Wort Paare separiert mit Leerzeichen&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Datum|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 03.01|spring 06.01|summer 09.01|autumn 12.01|winter&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 03.01|Frühling&lt;br /&gt;
 06.01|Sommer&lt;br /&gt;
 09.01|Herbst&lt;br /&gt;
 12.01|Winter&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsBatteryLowPercentage====&lt;br /&gt;
Prozentsatz um einen Batteriesensor mit geringer Batterie anzuzeigen (nur bei Sensoren die ihren Batteriewert prozentual angeben)&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 50&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsBatteryReading====&lt;br /&gt;
Reading der Batteriesensoren welches statt &amp;quot;battery&amp;quot; benutzt werden soll&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelnes Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: battery&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsLuminanceReading====&lt;br /&gt;
Reading der Lichtsensoren welches statt &amp;quot;luminance&amp;quot; benutzt werden soll&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelnes Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: luminance&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsPowerEnergyReadings====&lt;br /&gt;
Readings der Power/Energy Sensoren welche statt &amp;quot;power&amp;quot; und &amp;quot;energy&amp;quot; benutzt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: 2 leerzeichenseparierte Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: power energy&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsSmokeReading====&lt;br /&gt;
Readings der Rauchmelder welche statt &amp;quot;state&amp;quot; benutzt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: ein Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsSmokeValue====&lt;br /&gt;
Regex der Auslösewerte von Rauchmeldern&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: RegEx&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: on&lt;br /&gt;
&lt;br /&gt;
====HomeSpecialLocation====&lt;br /&gt;
Hier können eigene zusätzliche location(s) als kommaseparierte Liste angegeben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese können dann über &amp;quot;set &amp;lt;HOMEMODE&amp;gt; location &amp;lt;LOCATION&amp;gt;&amp;quot; gesetzt werden. Dazu passend werden HomeCMD Attribute erstellt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: kommaseparierte Liste von Wörtern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSpecialModes====&lt;br /&gt;
Hier können eigene zusätzliche mode(s) als kommaseparierte Liste angegeben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese können dann über &amp;quot;set &amp;lt;HOMEMODE&amp;gt; mode &amp;lt;MODE&amp;gt;&amp;quot; gesetzt werden. Dazu passend werden HomeCMD Attribute erstellt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: kommaseparierte Liste von Wörtern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTrendCalcAge====&lt;br /&gt;
Zeit in Sekunden für das Maximalalter des vorherigen Wertes für die Trendberechnung&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Zeit in Sekunden&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 900&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Teil der Konfiguration ist das Befüllen der HomeCMD Attribute. Da dieses durch die Vermischung von FHEM Code, Perl Code und zusätzlichen Platzhaltern erst einmal sehr befremdlich sein kann, habe ich bei der Beschreibung der HomeCMD Attribute teilweise Beispiele hinzugefügt um den Einstieg weiter zu erleichtern.&lt;br /&gt;
&lt;br /&gt;
==HomeCMD Attribute (mit Beispielen)==&lt;br /&gt;
Die HomeCMD Attribute sind zum Festlegen der jeweiligen Schaltaktionen gedacht und können damit evtl. vorhandene notify/DOIF ablösen. Sie können mit FHEM-Code, Perl-Code oder aber auch mit beidem vermischt befüllt werden (wovon ich allerdings abrate). Zusätzlich sind noch diverse Platzhalter (siehe Platzhalter) verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Perl-Code innerhalb der HomeCMD Attribute gibt es hier Besonderheiten.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
*Im Gegensatz zur FHEM-Eingabezeile müssen hier keine Semikolon verdoppelt werden&lt;br /&gt;
*Kommetarzeilen sind zulässig&lt;br /&gt;
*Kommentare am Ende einer Perl-Zeile sind nicht zulässig&lt;br /&gt;
&lt;br /&gt;
Typischer Weise werden in den HomeCMD Attributen weitere Module angesprochen.&amp;lt;br&amp;gt;&lt;br /&gt;
Z.B. benutze ich für jegliche Form der Benachrichtigung den msg Befehl.&lt;br /&gt;
&lt;br /&gt;
Keines der HomeCMD Attribute hat einen Standardwert. Es müssen alle Befehle selbst programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Platzhalter die Text(e) (string) beinhalten, müssen im Perl-Code in Anführungszeichen gesetzt werden (Beispiel %SENSOR%).&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter die Zahlen beinhalten (int,float) sollten nicht in Anführungszeichen gesetzt werden damit Zahlenvergleiche (mittels ==, &amp;lt;=, &amp;gt;=, &amp;gt;, &amp;lt;) funktionieren (Beispiel %LIGHT%, %ICE% oder %TEMPERATURE%).&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmSmoke====&lt;br /&gt;
Befehle die beim Anfang/Ende eines Rauchalarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmSmoke-off====&lt;br /&gt;
Befehle die beim Ende eines Rauchalarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende Rauchalarm eines beliebigen (von HOMEMODE überwachten) Rauchmelders&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg push ENTWARNUNG: Alle Rauchalarme sind beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmSmoke-on====&lt;br /&gt;
Befehle die bei einem Rauchalarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Rauchalarm eines beliebigen (von HOMEMODE überwachten) Rauchmelders&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $is = &amp;quot;meldet&amp;quot;;&lt;br /&gt;
   $is = &amp;quot;melden&amp;quot; if (%SMOKECT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg push ACHTUNG: %SMOKEHR% $is Rauchalarm!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTampered====&lt;br /&gt;
Befehle die beim Anfang/Ende eines Sabotage Alarms ausgeführt werden sollen.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTampered-off====&lt;br /&gt;
Befehle die beim Ende eines Sabotage Alarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende Sabotage Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg push ENTWARNUNG: Alle Manipulationen wurden beseitigt!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTampered-on====&lt;br /&gt;
Befehle die bei einem Sabotage Alarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Sabotage Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $is = &amp;quot;ist&amp;quot;;&lt;br /&gt;
   $is = &amp;quot;sind&amp;quot; if (%TAMPEREDCT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg push ACHTUNG: %TAMPEREDHR% $is sabotiert!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTriggered====&lt;br /&gt;
Befehle die beim Anfang/Ende eines Alarms ausgeführt werden sollen.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTriggered-off====&lt;br /&gt;
Befehle die beim Ende eines Alarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg ENTWARNUNG: Alle Alarme sind beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTriggered-on====&lt;br /&gt;
Befehle die bei einem Alarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $is = &amp;quot;ist&amp;quot;;&lt;br /&gt;
   $is = &amp;quot;sind&amp;quot; if (%ALARMCT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg audio,push,light 3 !!! ALARM !!! %ALARMHR% $is ausgelöst!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDanyoneElseAtHome====&lt;br /&gt;
Befehle die beim on/off von anyoneElseAtHome ausgeführt werden sollen.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDanyoneElseAtHome-off====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald anyoneElseAtHome deaktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Abwesenheit und nicht deaktiviertem HomeAutoAlarmModes wird der Alarm Mode von &amp;quot;armaway&amp;quot; auf &amp;quot;armhome&amp;quot; umgeschaltet damit evtl. vorhandene Bewegungsmelder keinen Alarm mehr melden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: anyoneElseAtHome on&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg HINWEIS: Es ist nun niemand anderes mehr zu Hause!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDanyoneElseAtHome-on====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald anyoneElseAtHome aktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Abwesenheit und nicht deaktiviertem HomeAutoAlarmModes wird der Alarm Mode von &amp;quot;armhome&amp;quot; auf &amp;quot;armaway&amp;quot; umgeschaltet damit evtl. vorhandene Bewegungsmelder wieder Alarme melden können.&amp;lt;br&amp;gt;&lt;br /&gt;
Wird anyoneElseAtHome bei Anwesenheit und nicht deaktiviertem HomeAutoAlarmModes aktiviert, so passiert erst einmal nichts, ausser dass die hier angegebenen Befehle ausgeführt werden. Wird dann später die Abwesenheit erkannt, schaltet der Alarm Mode auf &amp;quot;armhome&amp;quot; statt auf &amp;quot;armaway&amp;quot; damit evtl. vorhandene Bewegungsmelder keinen Alarm mehr melden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: anyoneElseAtHome off&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg HINWEIS: Es ist nun noch jemand anderes zu Hause!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDbatteryLow====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Sensor einen niedrigen Batteriewert meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $msg;&lt;br /&gt;
   $msg = &amp;quot;Die Batterien von %BATTERYLOW% gehen zur Neige und sollten ausgetauscht werden!&amp;quot; if (%BATTERYLOWCT% == 1);&lt;br /&gt;
   $msg = &amp;quot;Die Batterien bei folgenden Geräten sollten ausgetauscht werden: %BATTERYLOWALL%&amp;quot; if (%BATTERYLOWCT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg push $msg&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontact====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor open/tilted/closed meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter %ALIAS%, %SENSOR% und %STATE% können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor open/tilted/closed&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun %STATE%!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactClosed====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor geschlossen meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter %ALIAS%, %SENSOR% und %STATE% können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor closed&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun geschlossen!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpen====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor offen meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor open/tilted&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun offen!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactDoormain====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor des Types doormain open/tilted/closed meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter %ALIAS%, %SENSOR% und %STATE% können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor Type doormain open/tilted/closed&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun %STATE%!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactDoormainClosed====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor des Types doormain closed meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor vom Typ doormain wird geschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 { &lt;br /&gt;
   # Wenn es Ankommende gibt&lt;br /&gt;
   if (&amp;quot;%ARRIVERS%&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Zusammenstellen der Begrüßung&lt;br /&gt;
     my $msg = &amp;quot;Gute&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # &amp;quot;n&amp;quot; anhängen wenn Tageszeit nicht Nacht ist&lt;br /&gt;
     $msg .= &amp;quot;n&amp;quot; if (&amp;quot;%DAYTIME%&amp;quot; ne &amp;quot;Nacht&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Leerzeichen einfügen&lt;br /&gt;
     $msg .= &amp;quot; &amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # den Feiertag der Tageszeit voranstellen wenn ein Feiertag im Kalender FEIERTAG ist&lt;br /&gt;
     $msg .= &amp;quot;%FEIERTAG%-&amp;quot; if (&amp;quot;%FEIERTAG%&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Tageszeit einfügen&lt;br /&gt;
     $msg .= &amp;quot;%DAYTIME% &amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # bei ROOMMATE &amp;quot;zu Hause&amp;quot; in Begrüßung einfügen&lt;br /&gt;
     $msg .= &amp;quot;zu Hause &amp;quot; if (&amp;quot;%RESIDENT%&amp;quot; =~ /^rr_/);&lt;br /&gt;
 &lt;br /&gt;
     # Ankommende einfügen&lt;br /&gt;
     $msg .= &amp;quot;%ARRIVERS%&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # Begrüßung am Sonos im Flur ausgeben bei Abwesenheit über 60 min&lt;br /&gt;
     fhem &amp;quot;msg audio \@fl_Sonos $msg!&amp;quot; if (%DURABSENCELAST% &amp;gt; 60);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactDoormainOpen====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor des Types doormain open/tilted meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor vom Typ doormain geöffnet&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun geöffnet!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpenWarning1====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor die erste Offenwarnzeit erreicht hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: erste Offenwarnzeit des Kontakts erreicht&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio %ALIAS% steht noch offen!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpenWarning2====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor die zweite Offenwarnzeit erreicht hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: ab Erreichen der zweiten Offenwarnzeit des Kontakts&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio %ALIAS% steht immer noch offen!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpenWarningLast====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor die letzte Offenwarnzeit erreicht hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Erreichen der letzten Offenwarnzeit des Kontakts&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Das ist der letzte Hinweis %ALIAS% endlich zu schliessen!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdaytime====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald sich die Tageszeit (daytime) auf einen beliebigen Wert ändert.&amp;lt;br&amp;gt;&lt;br /&gt;
Um die jeweilige eingetretene Tageszeit zu ermitteln ist der Platzhalter &#039;&#039;&#039;%DAYTIME%&#039;&#039;&#039; vorgesehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung der Tageszeit (daytime)&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdaytime-&amp;amp;lt;DAYTIME&amp;amp;gt;====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald die jeweilige Tageszeit (daytime) erreicht ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung der Tageszeit (daytime) auf bestimmten Wert&amp;lt;br&amp;gt;&lt;br /&gt;
Bei &amp;quot;night&amp;quot; könnte man z.B. die Heizung bewohnerunabhängig ausschalten, bei &amp;quot;morning&amp;quot; wieder ein.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdeviceDisable====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Gerät deaktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: &#039;set deviceDisable &amp;amp;lt;DEVICE&amp;amp;gt;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   speak &amp;quot;Das Gerät %ALIAS% ist nun deaktiviert!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # optional wirklich attr disable für Device setzen und Konfig speichern&lt;br /&gt;
   #fhem &amp;quot;attr %DEVICE%:FILTER=disable!=1 disable 1; save&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # ROOMMATE/GUEST auf gone/none setzen wenn Presence Devices deaktiviert werden&lt;br /&gt;
   if (&amp;quot;%DEVICE%&amp;quot; =~ /^PRESENCE\d?_(r[rg]_.*)/)&lt;br /&gt;
   {&lt;br /&gt;
     my $resident = $1;&lt;br /&gt;
     my $gone = $resident =~ /^rr_/ ? &amp;quot;gone&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
     fhem &amp;quot;set $resident:FILTER=state!=$gone state $gone&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdeviceEnable====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Gerät aktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: &#039;set deviceEnable &amp;amp;lt;DEVICE&amp;amp;gt;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   speak &amp;quot;Das Gerät %ALIAS% ist nun aktiviert!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # optional attr disable für Device entfernen und Konfig speichern&lt;br /&gt;
   #fhem &amp;quot;deleteattr %DEVICE%:FILTER=disable=1 disable; save&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # ROOMMATE/GUEST auf home setzen wenn Presence Devices aktiviert werden und anwesend sind&lt;br /&gt;
   if (&amp;quot;%DEVICE%&amp;quot; =~ /^PRESENCE\d?_(r[rg]_.*)/)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set $1:FILTER=state!=home state home&amp;quot; if (ReadingsVal(&amp;quot;%DEVICE%&amp;quot;,&amp;quot;presence&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;present&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdnd====&lt;br /&gt;
Befehle die beim Anfang/Ende des DND Modus ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende des DND Modus&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (%DND%)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg audio Der DND Modus ist nun eingeschaltet!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg audio Der DND Modus ist nun beendet!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdnd-off====&lt;br /&gt;
Befehle die beim Ende des DND Modus ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende des DND Modus&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Der DND Modus ist nun beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdnd-on====&lt;br /&gt;
Befehle die beim Beginn des DND Modus ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn des DND Modus&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Der DND Modus ist nun eingeschaltet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent====&lt;br /&gt;
Befehle die beim Beginn eines beliebigen (holiday)Kalender Events ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn eines beliebigen (holiday)Kalender Events&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039;, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; können zusätzlich verwendet werden&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   fhem &amp;quot;set Weihnachten on&amp;quot; if (&amp;quot;%EVENT%&amp;quot; eq &amp;quot;Weihnachten&amp;quot;);&lt;br /&gt;
   fhem &amp;quot;set Weihnachten off&amp;quot; if (&amp;quot;%PREVEVENT%&amp;quot; eq &amp;quot;Weihnachten&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent-&amp;amp;lt;KALENDER&amp;amp;gt;-each====&lt;br /&gt;
Befehle die beim Beginn/Ende eines beliebigen (holiday)Kalender Events eines bestimmten KALENDERs ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn eines beliebigen (holiday)Kalender Events eines bestimmten KALENDERs&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; können zusätzlich verwendet werden&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-FEIERTAGE-each&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   fhem &amp;quot;set Weihnachten off&amp;quot; if (&amp;quot;%PREVEVENT%&amp;quot; eq &amp;quot;Weihnachten&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-URLAUBDAN-each&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (&amp;quot;%EVENT%&amp;quot; =~ /urlaub/i)&lt;br /&gt;
   {&lt;br /&gt;
     speak &amp;quot;Dan hat jetzt Urlaub!!!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /urlaub/i)&lt;br /&gt;
   {&lt;br /&gt;
     speak &amp;quot;Der Urlaub von Dan ist nun zu Ende!!!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-WOHNUNG-each&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Heizung an/aus schalten&lt;br /&gt;
   my $heiz = &amp;quot;([bksw]z|ku)_Thermostat&amp;quot;;&lt;br /&gt;
   if (&amp;quot;%EVENT%&amp;quot; =~ /^heizung(..+)?$/i)&lt;br /&gt;
   {&lt;br /&gt;
     my $zeit = $1;&lt;br /&gt;
     if (&amp;quot;%SEASON%&amp;quot; ne &amp;quot;Sommer&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
       # morgens nicht alle Thermostaten schalten&lt;br /&gt;
       $heiz = &amp;quot;([bks]z|ku)_Thermostat&amp;quot; if ($zeit &amp;amp;&amp;amp; $zeit =~ /morgens?$/i);&lt;br /&gt;
       fhem &amp;quot;set $heiz:FILTER=controlMode!=day controlMode day&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /^heizung/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set $heiz:FILTER=controlMode!=night controlMode night&amp;quot; if (&amp;quot;%SEASON%&amp;quot; ne &amp;quot;Sommer&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   # WLAN an/aus schalten&lt;br /&gt;
   elsif (&amp;quot;%EVENT%&amp;quot; =~ /^wlan|wifi|wi-fi/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set Router wifi off&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /^wlan|wifi|wi-fi/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set Router wifi on&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   # G-Tag für Putzfrau (de)aktivieren&lt;br /&gt;
   elsif (&amp;quot;%EVENT%&amp;quot; =~ /^putz/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceEnable PRESENCE_rg_Inge&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /^putz/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceDisable PRESENCE_rg_Inge&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   # G-Tag für Gast (de)aktivieren&lt;br /&gt;
   elsif (&amp;quot;%EVENT%&amp;quot; =~ /g([aä]|ae)st/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceEnable PRESENCE_rg_Gast&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /g([aä]|ae)st/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceDisable PRESENCE_rg_Gast&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent-&amp;amp;lt;KALENDER&amp;amp;gt;-&amp;amp;lt;EVENT&amp;amp;gt;-begin====&lt;br /&gt;
Befehle die beim Beginn eines bestimmten (holiday)Kalender EVENTs eines bestimmten KALENDERs ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn eines bestimmten (holiday)Kalender EVENTs eines bestimmten KALENDERs&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; kann zusätzlich verwendet werden&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-FEIERTAGE-Neujahr-begin&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set %SENSORSENERGY% meterReset&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent-&amp;amp;lt;KALENDER&amp;amp;gt;-&amp;amp;lt;EVENT&amp;amp;gt;-end====&lt;br /&gt;
Befehle die bei Ende der (holiday)Kalender EVENTs eines bestimmten KALENDERs ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende der (holiday)Kalender EVENTs eines bestimmten KALENDERs&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; kann zusätzlich verwendet werden&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemDEFINED====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn ein neues Gerät angelegt wird (define)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Jedem neu definierten Gerät den Geräte-TYPE auch als Raum im Menüpunkt Module zuweisen&lt;br /&gt;
   fhem &amp;quot;attr %DEFINED% room Module-&amp;gt;&amp;quot;.$defs{&amp;quot;%DEFINED%&amp;quot;}-&amp;gt;{TYPE};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemINITIALIZED====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn FHEM gestartet wurde&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg FHEM Home wurde gestartet...&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemSAVE====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn in FHEM die Konfigurationsdatei gespeichert wird&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel (Backup von fhem.cfg und fhem.state):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Datum/Uhrzeit&lt;br /&gt;
   my $now = Timeow();&lt;br /&gt;
   # Leerzeichen durch Unterstriche ersetzen&lt;br /&gt;
   $now =~ s/ /_/g;&lt;br /&gt;
   # Backup der Datei fhem.cfg&lt;br /&gt;
   `cp $attr{global}{configfile} ./backup/fhem.cfg.$now`;&lt;br /&gt;
   # Log-Ausgabe der gespeicherten Datei&lt;br /&gt;
   Log3 undef,3,&amp;quot;saved ./backup/fhem.cfg.$now&amp;quot;;&lt;br /&gt;
   # Backup der Datei fhem.state&lt;br /&gt;
   `cp $attr{global}{statefile} ./backup/fhem.state.$now`;&lt;br /&gt;
   # Log-Ausgabe der gespeicherten Datei&lt;br /&gt;
   Log3 undef,3,&amp;quot;saved ./backup/fhem.state.$now&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemUPDATE====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn das Update von FHEM ausgeführt wurde&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Das Update für FHEM ist beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDicewarning====&lt;br /&gt;
Befehle die bei Anfang/Ende der Eiswarnung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: icewarning 0/1&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (%ICE%)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg push ACHTUNG!!! Es sind nur noch %TEMPERATURE%°C! Somit könnte es glatt werden!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg audio Es sind wieder %TEMPERATURE%°C! Die Glättewarnung ist damit beendet!.&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDicewarning-off====&lt;br /&gt;
Befehle die bei Ende der Eiswarnung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: icewarning 0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Es sind wieder %TEMPERATURE%°C! Die Glättewarnung ist damit beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDicewarning-on====&lt;br /&gt;
Befehle die bei Beginn der Eiswarnung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: icewarning 1&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio ACHTUNG!!! Es sind nur noch %TEMPERATURE%°C! Somit könnte es glatt werden!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDlocation====&lt;br /&gt;
Befehle die beim Ändern der location ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung location&lt;br /&gt;
&lt;br /&gt;
====HomeCMDlocation-&amp;amp;lt;LOCATION&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf eine bestimmte location ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung auf bestimmte location&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode====&lt;br /&gt;
Befehle die beim Ändern von mode ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung mode&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-absent-belated====&lt;br /&gt;
Befehle die nachträglich zur Abwesenheit ausgeführt werden sollen, die Zeit kann im Atteribut &amp;quot;HomeModeAbsentBelatedTime&amp;quot; eingestellt werden&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Abwesenheit + XX min&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlMode night&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-&amp;amp;lt;MODE&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten mode ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung auf bestimmten mode&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-absent&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set HarmonyHub:FILTER=activity!=PowerOff activity PowerOff;&lt;br /&gt;
 set wz_Ventilator:FILTER=speed!=0 speed 0;&lt;br /&gt;
 set TYPE=SONOSPLAYER:FILTER=Volume&amp;gt;0 Volume 0;&lt;br /&gt;
 set Sonos stopAll;&lt;br /&gt;
 sleep 3;&lt;br /&gt;
 set Wohnung [FILTER=state!=off] off&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-asleep&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 define atTmp_wz_Media_aus_%SELF% at +01:00:00 set HarmonyHub:FILTER=currentActivity!=PowerOff activity PowerOff;&lt;br /&gt;
 define atTmp_wz_Venti_aus_%SELF% at +01:00:00 set wz_Ventilator:FILTER=speed!=0 speed 0;&lt;br /&gt;
 define atTmp_wzLS_aus_%SELF% at +00:30:00 set wz_LS scene aus;&lt;br /&gt;
 define atTmp_all_Sonos_vol_down_%SELF% at +00:02:00 set TYPE=SONOSPLAYER:FILTER=Volume!=0 Volume 0 1;&lt;br /&gt;
 define atTmp_all_Sonos_off_%SELF% at +00:02:30 set Sonos stopAll;&lt;br /&gt;
 set [sw]z_Auto(Music|Light):FILTER=state!=off off;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlMode night&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-awoken&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set [sw]z_Auto(Music|Light):FILTER=state!=on on&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-gone&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlManu off&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-&amp;amp;lt;MODE&amp;amp;gt;-resident====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten mode, ausgelöst durch einen beliebigen Resident, ausgeführt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung mode von beliebigem Resident ausgelöst&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-asleep-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 msg audio @%AUDIO% Guten Nacht und schlaf&#039; gut %ALIAS%!&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-awoken-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $msg = &amp;quot;Guten&amp;quot;;&lt;br /&gt;
   $msg .= &amp;quot; %FEIERTAG%&amp;quot; if (&amp;quot;%FEIERTAG%&amp;quot;);&lt;br /&gt;
   $msg .= &amp;quot; Morgen %ALIAS%&amp;quot;;&lt;br /&gt;
   fhem &amp;quot;msg audio \@%AUDIO% $msg&amp;quot;;&lt;br /&gt;
   fhem &amp;quot;defmod atTmp_wetter_%RESIDENT%_%SELF% at +00:07:00 msg audio Wettervorhersage für heute: %FORECASTTODAY%&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-&amp;amp;lt;MODE&amp;amp;gt;-&amp;amp;lt;ROOMMATE/GUEST&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten mode, ausgelöst durch einen bestimmten Resident, ausgeführt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung mode von bestimmten Resident ausgelöst&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmodeAlarm====&lt;br /&gt;
Befehle die beim Ändern von modeAlarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung modeAlarm&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmodeAlarm-&amp;amp;lt;armaway/armhome/armnight/disarm&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten modeAlarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung auf bestimmten modeAlarm&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-armaway&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (&amp;quot;%PREVAMODE%&amp;quot; eq &amp;quot;disarm&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Alarmanlage einschalten&lt;br /&gt;
     fhem &amp;quot;set AA_Arm:FILTER=level!=100 alarmLevel armAll&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht zusammensetzen&lt;br /&gt;
     my $msg;&lt;br /&gt;
     $msg .= &amp;quot;Die Alarmanlage ist nun scharf geschaltet!&amp;quot; if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot;);&lt;br /&gt;
     my $is = &amp;quot;%ALARMHR%&amp;quot; =~ /und/ ? &amp;quot;sind&amp;quot; : &amp;quot;ist&amp;quot;;&lt;br /&gt;
     $msg .= &amp;quot; &amp;quot; if ($msg);&lt;br /&gt;
     $msg .= &amp;quot;ACHTUNG: %ALARMHR% $is noch offen!!!&amp;quot; if (%ALARMCT%);&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht an ROOMMATE/GUEST senden&lt;br /&gt;
     fhem &amp;quot;msg \@%RESIDENT% $msg&amp;quot; if ($msg);&lt;br /&gt;
 &lt;br /&gt;
     # Eingangstür abschließen falls noch nicht geschehen&lt;br /&gt;
     fhem &amp;quot;set fl_Tuerschloss:FILTER=state!=locked lock&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-armhome&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 AA_Arm:FILTER=level!=25 alarmLevel armExtSens;&lt;br /&gt;
 set fl_Tuerschloss:FILTER=state!=locked lock&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-armnight&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 AA_Arm:FILTER=level!=25 alarmLevel armExtSens;&lt;br /&gt;
 set fl_Tuerschloss:FILTER=state!=locked lock&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-disarm&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Alarmanlage ausschalten&lt;br /&gt;
   fhem &amp;quot;set AA_Arm:FILTER=level!=0 alarmLevel disarmed&amp;quot;;&lt;br /&gt;
   my $prio = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # Nachrichtenpriorität auf 1 setzen bei Ankunft (höhere Lautstärke beim Abspielen damit man das auch vor der Tür hört)&lt;br /&gt;
   $prio = &amp;quot; 1&amp;quot; if (&amp;quot;%LOCATION%&amp;quot; eq &amp;quot;arrival&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Nachricht an ROOMMATE/GUEST senden wenn der vorherige alarmMode nicht &amp;quot;armnight&amp;quot; ist&lt;br /&gt;
   fhem &amp;quot;msg audio \@fl_Sonos$prio Die Alarmanlage ist nun ausgeschaltet %ALIAS%!&amp;quot; if (&amp;quot;%PREVAMODE%&amp;quot; ne &amp;quot;armnight&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmotion====&lt;br /&gt;
Befehle die bei Statusänderung eines beliebigen Bewegungsmelders ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: öffnen/schließen eines beliebigen Bewegungsmelders&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Raum aus Sensornamen ermitteln, z.B. bz_Sensor&lt;br /&gt;
   my $room = (split /_/,&amp;quot;%SENSOR%&amp;quot;)[0];&lt;br /&gt;
 &lt;br /&gt;
   # Status des structure aller Lichter dieses Raums&lt;br /&gt;
   my $lichter = Value($room.&amp;quot;_Lichter&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Status des dummy Tageslicht&lt;br /&gt;
   my $tl = Value(&amp;quot;Tageslicht&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   if (&amp;quot;%STATE%&amp;quot; eq &amp;quot;geöffnet&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Lichtwert des Sensors&lt;br /&gt;
     my $lum = ReadingsNum(&amp;quot;%SENSOR%&amp;quot;,&amp;quot;luminance&amp;quot;,100);&lt;br /&gt;
 &lt;br /&gt;
     # Löschen des evtl. schon vorhandenen &amp;quot;at&amp;quot;&lt;br /&gt;
     fhem &amp;quot;delete atTmp_Bewegungsmelder_Licht_aus_&amp;quot;.$room.&amp;quot;_%SELF%&amp;quot; if (IsDevice(&amp;quot;atTmp_Bewegungsmelder_Licht_aus_&amp;quot;.$room.&amp;quot;_%SELF%&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
     # Licht nur wenn kein Tageslicht oder Lichtwert des Sensors kleiner als 10 und AutoLight eingeschaltet und modeAlarm nicht armaway&lt;br /&gt;
     if (($tl eq &amp;quot;off&amp;quot; || $lum &amp;lt; 10) &amp;amp;&amp;amp; $lichter eq &amp;quot;off&amp;quot; &amp;amp;&amp;amp; Value($room.&amp;quot;_AutoLight&amp;quot;) eq &amp;quot;on&amp;quot; &amp;amp;&amp;amp; &amp;quot;%AMODE%&amp;quot; ne &amp;quot;armaway&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       my $scene;&lt;br /&gt;
 &lt;br /&gt;
       # verschiedene Szenen für verschiedene Modus bzw. Aussenlichtstärken&lt;br /&gt;
       if (&amp;quot;%MODE%&amp;quot; eq &amp;quot;gotosleep&amp;quot;)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;Abend&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       elsif (&amp;quot;%MODE%&amp;quot; eq &amp;quot;asleep&amp;quot;)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;Nacht&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       elsif (%LIGHT% &amp;gt; 3)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;viel&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       elsif (%LIGHT% &amp;lt; 4)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;mittel&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       # Schalten der entsprechenden Szene (Modul LightScene)&lt;br /&gt;
       fhem &amp;quot;set &amp;quot;.$room.&amp;quot;_LS scene $scene&amp;quot; if ($scene);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
     # unterschiedliche Ausschaltzeiten für unterschiedliche Räume&lt;br /&gt;
     my $t = 3;&lt;br /&gt;
     $t = 15 if ($room eq &amp;quot;wz&amp;quot;);&lt;br /&gt;
     $t = 2 if ($room eq &amp;quot;bz&amp;quot; || ($room =~ /wz|ku/ &amp;amp;&amp;amp; &amp;quot;%MODE%&amp;quot; =~ /sleep/));&lt;br /&gt;
     $t = 1 if ($room eq &amp;quot;fl&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Zahl in Minuten umrechnen in einen Zeitpunkt für das &amp;quot;at&amp;quot;&lt;br /&gt;
     my $d = HOMEMODE_hourMaker($t);&lt;br /&gt;
 &lt;br /&gt;
     # Anlegen des &amp;quot;at&amp;quot; zum Ausschalten des Lichts wenn die Lichter angeschaltet sind und auch AutoLight eingeschaltet ist&lt;br /&gt;
     if ($lichter ne &amp;quot;off&amp;quot; &amp;amp;&amp;amp; Value($room.&amp;quot;_AutoLight&amp;quot;) eq &amp;quot;on&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       my $cmd = &amp;quot;set &amp;quot;.$room.&amp;quot;_LS scene aus&amp;quot;;&lt;br /&gt;
       fhem &amp;quot;defmod atTmp_Bewegungsmelder_Licht_aus_&amp;quot;.$room.&amp;quot;_%SELF% at +$d $cmd&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmotion-off====&lt;br /&gt;
Befehle die bei Ende der Bewegung eines beliebigen Bewegungsmelders ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende der Bewegung eines beliebigen Bewegungsmelders&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmotion-on====&lt;br /&gt;
Befehle die bei Beginn der Bewegung eines beliebigen Bewegungsmelders ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn der Bewegung eines beliebigen Bewegungsmelders&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung von presence ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDpresence-present&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set w_Steckdosen [FILTER=state!=on] on;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlMode auto&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-device====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch ein beliebiges Presence Device, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch beliebiges Presence Device&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDpresence-present-device&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # mindestens 1x täglich den Batteriewert des PRESENCE Geräts bei erkannter Anwesenheit holen&lt;br /&gt;
   fhem &#039;&amp;quot;sudo /opt/fhem/scripts/GTag-bat.sh %DEVICE% %ADDRESS% &amp;amp;&amp;quot;&#039;&lt;br /&gt;
     if (&amp;quot;%DEVICE%&amp;quot; =~ /^PRESENCE_/ &amp;amp;&amp;amp; (!defined ReadingsVal(&amp;quot;%DEVICE%&amp;quot;,&amp;quot;battery&amp;quot;,undef) || ReadingsAge(&amp;quot;%DEVICE%&amp;quot;,&amp;quot;battery&amp;quot;,0) &amp;gt; 64800));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-resident====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch einen beliebigen Resident, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch beliebigen Resident&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDpresence-absent-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Mich benachrichtigen wenn ich nicht zu hause bin und jemand anderes die Wohnung verlässt&lt;br /&gt;
   fhem &amp;quot;msg push \@rr_Dan %ALIAS% hat gerade die Wohnung verlassen!&amp;quot;&lt;br /&gt;
     if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot; &amp;amp;&amp;amp; ReadingsVal(&amp;quot;rr_Dan&amp;quot;,&amp;quot;presence&amp;quot;,&amp;quot;&amp;quot;) ne &amp;quot;present&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Verabschiedungsnachricht zusammensetzen&lt;br /&gt;
   my $msg;&lt;br /&gt;
 &lt;br /&gt;
   # Alle außer mich selbst verabschieden&lt;br /&gt;
   $msg .= &amp;quot;Bis bald und auf Wiedersehen %ALIAS%...&amp;quot; if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Glättewarnung wenn nötig&lt;br /&gt;
   $msg .= &amp;quot; ACHTUNG!!! Es ist %TEMPERATURE%°C kalt! Somit könnte es glatt werden!&amp;quot; if (%ICE%);&lt;br /&gt;
 &lt;br /&gt;
   # Nachricht senden wenn vorhanden&lt;br /&gt;
   fhem &amp;quot;msg \@%RESIDENT% $msg&amp;quot; if ($msg);&lt;br /&gt;
 }&lt;br /&gt;
&#039;&#039;&#039;Beispielcode für &amp;quot;HomeCMDpresence-present-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # alle Ankommenden außer mir selbst&lt;br /&gt;
   if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Benachrichtigung wenn jemand kommt&lt;br /&gt;
     fhem &amp;quot;msg audio %ALIAS% kommt gerade!&amp;quot; if (&amp;quot;%LOCATION%&amp;quot; ne &amp;quot;arrival&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht an Ankommende(n) zusammensetzen&lt;br /&gt;
     my $g = &amp;quot;gute&amp;quot;;&lt;br /&gt;
     $g .= &amp;quot;n&amp;quot; if (&amp;quot;%DAYTIME%&amp;quot; ne &amp;quot;Nacht);&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht an Ankommende(n) senden &lt;br /&gt;
     fhem &amp;quot;msg \@%RESIDENT% Willkommen und $g %DAYTIME% %ALIAS%!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-&amp;amp;lt;ROOMMATE/GUEST&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch einen bestimmten Resident, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch bestimmten Resident&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-&amp;amp;lt;ROOMMATE/GUEST&amp;amp;gt;-&amp;amp;lt;DEVICE&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch ein bestimmtes Presence Device eines bestimmten Resident, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Attribut ist nur verfügbar wenn ein Resident mehr als ein Presence Device hat&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch bestimmtes Presence Device eines bestimmten Resident&lt;br /&gt;
&lt;br /&gt;
====HomeCMDseason====&lt;br /&gt;
Befehle die bei Änderung der Jahreszeit ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung Jahreszeit&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $t = &amp;quot;%SEASON%&amp;quot;;&lt;br /&gt;
   $t .= &amp;quot;s&amp;quot; if ($t eq &amp;quot;Frühling&amp;quot;);&lt;br /&gt;
   fhem &amp;quot;msg push Die Wohnung ist nun im $t-Modus!&amp;quot;;&lt;br /&gt;
   fhem &amp;quot;set Heizungen [FILTER=controlMode!=auto] controlMode auto&amp;quot; if ($t ne &amp;quot;Sommer&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDseason-&amp;amp;lt;SEASON&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung der Jahreszeit in eine bestimmte Jahreszeit ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung bestimmte Jahreszeit&lt;br /&gt;
&lt;br /&gt;
====HomeCMDtwilight====&lt;br /&gt;
Befehle die bei Änderung der Dämmerung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung Dämmerung&lt;br /&gt;
&lt;br /&gt;
====HomeCMDtwilight-&amp;amp;lt;sr/sr_astro/sr_civil/sr_indoor/sr_weather/ss/ss_astro/ss_civil/ss_indoor/ss_weather&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung zu bestimmter Dämmerung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung zu bestimmter Dämmerung&lt;br /&gt;
&lt;br /&gt;
====HomeCMDuwz-warn====&lt;br /&gt;
Befehle die bei Beginn/Ende der UWZ Warnungen ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn/Ende der UWZ Warnungen&lt;br /&gt;
&lt;br /&gt;
====HomeCMDuwz-warn-begin====&lt;br /&gt;
Befehle die bei Beginn der UWZ Warnungen ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn der UWZ Warnungen&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg %UWZLONG%&lt;br /&gt;
&lt;br /&gt;
====HomeCMDuwz-warn-end====&lt;br /&gt;
Befehle die beim Ende der UWZ Warnungen ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende der UWZ Warnungen&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg Alle Unwetterwarnungen sind nun beendet!&lt;br /&gt;
&lt;br /&gt;
=Platzhalter=&lt;br /&gt;
==verfügbar in allen HomeCMD Attributen==&lt;br /&gt;
===%ADDRESS%===&lt;br /&gt;
MAC Adresse des zuletzt ausgelösten Presence Geräts&lt;br /&gt;
&lt;br /&gt;
===%ALARM%===&lt;br /&gt;
Liste mit Namen der ausgelösten Alarm Geräte&amp;lt;br&amp;gt;&lt;br /&gt;
Wert ist 0 wenn kein Alarm Device ausgelöst ist&lt;br /&gt;
&lt;br /&gt;
===%ALARMCT%===&lt;br /&gt;
Anzahl der ausgelösten Alarm Geräte&lt;br /&gt;
&lt;br /&gt;
===%ALARMHR%===&lt;br /&gt;
Liste mit (human readable) Namen der ausgelösten Alarm Geräte&amp;lt;br&amp;gt;&lt;br /&gt;
Wert ist 0 wenn kein Alarm Device ausgelöst ist&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. für msg benutzt werden&lt;br /&gt;
&lt;br /&gt;
===%ALIAS%===&lt;br /&gt;
Alias des zuletzt ausgelösten Resident&lt;br /&gt;
&lt;br /&gt;
===%AMODE%===&lt;br /&gt;
aktueller Alarm Mode&lt;br /&gt;
&lt;br /&gt;
===%AEAH%===&lt;br /&gt;
Wert von anyoneElseAtHome&amp;lt;br&amp;gt;&lt;br /&gt;
Wert ist 1 wenn on und 0 wenn off&lt;br /&gt;
&lt;br /&gt;
===%ARRIVERS%===&lt;br /&gt;
Alias-Liste der ROOMMATE/GUEST deren location auf arrival steht&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um Residents zu begrüßen&amp;lt;br&amp;gt;&lt;br /&gt;
z.B. Peter, Paul und Marry&lt;br /&gt;
&lt;br /&gt;
===%AUDIO%===&lt;br /&gt;
Audio Device des zuletzt ausgelösten ROOMMATE/GUEST (Attribut msgContactAudio)&amp;lt;br&amp;gt;&lt;br /&gt;
wenn das Attribut msgContactAudio des jeweiligen Resident keinen Wert hat, so wird versucht den Wert des Attributs aus dem globalMsg (sofern vorhanden) auszulesen&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um Resident spezifische msg(s) vom Typ audio zu senden, z.B. Nacht/Morgen Grüße/Wünsche&lt;br /&gt;
&lt;br /&gt;
===%BATTERYLOW%===&lt;br /&gt;
Alias des zu letzt gemeldeten Geräts mit niedrigem Batteriestand&lt;br /&gt;
&lt;br /&gt;
===%BATTERYLOWALL%===&lt;br /&gt;
Wert des Reading batteryLow_hr&lt;br /&gt;
&lt;br /&gt;
===%BATTERYLOWCT%===&lt;br /&gt;
Wert des Reading batteryLow_ct&lt;br /&gt;
&lt;br /&gt;
===%CONDITION%===&lt;br /&gt;
Wert des Reading condition des überwachten Yahoo weather Device&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. für Wetter(vorhersage) benutzt werden&lt;br /&gt;
&lt;br /&gt;
===%CONTACT%===&lt;br /&gt;
Wert des Reading lastContact (Name des zuletzt geöffneten Kontakt Sensor)&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um msg zu versenden&lt;br /&gt;
&lt;br /&gt;
===%DAYTIME%===&lt;br /&gt;
Wert des Reading daytime&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um Tageszeit spezifische Aktionen zu schalten&lt;br /&gt;
&lt;br /&gt;
===%DEVICE%===&lt;br /&gt;
Name des zuletzt ausgelösten Presence Gerät&lt;br /&gt;
&lt;br /&gt;
===%DEVICEA%===&lt;br /&gt;
Wert des Reading lastAbsentByPresenceDevice&lt;br /&gt;
&lt;br /&gt;
===%DEVICEP%===&lt;br /&gt;
Wert des Reading lastPresentByPresenceDevice&lt;br /&gt;
&lt;br /&gt;
===%DISABLED%===&lt;br /&gt;
Wert des Reading devicesDisabled&lt;br /&gt;
&lt;br /&gt;
===%DND%===&lt;br /&gt;
DND Status&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn an, 0 wenn aus&lt;br /&gt;
&lt;br /&gt;
===%DURABSENCE%===&lt;br /&gt;
Wert des Reading durTimerAbsence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURABSENCELAST%===&lt;br /&gt;
Wert des Reading lastDurAbsence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURPRESENCE%===&lt;br /&gt;
Wert des Reading durTimerPresence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURPRESENCELAST%===&lt;br /&gt;
Wert des Reading lastDurPresence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURSLEEP%===&lt;br /&gt;
Wert des Reading durTimerSleep_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURSLEEPLAST%===&lt;br /&gt;
Wert des Reading lastDurSleep_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%&amp;lt;CALENDARNAME&amp;gt;%===&lt;br /&gt;
Event des benannten Kalenders&amp;lt;br&amp;gt;&lt;br /&gt;
0 wenn kein gerade kein Event ist&lt;br /&gt;
&lt;br /&gt;
===%&amp;lt;CALENDARNAME-EVENTNAME&amp;gt;%===&lt;br /&gt;
0 wenn das benannte Event nicht aktiv ist&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn das benannte Event aktiv ist&lt;br /&gt;
&lt;br /&gt;
===%FORECAST%===&lt;br /&gt;
Wettervorhersage für morgen&lt;br /&gt;
&lt;br /&gt;
===%FORECASTTODAY%===&lt;br /&gt;
Wettervorhersage für heute&lt;br /&gt;
&lt;br /&gt;
===%HUMIDITY%===&lt;br /&gt;
Wert des Reading humidity von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%HUMIDITYTREND%===&lt;br /&gt;
Wert des Reading humidityTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%ICE%===&lt;br /&gt;
0 wenn keine Eiswarnung besteht&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn Eiswarnung besteht&lt;br /&gt;
&lt;br /&gt;
===%IP%===&lt;br /&gt;
Wert des Reading publicIP von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LIGHT%===&lt;br /&gt;
Wert des Reading light von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LOCATION%===&lt;br /&gt;
Wert des Reading location von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LOCATIONR%===&lt;br /&gt;
Wert des Reading location des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%LUMINANCE%===&lt;br /&gt;
Wert des Reading luminance von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LUMINANCETREND%===&lt;br /&gt;
Wert des Reading luminanceTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%MODE%===&lt;br /&gt;
gerade aktiver Modus von HOMEMODE (Reading mode)&lt;br /&gt;
&lt;br /&gt;
===%MODEALARM%===&lt;br /&gt;
aktueller Alarm Mode (wie %AMODE%)&lt;br /&gt;
&lt;br /&gt;
===%MOTION%===&lt;br /&gt;
Wert des Reading lastMotion von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%NAME%===&lt;br /&gt;
Name des HOMEMODE Geräts selbst (identisch zu %SELF%)&lt;br /&gt;
&lt;br /&gt;
===%OPEN%===&lt;br /&gt;
Wert des Reading contactsOutsideOpen von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%OPENCT%===&lt;br /&gt;
Wert des Reading contactsOutsideOpen_ct von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%OPENHR%===&lt;br /&gt;
Wert des Reading contactsOutsideOpen_hr von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PANIC%===&lt;br /&gt;
0 wenn panic ausgeschaltet ist&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn panic eingeschaltet ist&lt;br /&gt;
&lt;br /&gt;
===%RESIDENT%===&lt;br /&gt;
Name des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%PRESENT%===&lt;br /&gt;
presence von HOMEMODE&lt;br /&gt;
0 wenn absent&lt;br /&gt;
1 wenn present&lt;br /&gt;
&lt;br /&gt;
===%PRESENTR%===&lt;br /&gt;
presence des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
0 wenn absent&lt;br /&gt;
1 wenn present&lt;br /&gt;
&lt;br /&gt;
===%PRESSURE%===&lt;br /&gt;
Wert des Reading pressure von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PRESSURETREND%===&lt;br /&gt;
Wert des Reading pressureTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PREVAMODE%===&lt;br /&gt;
vorheriger modeAlarm von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PREVCONTACT%===&lt;br /&gt;
vorheriger geöffneter Kontaktsensor&lt;br /&gt;
&lt;br /&gt;
===%PREVMODE%===&lt;br /&gt;
vorheriger mode von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PREVMODER%===&lt;br /&gt;
vorheriger state des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%PREVMOTION%===&lt;br /&gt;
vorheriger geöffneter Bewegungsmelder&lt;br /&gt;
&lt;br /&gt;
===%SEASON%===&lt;br /&gt;
Wert des Reading season von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%SELF%===&lt;br /&gt;
Name des HOMEMODE Geräts selbst (identisch zu %NAME%)&lt;br /&gt;
&lt;br /&gt;
===%SENSORSBATTERY%===&lt;br /&gt;
Liste aus Internal SENSORSBATTERY&lt;br /&gt;
&lt;br /&gt;
===%SENSORSCONTACT%===&lt;br /&gt;
Liste aus Internal SENSORSCONTACT&lt;br /&gt;
&lt;br /&gt;
===%SENSORSENERGY%===&lt;br /&gt;
Liste aus Internal SENSORSENERGY&lt;br /&gt;
&lt;br /&gt;
===%SENSORSMOTION%===&lt;br /&gt;
Liste aus Internal SENSORSMOTION&lt;br /&gt;
&lt;br /&gt;
===%SENSORSSMOKE%===&lt;br /&gt;
Liste aus Internal SENSORSSMOKE&lt;br /&gt;
&lt;br /&gt;
===%SMOKE%===&lt;br /&gt;
Wert des Reading alarmSmoke von HOMEMODE&lt;br /&gt;
0 wenn kein Alarm&lt;br /&gt;
&lt;br /&gt;
===%SMOKECT%===&lt;br /&gt;
Wert des Reading alarmSmoke_ct von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%SMOKEHR%===&lt;br /&gt;
Wert des Reading alarmSmoke_hr von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TAMPERED%===&lt;br /&gt;
Wert des Reading sensorsTampered von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TAMPEREDCT%===&lt;br /&gt;
Wert des Reading sensorsTampered_ct von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TAMPEREDHR%===&lt;br /&gt;
Wert des Reading sensorsTampered_hr von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TEMPERATURE%===&lt;br /&gt;
Wert des Reading temperature von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TEMPERATURETREND%===&lt;br /&gt;
Wert des Reading temperatureTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TOBE%===&lt;br /&gt;
are/sind oder is/ist der Wetterkondition&lt;br /&gt;
&lt;br /&gt;
===%TWILIGHT%===&lt;br /&gt;
Wert des Reading twilight von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TWILIGHTEVENT%===&lt;br /&gt;
aktuelles twilight Event&lt;br /&gt;
&lt;br /&gt;
===%UWZ%===&lt;br /&gt;
UWZ Warnlevel&lt;br /&gt;
&lt;br /&gt;
===%UWZLONG%===&lt;br /&gt;
alle aktuellen UWZ Warnungen (lange Version)&lt;br /&gt;
&lt;br /&gt;
===%UWZSHORT%===&lt;br /&gt;
alle aktuellen UWZ Warnungen (kurze Version)&lt;br /&gt;
&lt;br /&gt;
===%WEATHER%===&lt;br /&gt;
Wert von &amp;quot;get &amp;lt;HOMEMODE&amp;gt; weather short&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===%WEATHERLONG%===&lt;br /&gt;
Wert von &amp;quot;get &amp;lt;HOMEMODE&amp;gt; weather long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===%WIND%===&lt;br /&gt;
Wert des Reading wind von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%WINDCHILL%===&lt;br /&gt;
Wert des Reading wind_chill vom eingebundenen Yahoo Wetter Gerät&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeCMDcontact, HomeCMDmotion und HomeCMDalarm Attributen==&lt;br /&gt;
===%ALIAS%===&lt;br /&gt;
alias des zuletzt ausgelösten Kontakt/Bewegungs/Rauchsensors&lt;br /&gt;
&lt;br /&gt;
===%SENSOR%===&lt;br /&gt;
name des zuletzt ausgelösten Kontakt/Bewegungs/Rauchsensors&lt;br /&gt;
&lt;br /&gt;
===%STATE%===&lt;br /&gt;
state des zuletzt ausgelösten Kontakt/Bewegungs/Rauchsensors&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeTextWeatherForecast Attributen==&lt;br /&gt;
===%CONDITION%===&lt;br /&gt;
Wert des Readings condition des Yahoo Weather Geräts&lt;br /&gt;
&lt;br /&gt;
===%DAY%===&lt;br /&gt;
Tag der Wettervorhersage (1 - heute, 2 - morgen)&lt;br /&gt;
&lt;br /&gt;
===%HIGH%===&lt;br /&gt;
maximale Temperatur der Wettervorhersage&lt;br /&gt;
&lt;br /&gt;
===%LOW%===&lt;br /&gt;
minimale Temperatur der Wettervorhersage&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeCMDevent Attributen==&lt;br /&gt;
===%CALENDAR%===&lt;br /&gt;
Name der Kalenders&lt;br /&gt;
&lt;br /&gt;
===%DESCRIPTION%===&lt;br /&gt;
Beschreibung des aktuellen Event des Kalenders (nicht verfügbar bei holiday Geräten)&lt;br /&gt;
&lt;br /&gt;
===%EVENT%===&lt;br /&gt;
Name/Titel des aktuellen Event des Kalenders&lt;br /&gt;
&lt;br /&gt;
===%PREVEVENT%===&lt;br /&gt;
Name/Titel des vorherigen Event des Kalenders&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeCMDdevice Attributen==&lt;br /&gt;
===%DEVICE%===&lt;br /&gt;
name der deaktivierten Geräts&lt;br /&gt;
&lt;br /&gt;
===%ALIAS%===&lt;br /&gt;
alias der deaktivierten Geräts&lt;br /&gt;
&lt;br /&gt;
=Benötigte Events=&lt;br /&gt;
Folgende Events werden von HOMEMODE ausgewertet bzw. werden benötigt damit HOMEMODE vollumfänglich funktionieren kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;DEVICE-TYPE&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;EVENT&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;RESIDENTS&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;presence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;ROOMMATE,GUEST&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;presence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;wayhome&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSCONTACT}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;sabotageError&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsContactReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSMOTION}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;sabotageError&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsMotionReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSLUMINANCE}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;luminance&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsLuminanceReading&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSENERGY}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;power&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;energy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsPowerEnergyReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSBATTERY}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;battery&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsBatteryReading&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomePresenceDeviceType&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;presence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeYahooWeatherDevice&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;humidity&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;temperature&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;wind&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;pressure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeTwilightDevice&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;light&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;twilight&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;aktEvent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;pressure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorTemperatureOutside&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;temperature&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;humidity&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorHumidityOutside&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;humidity&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorWindspeed&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorWindspeed&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorAirpressure&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorAirpressure&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeEventsHolidayDevices&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeUWZ&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;WarnCount&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HOMEMODE&amp;diff=27592</id>
		<title>HOMEMODE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HOMEMODE&amp;diff=27592"/>
		<updated>2018-08-02T19:59:33Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Get-Befehle */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul wurde entworfen um den gesamten Heim-/Hausstatus in einem Gerät abzubilden und viele grundlegende Automationen durch Hinzufügen weiterer Geräte bereitzustellen.&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=HOMEMODE&lt;br /&gt;
|ModFTopic=64317&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=22_HOMEMODE.pm&lt;br /&gt;
|ModOwner=DeeSPe&lt;br /&gt;
}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls &#039;&#039;22_HOMEMODE.pm&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Das Modul &#039;&#039;22_HOMEMODE.pm&#039;&#039; wurde entworfen um den gesamten Heim-/Hausstatus in einem Gerät abzubilden.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier aufgeführte Anleitung entspricht dem Modul in Version 1.4.2.&lt;br /&gt;
&lt;br /&gt;
Viele allgemein typische Automationen sind bereits fertig integriert.&lt;br /&gt;
&lt;br /&gt;
Die jeweils per Event auszuführenden Befehle können in den entsprechenden &#039;&#039;HomeCMD...&#039;&#039; Atributen hinterlegt werden und so in der Detail Ansicht des HOMEMODE Geräts übersichtlich angezeigt und bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen vieler notify/DOIF ist durch den Einsatz von &#039;&#039;HOMEMODE&#039;&#039; unnötig.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wurde das Modul für die Verwendung mit HomeKit als GUI optimiert. Alle möglichen Mappings für Homebridge sind bereits enthalten und können über einen set Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:HOMEMODE_Device.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
Um Modul &#039;&#039;22_HOMEMODE.pm&#039;&#039; benutzen zu können benötigt man als Mindestvoraussetzung ein bereits angelegtes RESIDENTS Gerät mit entsprechenden ROOMMATE/GUEST Geräten.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Automationen==&lt;br /&gt;
Alle Automationen sind optional.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele:&lt;br /&gt;
*Änderung des Zustands von ROOMMATE/GUEST Geräten anhand von PRESENCE Geräten&lt;br /&gt;
*Bereistellung von CMD Attributen für mögliche Events rund um den Heim-/Hausstatus&lt;br /&gt;
*Bereistellung von Platzhaltern innerhalb der CMD Attribute, z.B. %MODE%, %SEASON% oder %PREVMODE% für die Werte der Readings mode, season und prevMode&lt;br /&gt;
*Einbindung von Kontakt Sensoren, für z.B. Offen-Warnungen nach bestimmten Zeitraum oder Alarm Meldungen in bestimmten Alarm Modus - kann pro Kontakt Sensor konfiguriert werden&lt;br /&gt;
*Einbindung von Bewegungs Sensoren, für z.B. automatische Licht Schaltungen oder Alarm Meldungen in bestimmten Alarm Modus - kann pro Bewegungs Sensor konfiguriert werden&lt;br /&gt;
*Darstellungen und Auslösen von Sabotage Alarmen der eingebundenen Kontakt- und Bewegungssensoren&lt;br /&gt;
*Einbindung von jeweils einem Temperatur und Luftfeuchtigkeitssensor&lt;br /&gt;
*Einbindung eines lokalen Yahoo Wetter Devices zur Ermittlung und Ausgabe der lokalen Wetterdaten und Erzeugung der Wettervorhersage&lt;br /&gt;
*Einbindung von Power und Energy Sensoren zur Ermittlung der Gesamtmengen&lt;br /&gt;
*Einbindung von Calendar/holiday Devices für spezielle im HOMEMODE Device verfügbar zu machende Events&lt;br /&gt;
*von Uhrzeit abhängiger Anwesend-Modus&lt;br /&gt;
*Bewohner unabhängige Tageszeit-Modus&lt;br /&gt;
*Alarm-Modus&lt;br /&gt;
*DND-Modus&lt;br /&gt;
*Überwachung von Batteriewerten&lt;br /&gt;
&lt;br /&gt;
=HOMEMODE-Gerät=&lt;br /&gt;
==Definition==&lt;br /&gt;
Das HOMEMODE Gerät - hier mit dem Namen &#039;&#039;Home&#039;&#039; versehen - selbst wird über&lt;br /&gt;
 define Home HOMEMODE&lt;br /&gt;
bei Vorhandensein nur eines RESIDENTS Geräts definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung mehrerer RESIDENTS Geräte muss das Master RESIDENTS Gerät beim Definieren mit angegeben werden&lt;br /&gt;
 define Home HOMEMODE rgr_Residents&lt;br /&gt;
Dieses Modul verwendet das globale Attribut &#039;&#039;language&#039;&#039; zur Bestimmung der Anzeigedaten (Standard: EN=english). Für deutsche Ausgabedaten kann das Attribut&lt;br /&gt;
 attr global language DE&lt;br /&gt;
gesetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Alternativ kann auch nur das HOMEMODE Gerät auf deutsch geändert werden&lt;br /&gt;
 attr Home HomeLanguage DE&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle==&lt;br /&gt;
&#039;&#039;set &amp;lt;required&amp;gt; [optional]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 set Home anyoneElseAtHome &amp;lt;on/off&amp;gt;&lt;br /&gt;
einschalten wenn jemand anderes zu Hause ist der kein registrierter ROOMMATE/GUEST ist, z.B. Hund/Katze oder unregistrierte Gäste&amp;lt;br&amp;gt;&lt;br /&gt;
wenn eingeschaltet, dann wird der Alarm Mode beim Verlassen statt auf armaway nur auf armhome gestellt&amp;lt;br&amp;gt;&lt;br /&gt;
schaltet man ein und hat schon Haus/Wohnung verlassen, so wird der Alarm Mode von armaway auf armhome gestellt&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%AEAH%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home dnd &amp;lt;on/off&amp;gt;&lt;br /&gt;
schaltet den &amp;quot;Bitte nicht stören&amp;quot; Modus ein&amp;lt;br&amp;gt;&lt;br /&gt;
z.B. um Benachrichtigungen zu deaktivieren&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DND%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home dnd-for-minutes &amp;lt;MINUTES&amp;gt;&lt;br /&gt;
schaltet den &amp;quot;Bitte nicht stören&amp;quot; Modus für die angegebenen Minuten ein&amp;lt;br&amp;gt;&lt;br /&gt;
kehrt danach zum vorherigen (tageszeitabhängigen) Modus zurück&lt;br /&gt;
&lt;br /&gt;
 set Home deviceDisable &amp;lt;DEVICE&amp;gt;&lt;br /&gt;
deaktiviert das Gerät für sämtliche HOMEMODE Automationen&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DISABLED%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DEVICE%&#039;&#039;&#039; und &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home deviceEnable &amp;lt;DEVICE&amp;gt;&lt;br /&gt;
reaktiviert das Gerät für sämtliche HOMEMODE Automationen&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DISABLED%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DEVICE%&#039;&#039;&#039; und &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home location &amp;lt;arrival/home/bed/underway/wayhome&amp;gt;&lt;br /&gt;
manueller Ortswechsel&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%LOCATION%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home mode &amp;lt;morning/day/afternoon/evening/night/gotosleep/asleep/absent/gone/home&amp;gt;&lt;br /&gt;
manueller Moduswechsel&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%MODE%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVMODE%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home modeAlarm &amp;lt;armaway/armhome/armnight/disarm&amp;gt;&lt;br /&gt;
schaltet den angegebenen Alarm Modus ein&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%AMODE%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVAMODE%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 set Home modeAlarm-for-minutes &amp;lt;armaway/armhome/armnight/disarm&amp;gt; &amp;lt;MINUTES&amp;gt;&lt;br /&gt;
schaltet den angegebenen Alarm Modus für die angegebenen Minuten ein&lt;br /&gt;
kehrt danach zum vorherigen Alarm Modus zurück&lt;br /&gt;
&lt;br /&gt;
 set Home updateHomebridgeMapping&lt;br /&gt;
aktualisiert das Attribut homebridgeMapping des HOMEMODDE Device abhängig von den verfügbaren Informationen&lt;br /&gt;
&lt;br /&gt;
 set Home updateInternalForce&lt;br /&gt;
führt eine Aktualisierung der Internals des HOMEMODE Device aus&amp;lt;br&amp;gt;&lt;br /&gt;
das sollte manuell benutzt werden nachdem das Modul aktualisiert und nur ein reload statt restart gemacht wurde&amp;lt;br&amp;gt;&lt;br /&gt;
auch wenn man überwachte/kontrollierte Geräte ändert sollte man diesen Befehl manuell ausführen, z.B. neue ROOMMATE/GUEST im RESIDENTS Device hinzufügt, oder Geräte in FHEM hinzufügt die dem selben Devspec wie bisher entsprechen (Steckdosen, Sensoren)&lt;br /&gt;
&lt;br /&gt;
==Get-Befehle==&lt;br /&gt;
&#039;&#039;get &amp;lt;required&amp;gt; [optional]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 get Home contactsOpen &amp;lt;all/doorsinside/doorsoutside/doorsmain/outside/windows&amp;gt;&lt;br /&gt;
Liste von all/doorsinside/doorsoutside/doorsmain/outside/windows offenen Kontakten&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%OPEN%&#039;&#039;&#039;, &#039;&#039;&#039;%OPENCT%&#039;&#039;&#039; und &#039;&#039;&#039;%OPENHR%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home devicesDisabled&lt;br /&gt;
Anzeige der für HOMEMODE deaktivierten Geräte&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%DISABLED%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home mode&lt;br /&gt;
Anzeige von mode&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%MODE%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home modeAlarm&lt;br /&gt;
Anzeige von modeAlarm&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%AMODE%&#039;&#039;&#039; und &#039;&#039;&#039;%MODEALARM%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home publicIP&lt;br /&gt;
holen der öffentlichen IP Adresse&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%IP%&#039;&#039;&#039; ist in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home sensorsTampered&lt;br /&gt;
Liste aller sabotierten Sensoren&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%TAMPERED%&#039;&#039;&#039;, &#039;&#039;&#039;%TAMPEREDCT%&#039;&#039;&#039; und &#039;&#039;&#039;%TAMPEREDHR%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home weather &amp;lt;long/short&amp;gt;&lt;br /&gt;
Wetterinfo im angegebenen Format anzeigen&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%WEATHER%&#039;&#039;&#039; und &#039;&#039;&#039;%WEATHERLONG%&#039;&#039;&#039; sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
 get Home weatherForecast [TAG]&lt;br /&gt;
Wettervorhersage für angegebenen Tag&amp;lt;br&amp;gt;&lt;br /&gt;
wenn kein Tag angegeben wird, so wird die Vorhersage für morgen (2) ausgegeben&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%FORECAST%&#039;&#039;&#039; (morgen) und &#039;&#039;&#039;%FORECASTTODAY%&#039;&#039;&#039; (heute) sind in allen HomeCMD Attributen verfügbar&lt;br /&gt;
&lt;br /&gt;
==webCmd==&lt;br /&gt;
Die Schaltmöglichkeiten sind absichtlich gering gehalten, denn im normalen Betrieb sollte nicht mehr benötigt werden als die hier gebotenen.&amp;lt;br&amp;gt;&lt;br /&gt;
Es lässt sich der Alarm Mode manuell umschalten und beim Klick auf das devStateIcon wird der DND Mode an- und ausgeschaltet.&lt;br /&gt;
&lt;br /&gt;
=Konfiguration=&lt;br /&gt;
&lt;br /&gt;
==Grundkonfiguration==&lt;br /&gt;
&lt;br /&gt;
Diese Grundkonfiguration sollte immer als erstes erfolgen um entsprechend darauf weiter aufzubauen. Als zweiter Schritt ist dann die erweiterte Konfiguration angedacht.&lt;br /&gt;
&lt;br /&gt;
Bei der Namensvergabe der Attribute vom HOMEMODE Device wurde nach einem möglichst kurzem Prefix gesucht und nach vielen Tests wurde sich für das Prefix &amp;quot;Home&amp;quot; entschieden. Das hat den Vorteil dass alle Attribute beisammen stehen und diese auch (durch den Großbuchstaben am Anfang) ziemlich weit oben in der Liste der Attribute stehen. Ebenso wurde bei der Namensvergabe versucht selbsterklärende Namen zu wählen, das hat den Vorteil dass man relativ einfach genau erkennen kann wofür das Attribut steht, allerdings auch den Nachteil dass einige Attributnamen ganz schön lang werden.&lt;br /&gt;
&lt;br /&gt;
===Attribute===&lt;br /&gt;
&lt;br /&gt;
====HomeAdvancedUserAttr====&lt;br /&gt;
Als Erstes wird empfohlen, gerade für Anfänger, das Attribut &amp;quot;HomeAdvancedUserAttr&amp;quot; auf 1 zu setzen. Dadurch werden viel mehr HomeCMD Attribute freigeschaltet. Diese werden im Attribut userattr des HOMEMODE Device hinzugefügt.&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoAlarmModes====&lt;br /&gt;
Als nächstes sollte man sich entscheiden ob die Alarm Modus evtl. nicht automatisch zum jeweiligen Modus des HOMEMODE Device geschaltet werden sollen. Standardmäßig werden die Alarm Modus automatisch gesteuert. Ist das nicht erwünscht, so ist der Wert dieses Attributs auf 0 zu setzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Modus &amp;quot;absent&amp;quot; des HOMEMODE Device wird automatisch auf &amp;quot;armaway&amp;quot; geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Modus &amp;quot;home&amp;quot; des HOMEMODE Device wird automatisch auf &amp;quot;disarm&amp;quot; geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Modus &amp;quot;asleep&amp;quot; des HOMEMODE Device wird automatisch auf &amp;quot;armnight&amp;quot; geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
Alarm Modus &amp;quot;armhome&amp;quot; kann nur manuell gesetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 oder 1&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
====HomeAutoArrival====&lt;br /&gt;
Ist hier ein Wert größer 0 angegeben, so wird bei Ankunft jedes ROOMMATE/GUEST die location des jeweiligen ROOMMATE/GUEST für die hier angegeben Zeit in Minuten auf &amp;quot;arrival&amp;quot; gesetzt. Beim ersten nach Hause kommenden ROOMMATE/GUEST wird zusätzlich die location des HOMEMODE Device für die hier eingestellte Zeit in Minuten auf &amp;quot;arrival&amp;quot; gesetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Nach Ablauf der hier eingestellten Minuten wechelt das jeweilige Device von &amp;quot;arrival&amp;quot; auf &amp;quot;home&amp;quot; sofern es noch die location &amp;quot;arrival&amp;quot; hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 5999.9&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoAsleep====&lt;br /&gt;
Ist hier ein Wert größer 0 angegeben, so wird beim Schlafengehen (gotosleep) jedes ROOMMATE/GUEST ein Timer gestartet der den jeweiligen ROOMMATE/GUEST nach der hier angegeben Zeit in Minuten auf &amp;quot;asleep&amp;quot; setzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 5999.9&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoAwoken====&lt;br /&gt;
Ist hier ein Wert größer 0 angegeben, so wird beim Erwachen (&amp;quot;awoken&amp;quot; oder &amp;quot;home nach asleep&amp;quot;) jedes ROOMMATE/GUEST dieser auf &amp;quot;awoken&amp;quot; gesetzt und ein Timer gestartet der den jeweiligen ROOMMATE/GUEST nach der hier angegeben Zeit in Minuten auf &amp;quot;home&amp;quot; setzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 5999.9&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoDaytime====&lt;br /&gt;
Standardmäßig wird mode anhand der Tageszeit automatisch gesetzt. Ist das nicht gewünscht kann das über den Wert 0 deaktiviert werden. Dann stehen allerdings tageszeitabhängigen mode(s) nicht mehr zur Verfügung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 oder 1&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
====HomeResidentCmdDelay====&lt;br /&gt;
Normalerweise werden die Events der ROOMMATE/GUEST vor denen des HOMEMODE Device ausgeführt, um das zu ändern wird die Ausführung der ROOMMATE/GUEST HomeCMD Attribute um die hier eingestellte Zeit in Sekunden verzögert.&amp;lt;br&amp;gt;&lt;br /&gt;
Je genauer der Name des jeweiligen HomeCMD Attributs beschrieben wird, desto später wird dieser ausgeführt.&amp;lt;br&amp;gt;&lt;br /&gt;
Das heißt z.B. dass HomeCMDmode vor HomeCMDmode-absent und dieser wiederrum vor HomeCMDmode-absent-ROOMMATE/GUEST-NAME ausgeführt wird usw.&amp;lt;br&amp;gt;&lt;br /&gt;
Um das normale Verhalten wiederherzustellen ist der Wert dieses Attributs auf 0 zu setzen. Dann wird HomeCMDmode-absent-ROOMMATE/GUEST-NAME vor HomeCMDmode-absent und vor HomeCMDmode ausgeführt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis unendlich in Sekunden&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
==Konfiguration Presence Devices (automatische anwesend/abwesend Umschaltung von ROOMMATE/GUEST)==&lt;br /&gt;
Damit die automatische Zuordnung der Presence Devices zu ihren ROOMMATE/GUEST Devices zuverlässig funktioniert, ist es nötig dass der Hauptteil des Namens des ROOMMATE/GUEST innerhalb des Namens des zugehörigen PRESENCE Device(s) vorkommt.&amp;lt;br&amp;gt;&lt;br /&gt;
Im Attribut HomePresenceDeviceType kann man den zu suchenden TYPE von Presence Device vorgeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Per Default werden nur Devices vom TYPE PRESENCE gesucht und versucht den ROOMMATE/GUEST zuzuweisen.&amp;lt;br&amp;gt;&lt;br /&gt;
Falls man z.B. auch Devices vom TYPE dummy zur Anwesenheitssteuerung benutzt, kann man diese im Attribut HomePresenceDeviceType mit hinzunehmen. Es sind alles Device TYPEn möglich die ein &amp;quot;presence&amp;quot; Reading mit den Werten &amp;quot;present/appeared&amp;quot; und &amp;quot;absent/disappeared&amp;quot; bereitstellen. Mehrere TYPEn sind möglich da in diesem Attribut ein Regex erwartet wird. z.B.: dummy oder PRESENCE|dummy oder PRESENCE|dummy|ONKYO_AVR.&lt;br /&gt;
&lt;br /&gt;
===Beispiel===&lt;br /&gt;
Der Device Name meines ROOMMATE ist &amp;quot;rr_Dan&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Auf der Suche nach dem zugehörigen Presence Device wird der erste Teil (rr_ oder rg_) weggeschnitten und der Rest in Kleinbuchstaben umgewandelt.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit dem was übrig bleibt, bei mir also nur dan, werden die möglichen Presence Devices versucht zu erkennen.&amp;lt;br&amp;gt;&lt;br /&gt;
Mein zugehöriges Presence Device heißt, historisch gewachsen, PRESENCE_rr_Dan und würde somit problemlos zugeordnet werden können.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Namen der zugehörigen Presence Devives könnten in ihrer kürzesten Form auch wie folgt sein um meinen ROOMMATE/GUEST Device zugeordnet zu werden:&amp;lt;br&amp;gt;&lt;br /&gt;
 pdan&lt;br /&gt;
 danp&lt;br /&gt;
 ZDan&lt;br /&gt;
 DANZ&lt;br /&gt;
 wenndannsonst&lt;br /&gt;
Aber Achtung, es funktioniert nicht mehr wenn die Namen nicht eindeutig sind. Wenn es z.B. eine rr_Dana geben würde mit Presence Device Name &amp;quot;pdani&amp;quot;, dann würde dieser Name auch bei mir (dan) passen. Das könnte man aber auch bewußt nutzen um mit einem Presence Device 2 ROOMMATE/GUEST Devices gleichzeitig zu steuern.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn die Namen wirklich absolut eindeutig sind, dann könnte man den Regex im Attribut HomePresenceDeviceType sogar auf &amp;quot;.*&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Werden pro ROOMMATE/GUEST mehrere Presence Devices gefunden und zugeordnet, so wird automatisch dass Attribut HomePresenceDeviceAbsentCount-&amp;lt;NAME-ROOMMATE/GUEST&amp;gt; auf die Anzahl der gefundenen Presence Devices gesetzt, so dass der/die jeweilige ROOMMATE/GUEST immer erst als abwesend gewertet wird sobald alle zugehörigen Presence Devices abwesend sind. Analog dazu gibt es noch das Attribut HomePresenceDevicePresentCount-&amp;lt;NAME-ROOMMATE/GUEST&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Attribute===&lt;br /&gt;
&lt;br /&gt;
====HomeAutoPresence====&lt;br /&gt;
Ist dieses Attribut auf 1 gesetzt, so werden die ROOMMATE/GUEST Devices automatisch zum Status ihrer zugehörigen PRESENCE Devices geschaltet.&amp;lt;br&amp;gt;&lt;br /&gt;
PRESENCE Device present - ROOMMATE/GUEST home&amp;lt;br&amp;gt;&lt;br /&gt;
PRESENCE Device absent - ROOMMATE/GUEST absent&amp;lt;br&amp;gt;&lt;br /&gt;
Falls es sich bei den von Euch benutzen PRESENCE Devices nicht um Devices vom TYPE PRESENCE handeln sollte, sondern z.B. um PRESENCE und dummy, so kann dieses im Attribut HomePresenceDeviceType als Regex konfiguriert werden! z.B.: PRESENCE|dummy&amp;lt;br&amp;gt;&lt;br /&gt;
Damit ein Device als Presence Device erkannt werden kann, muss dieses über ein presence Reading verfügen.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 oder 1&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAutoPresenceSuppressState====&lt;br /&gt;
unterdrücke Anwesenheitsänderung in angegebenen State(s) der RESIDENTS&amp;lt;br&amp;gt;&lt;br /&gt;
z.B. für &amp;quot;mysteriös&amp;quot; verschwindende Anwesenheitsgeräte in der Nacht&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: asleep|awoken|gotosleep&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomePresenceDeviceType====&lt;br /&gt;
Regex des TYPEs/der TYPEn von Presence Devices&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: Regex der Device TYPEn&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: PRESENCE&lt;br /&gt;
&lt;br /&gt;
==Erweiterte Konfiguration==&lt;br /&gt;
Um das HOMEMODE Device vollumfänglich zu benutzen ist es sinnvoll weitere Devices (zur Überwachung) hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Die bereits möglichen hinzuzufügenden Devices werden hier folgend nach Attributnamen erklärt.&lt;br /&gt;
&lt;br /&gt;
===Attribute zum Hinzufügen weiterer Geräte===&lt;br /&gt;
&lt;br /&gt;
====HomeEventsCalendarDevices====&lt;br /&gt;
Hier ist ein Devspec von holiday/Calendar Device(s) anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Es wird empfohlen die holiday/Calendar Namen in Großbuchstaben anzulegen, da dann die daraus resultierenden Platzhalter ebenfalls Großbuchstaben sind und somit zu den anderen Platzhaltern passen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Es werden alle Typen von holiday Events (1,2,3,4,5) unterstützt.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Calendar sind auch gleichzeitig startende/laufende Events möglich, sie müssen nur unterschiedliche Titel haben (summary).&amp;lt;br&amp;gt;&lt;br /&gt;
Der jeweilige Event Text kann auch Leerzeichen enthalten, welche in den HomeCMD Attributen durch Bindestriche (-) ersetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039;, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; in den HomeCMDevent Attributen zur Verfügung. &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039; wird dann durch den Namen, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; durch das aktuelle Event und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; durch das vorherige Event des jeweiligen Kalenders ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec von holiday/Calendar Geräten&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeEventsHolidayDevices====&lt;br /&gt;
Hier ist ein Devspec von holiday/Calendar Device(s) anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Es wird empfohlen die holiday/Calendar Namen in Großbuchstaben anzulegen, da dann die daraus resultierenden Platzhalter ebenfalls Großbuchstaben sind und somit zu den anderen Platzhaltern passen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Es werden alle Typen von holiday Events (1,2,3,4,5) unterstützt.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Calendar sind auch gleichzeitig startende/laufende Events möglich, sie müssen nur unterschiedliche Titel haben (summary).&amp;lt;br&amp;gt;&lt;br /&gt;
Der jeweilige Event Text kann auch Leerzeichen enthalten, welche in den HomeCMD Attributen durch Bindestriche (-) ersetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039;, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; in den HomeCMDevent Attributen zur Verfügung. &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039; wird dann durch den Namen, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; durch das aktuelle Event und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; durch das vorherige Event des jeweiligen Kalenders ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec von holiday/Calendar Geräten&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorAirpressure====&lt;br /&gt;
Luftdrucksensor aussen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Name des Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorHumidityOutside====&lt;br /&gt;
Hier ist der Name des (Haupt)Aussensensors für Luftfeuchtigkeit anzugeben. Dieser muss ein Reading humidity besitzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Falls der Sensor für (Aussen)Luftfeuchtigkeit und Aussentemperatur ein und der selbe ist, so muss dieser nur einmalig im Attribut HomeSensorTemperatureOutside hinterlegt werden. Dieser muss dann die beiden Readings humidity und temperature haben. Im Bedarfsfall können diese Readings auch vorher entsprechend durch eigene userReadings erstellt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser Sensor stellt den Platzhalter &#039;&#039;&#039;%HUMIDITY%&#039;&#039;&#039; für den Wert des Readings humidity zur Verfügung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Device Name mit Reading humidity&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorTemperatureOutside====&lt;br /&gt;
Hier ist der Name des (Haupt)Aussentemperatursensors anzugeben. Dieser muss mindestens ein Reading temperature besitzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Falls der Sensor für Aussentemperatur auch ein Reading humidity besitzen sollte und dieses auch der Sensor für die Aussenlufteuchtigkeit ist, so muss dieser nur einmalig hier in diesem Attribut hinterlegt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser Sensor stellt den Platzhalter &#039;&#039;&#039;%TEMPERATURE%&#039;&#039;&#039; für den Wert des Readings temperature zur Verfügung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Device Name mit Reading temperature und optional humidity&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContact====&lt;br /&gt;
Hier können alle Kontakt Sensoren als Devspec hinterlegt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; in den HomeCMDcontact Attributen zur Verfügung. &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; wird dann durch den Alias, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; durch den Namen und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; durch den aktuellen state des zuletzt ausgelösten Kontakts ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;In meinem Falle sind das optische und magnetische Kontaktsensoren vom HomeMatic. HM-SEC-SCo und HM-SEC-SC-2.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Darum ist bei mir als Devspec &#039;&#039;&#039;model=HM-SEC-SC(o|-2)&#039;&#039;&#039; eingetragen um alle diese Kontaktsensoren zu erfassen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nach Übernehmen des Attributs werden alle gefundenen Kontaktsensoren mit ihren Namen im Internal SENSORSCONTACT des HOMEMODE Device einzeln aufgelistet und können dort auch direkt angeklickt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Des weiteren werden beim Übernehmen dieses Attributs jedem Kontaktsensor folgende Attribute im Attribut userattr hinzugefügt:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====HomeContactType=====&lt;br /&gt;
Typ des Kontakts - wird versucht anhand des Namen/Alias beim Hinzufügen zum HOMEMODE Device zu ermitteln, sollte jedoch für jeden Kontaktsensor einzeln überprüft werden&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: doorinside,dooroutside,doormain,window&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: vorgegebene Werteauswahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: window&lt;br /&gt;
&lt;br /&gt;
=====HomeModeAlarmActive=====&lt;br /&gt;
Regex der Alarm Mode(s) in denen der Kontaktsensor eine erfolgte Öffnung als Alarm melden soll.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: armaway|armhome|armnight&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex von Alarm Modes&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: armaway&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenDontTriggerModes=====&lt;br /&gt;
Regex der Mode(s) des HOMEMODE Device in denen keine Offen Warnungen erfolgen sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist ein Kontakt geöffnet während die hier eingestellten Mode(s) eintreten, so wird der noch bestehende Timer abgebrochen. Entgegengesetzt startet er wieder sobal die hier eingestellten Mode(s) verlassen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Ist hier z.B. &amp;quot;gotosleep|asleep&amp;quot; eingestellt, so kann man z.B. das Fenster schon vor dem Auslösen von gotosleep oder asleep öffnen und der bestehende Offenwarnung-Timer wird dann abgebrochen. Sobald man am Morgen z.B. awoken oder home auslöst, so wird ein neuer Timer gestartet der einen dann an das noch offene Fenster erinnert.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: alle Modes des HOMEMODE Device&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex von Modes&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenDontTriggerModesResidents=====&lt;br /&gt;
Devspec der ROOMMATE/GUEST Devices deren Status statt der Modes des HOMEMODE Device für Attribut HomeOpenDontTriggerModes benutzt werden soll.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: alle überwachten ROOMMATE/GUEST&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenMaxTrigger=====&lt;br /&gt;
Maximale Anzahl an Warnmeldungen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis ~&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: ganze Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenTimes=====&lt;br /&gt;
Leerzeichenseparierte Liste von Offen Warnung Zeiten in Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Der erste Wert entspricht der ersten Zeit, der zweite Wert der zweiten Zeit usw.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Anzahl sollte dem Wert im Attribut HomeOpenMaxTrigger entsprechen. Wenn hier weniger Zeiten vorgegeben werden, so wird für weitere Offen Warnungen immer die letzte hier angegebene Zeit verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit einer Kommmastelle, z.B. 2.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 10&lt;br /&gt;
&lt;br /&gt;
=====HomeOpenTimesDividers=====&lt;br /&gt;
Leerzeichenseparierte Liste von Offenwarnzeit Teilern.&amp;lt;br&amp;gt;&lt;br /&gt;
Es müssen so viele Werte angegeben werden wie in HomeSeasons Jahreszeiten hinterlegt worden sind (Default 4).&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer normalen Offenwarnzeit von 10 Minuten und den hier anzugebenen Teilern z.B. &amp;quot;2 1 2 3&amp;quot; ergeben sich für Frühling und Herbst Offenwarnzeiten von jeweils 5 Minuten und im Winter 3.3 Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte überschreiben die Werte aus dem Attribut HomeSensorsContactOpenTimeDividers des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit einer Kommmastelle, z.B. 2 1 2 2.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
=====HomeReadings=====&lt;br /&gt;
Zwei leerzeichenseparierte Readings für open und sabotage Status.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings überschreiben die Werte aus dem Attribut HomeSensorsContactReadings des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
=====HomeValues=====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte überschreiben die Werte aus dem Attribut HomeSensorsContactValues des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|tilted|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactReadings====&lt;br /&gt;
Zwei leerzeichenseparierte Readings für open und sabotage Status.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeReadings in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactValues====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeValues in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|tilted|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactOpenTimeDividers====&lt;br /&gt;
Leerzeichenseparierte Liste von Offenwarnzeit Teilern.&amp;lt;br&amp;gt;&lt;br /&gt;
Es müssen so viele Werte angegeben werden wie in HomeSeasons Jahreszeiten hinterlegt worden sind (Default 4).&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer normalen Offenwarnzeit von 10 Minuten und den hier anzugebenen Teilern z.B. &amp;quot;2 1 2 3&amp;quot; ergeben sich für Frühling und Herbst Offenwarnzeiten von jeweils 5 Minuten und im Winter 3.3 Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeOpenTimesDividers in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit max. einer Kommmastelle, z.B. 2 1 2 2.5 (für 4 Jahreszeiten)&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactOpenTimeMin====&lt;br /&gt;
Minimale Zeit in Minuten die mindestens für eine Offenwarnung gewartet werden soll - im Falle dass sich durch den Teiler evtl. zu kleine Werte ergeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: eine Zahle mit max. einer Kommmastelle, z.B. 2.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsContactOpenTimes====&lt;br /&gt;
Leerzeichenseparierte Liste von Offen Warnung Zeiten in Minuten.&amp;lt;br&amp;gt;&lt;br /&gt;
Der erste Wert entspricht der ersten Zeit, der zweite Wert der zweiten Zeit usw.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Anzahl sollte dem Wert im Attribut HomeOpenMaxTrigger entsprechen. Wenn hier weniger Zeiten vorgegeben werden, so wird für weitere Offen Warnungen immer die letzte hier angegebene Zeit verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: leerzeichenseparierte Liste von Zahlen mit max. einer Kommmastelle, z.B. 7.5&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 10&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsLuminance====&lt;br /&gt;
Devspec von (Innen-)Lichtsensoren deren Durchschnittswert berechnet werden soll&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsMotion====&lt;br /&gt;
Hier können alle Bewegungs Sensoren als Devspec hinterlegt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Devices stellen zusätzlich die Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; in den HomeCMDmotion Attributen zur Verfügung. &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039; wird dann durch den Alias, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; durch den Namen und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; durch den aktuellen state des zuletzt ausgelösten Kontakts ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;In meinem Falle sind das Fibaro Motion Sensor Gen4/5.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Darum ist bei mir als Devspec &#039;&#039;&#039;modelId=010f-0801-1001|010f-0800-1001&#039;&#039;&#039; eingetragen um alle diese Bewegungssensoren zu erfassen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Damit bei den Gen5 Sensoren auch das open im reading state steht, habe ich mir bei diesen Sensoren ein userReading angelegt.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nach Übernehmen des Attributs werden alle gefundenen Bewegungssensoren mit ihren Namen im Internal SENSORSMOTION des HOMEMODE Device einzeln aufgelistet und können dort auch direkt angeklickt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Des weiteren werden beim Übernehmen dieses Attributs jedem Bewegungssensor folgende Attribute im Attribut userattr hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
=====HomeModeAlarmActive=====&lt;br /&gt;
Regex der Alarm Mode(s) in denen der Bewegungssensor eine erfolgte Öffnung als Alarm melden soll.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: armaway|armhome|armnight&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex von Alarm Modes&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: armaway&lt;br /&gt;
&lt;br /&gt;
=====HomeReadings=====&lt;br /&gt;
2 leerzeichenseparierte Readings für open und sabotage.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings überschreiben die Werte aus dem Attribut HomeSensorsMotionReadings des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
=====HomeSensorLocation=====&lt;br /&gt;
Standort des Bewegungssensors (außen oder innen) - wird standardmäßig beim Hinzufügen zum HOMEMODE Device auf &amp;quot;inside&amp;quot; gesetzt, sollte jedoch für jeden Kontaktsensor einzeln überprüft werden&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: inside,outside&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: vorgegebene Werteauswahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: inside&lt;br /&gt;
&lt;br /&gt;
=====HomeValues=====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte überschreiben die Werte aus dem Attribut HomeSensorsMotionValues des HOMEMODE Device.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsMotionReadings====&lt;br /&gt;
2 leerzeichenseparierte Readings für open und sabotage.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Readings sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeReadings in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state sabotageError&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsMotionValues====&lt;br /&gt;
Regex der Werte die für offen und sabotiert stehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die hier eingetragenen Werte sind global für alle Kontaktsensoren, können aber durch setzen des Attributs HomeValues in jedem Sensor überschrieben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Regex&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: open|on&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsPowerEnergy====&lt;br /&gt;
Hier können alle Energie Sensoren als Devspec hinterlegt werden. Diese müssen die beiden Readings power und energy besitzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Anhand dieser Readings wird dann der Gesamtverbrauch und die derzeitige gesamte Leistungsaufnahme berechnet.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;In meinem Falle sind das Fibaro Wall Plugs Gen4/5.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;Darum ist bei mir als Devspec &#039;&#039;&#039;modelId=010f-0600-1000|010f-0602-1001&#039;&#039;&#039; eingetragen um alle diese Energie Sensoren zu erfassen.&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec mit vorhandenen energy und power Readings&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsSmoke====&lt;br /&gt;
Devspec mit Rauchmeldern&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorWindspeed====&lt;br /&gt;
Sensor für Windgeschwindigkeit&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Name des Sensors und Reading der Windgeschwindigkeit separiert mit : (z.B. ga_Windsensor:wind)&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsBattery====&lt;br /&gt;
Devspec von Batteriesensoren mit einem Reading &amp;quot;battery&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTriggerAnyoneElseAtHome====&lt;br /&gt;
auslösendes Gerät für anyoneElseAtHome&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: device:reading:valueOn:valueOff&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTriggerPanic====&lt;br /&gt;
auslösendes Gerät für Panikalarm&amp;lt;br&amp;gt;&lt;br /&gt;
valueOff ist optional, wird es weggelassen, so fungiert valueOn als toggle&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: device:reading:valueOn[:valueOff]&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTwilightDevice====&lt;br /&gt;
Hier ist der Name des lokalen Twilight Device anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Device stellt zusätzlich die Platzhalter &#039;&#039;&#039;%LIGHT%&#039;&#039;&#039;, &#039;&#039;&#039;%TWILIGHT%&#039;&#039;&#039; und &#039;&#039;&#039;%TWILIGHTEVENT%&#039;&#039;&#039; in den HomeCMD Attributen zur Verfügung. &#039;&#039;&#039;%LIGHT%&#039;&#039;&#039; wird dann durch das Reading light, &#039;&#039;&#039;%TWILIGHT%&#039;&#039;&#039; durch das Reading twilight und &#039;&#039;&#039;%TWILIGHTEVENT%&#039;&#039;&#039; durch das aktuelle Twilight Event ersetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeUWZ====&lt;br /&gt;
Hier ist der Name des lokalen UWZ Geräts anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%UWZ%&#039;&#039;&#039;, &#039;&#039;&#039;%UWZSHORT%&#039;&#039;&#039; und &#039;&#039;&#039;%UWZLONG%&#039;&#039;&#039; sind verfügbar in allen HomeCMD Attributen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Name des UWZ Geräts&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeYahooWeatherDevice====&lt;br /&gt;
Hier ist der Name des lokalen Yahoo Weather Geräts anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Device stellt zusätzlich einige Platzhalter zur Verfügung. Für die genaue Beschreibung derer siehe &amp;quot;Platzhalter&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Devspec&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
===HomeText Attribute===&lt;br /&gt;
Die HomeText Attribute sind größtenteils zur Übersetzung einiger benötigter Begriffe gedacht.&amp;lt;br&amp;gt;&lt;br /&gt;
In den speziellen Attributen die mit HomeTextWeather anfangen, sind ganze Texte mit entsprechenden Platzhaltern einzufügen.&lt;br /&gt;
&lt;br /&gt;
====HomeTextAndAreIs====&lt;br /&gt;
Übersetzung für &amp;quot;and&amp;quot;, &amp;quot;are&amp;quot; und &amp;quot;is&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort/Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: and|are|is&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 und|sind|ist&lt;br /&gt;
&lt;br /&gt;
====HomeTextClosedOpen====&lt;br /&gt;
Übersetzung für &amp;quot;closed&amp;quot; und &amp;quot;open&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: closed|open&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 geschlossen|geöffnet&lt;br /&gt;
&lt;br /&gt;
====HomeTextNosmokeSmoke====&lt;br /&gt;
Übersetzung für &amp;quot;no smoke&amp;quot; und &amp;quot;smoke&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: no smoke|smoke&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 kein Rauch|Rauch&lt;br /&gt;
&lt;br /&gt;
====HomeTextRisingConstantFalling====&lt;br /&gt;
Übersetzung für &amp;quot;rising&amp;quot;, &amp;quot;constant&amp;quot; und &amp;quot;falling&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: rising|constant|falling&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 steigend|gleichbleibend|fallend&lt;br /&gt;
&lt;br /&gt;
====HomeTextTodayTomorrowAfterTomorrow====&lt;br /&gt;
Übersetzung für &amp;quot;today&amp;quot;, &amp;quot;tomorrow&amp;quot; und &amp;quot;day after tomorrow&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar separiert mit |&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: today|tomorrow|day after tomorrow&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 Heute|Morgen|Übermorgen&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherNoForecast====&lt;br /&gt;
Übersetzung für &amp;quot;No forecast available&amp;quot; - Text wenn keine Wettervorhersage verfügbar ist&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: No forecast available&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 Es ist leider keine Wettervorhersage für den angegebenen Tag verfügbar!&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherForecastInSpecDays====&lt;br /&gt;
Text mit Platzhaltern für Wettervorhersage in 4-10 Tagen&amp;lt;br&amp;gt;&lt;br /&gt;
spezielle Platzhalter die nur in diesem Attribut gültig sind: &#039;&#039;&#039;%CONDITION%&#039;&#039;&#039;, &#039;&#039;&#039;%DAY%&#039;&#039;&#039;, &#039;&#039;&#039;%HIGH%&#039;&#039;&#039; und &#039;&#039;&#039;%LOW%&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 In %DAY% Tagen %CONDITION% bei Temperaturen von %LOW% bis %HIGH%°C.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherForecastToday====&lt;br /&gt;
Text mit Platzhaltern für Wettervorhersage für heute&amp;lt;br&amp;gt;&lt;br /&gt;
spezielle Platzhalter die nur in diesem Attribut gültig sind: &#039;&#039;&#039;%CONDITION%&#039;&#039;&#039;, &#039;&#039;&#039;%DAY%&#039;&#039;&#039;, &#039;&#039;&#039;%HIGH%&#039;&#039;&#039; und &#039;&#039;&#039;%LOW%&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 %DAY% %CONDITION% bei Temperaturen von %LOW% bis %HIGH%°C. Aktuelle Temperatur %TEMPERATURE%°C bei einer Luftfeuchtigkeit von %HUMIDITY%%. Die gefühlte Temperatur ist %WINDCHILL%°C bei einer Windgeschwindigkeit von %WIND%km/h.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherForecastTomorrow====&lt;br /&gt;
Text mit Platzhaltern für Wettervorhersage für morgen/übermorgen&amp;lt;br&amp;gt;&lt;br /&gt;
spezielle Platzhalter die nur in diesem Attribut gültig sind: &#039;&#039;&#039;%CONDITION%&#039;&#039;&#039;, &#039;&#039;&#039;%DAY%&#039;&#039;&#039;, &#039;&#039;&#039;%HIGH%&#039;&#039;&#039; und &#039;&#039;&#039;%LOW%&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 %DAY% %CONDITION% bei Temperaturen von %LOW% bis %HIGH%°C.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherLong====&lt;br /&gt;
Langer Text mit Platzhaltern für aktuelle Wetterdaten&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 Es %TOBE% %CONDITION% bei %TEMPERATURE%°C und %HUMIDITY%% Luftfeuchtigkeit. Die gefühlte Temperatur ist %WINDCHILL%°C bei einer Windgeschwindigkeit von %WIND%km/h. Der Luftdruck ist %PRESSURETREND% bei %PRESSURE%hPa.&lt;br /&gt;
&lt;br /&gt;
====HomeTextWeatherShort====&lt;br /&gt;
Kurzer Text mit Platzhaltern für aktuelle Wetterdaten&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Text mit Platzhaltern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 %CONDITION%, %TEMPERATURE%°C, %HUMIDITY%% Luftfeuchtigkeit, Luftdruck %PRESSURE%hPa&lt;br /&gt;
&lt;br /&gt;
===weitere Attribute===&lt;br /&gt;
Viele weitere Dinge lassen sich anpassen.&lt;br /&gt;
&lt;br /&gt;
====HomeAdvancedDetails====&lt;br /&gt;
mehr Details anzeigen, abhängig von den zu HOMEMODE hinzugefügten Geräten&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: none, detail, both, room&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Auswahlliste&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: none&lt;br /&gt;
&lt;br /&gt;
====HomeDaytimes====&lt;br /&gt;
Eigene Tageszeiten als Paare aus Zeit|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: Zeit|Wort Paare separiert mit Leerzeichen&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Zeit|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 05:00|morning 10:00|day 14:00|afternoon 18:00|evening 23:00|night&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 00:00|Mitternacht&lt;br /&gt;
 00:05|Nacht&lt;br /&gt;
 06:30|Morgen&lt;br /&gt;
 10:00|Vormittag&lt;br /&gt;
 13:00|Mittag&lt;br /&gt;
 14:30|Nachmittag&lt;br /&gt;
 17:30|Vorabend&lt;br /&gt;
 19:00|Abend&lt;br /&gt;
 23:00|Spätabend&lt;br /&gt;
&lt;br /&gt;
====HomeIcewarningOnOffTemps====&lt;br /&gt;
2 leerzeichenseparierte Temperaturen für das Ein- und Ausschalten der Eiswarnung.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: zwei leerzeichenseparierte Temperaturen mit maximal einer Kommastelle&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 2 3&lt;br /&gt;
&lt;br /&gt;
====HomeModeAlarmArmDelay====&lt;br /&gt;
Zeit in Sekunden um das aktivieren der Alarmschaltung zu verzögern.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 99999&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl (gleiche Verzögerung für alle modeAlarm) oder 3 leerzeichenseparierte Zahlen für jeden modeAlarm (Reihenfolge: armaway armnight armhome)&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
&lt;br /&gt;
====HomeAtTmpRoom====&lt;br /&gt;
Diesen Raum zu temporäre at(s) hinzufügen die von HOMEMODE generiert werden&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomePresenceDeviceAbsentCount-&amp;lt;ROOMMATE/GUEST&amp;gt;====&lt;br /&gt;
Anzahl der dem ROOMMATE/GUEST zugeordneten Presence Geräte um den jeweiligen ROOMMATE/GUEST auf &amp;quot;absent&amp;quot; zu setzen&amp;lt;br&amp;gt;&lt;br /&gt;
Das Attribut ist nur verfügbar wenn mehr als ein Presence Gerät pro ROOMMATE/GUEST gefunden/zugeordnet wurde&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis ~&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: maximale Anzahl von verfügbaren Presence Geräten für jeden ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
====HomePresenceDevicePresentCount-&amp;lt;ROOMMATE/GUEST&amp;gt;====&lt;br /&gt;
Anzahl der dem ROOMMATE/GUEST zugeordneten Presence Geräte um den jeweiligen ROOMMATE/GUEST auf &amp;quot;present&amp;quot; zu setzen&amp;lt;br&amp;gt;&lt;br /&gt;
Das Attribut ist nur verfügbar wenn mehr als ein Presence Gerät pro ROOMMATE/GUEST gefunden/zugeordnet wurde&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis ~&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
&lt;br /&gt;
====HomePublicIpCheckInterval====&lt;br /&gt;
Interval in Minuten für die Überprüfung der öffentlichen IP-Adresse&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: 0 bis 99999&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelne Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 0 (deaktiviert)&lt;br /&gt;
&lt;br /&gt;
====HomeSeasons====&lt;br /&gt;
Eigene Jahreszeiten als Paare aus Datum|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: Datum|Wort Paare separiert mit Leerzeichen&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Datum|Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 03.01|spring 06.01|summer 09.01|autumn 12.01|winter&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 03.01|Frühling&lt;br /&gt;
 06.01|Sommer&lt;br /&gt;
 09.01|Herbst&lt;br /&gt;
 12.01|Winter&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsBatteryLowPercentage====&lt;br /&gt;
Prozentsatz um einen Batteriesensor mit geringer Batterie anzuzeigen (nur bei Sensoren die ihren Batteriewert prozentual angeben)&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Zahl&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 50&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsBatteryReading====&lt;br /&gt;
Reading der Batteriesensoren welches statt &amp;quot;battery&amp;quot; benutzt werden soll&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelnes Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: battery&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsLuminanceReading====&lt;br /&gt;
Reading der Lichtsensoren welches statt &amp;quot;luminance&amp;quot; benutzt werden soll&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: einzelnes Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: luminance&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsPowerEnergyReadings====&lt;br /&gt;
Readings der Power/Energy Sensoren welche statt &amp;quot;power&amp;quot; und &amp;quot;energy&amp;quot; benutzt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: 2 leerzeichenseparierte Wörter&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: power energy&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsSmokeReading====&lt;br /&gt;
Readings der Rauchmelder welche statt &amp;quot;state&amp;quot; benutzt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: ein Wort&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: state&lt;br /&gt;
&lt;br /&gt;
====HomeSensorsSmokeValue====&lt;br /&gt;
Regex der Auslösewerte von Rauchmeldern&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: RegEx&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: on&lt;br /&gt;
&lt;br /&gt;
====HomeSpecialLocation====&lt;br /&gt;
Hier können eigene zusätzliche location(s) als kommaseparierte Liste angegeben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese können dann über &amp;quot;set &amp;lt;HOMEMODE&amp;gt; location &amp;lt;LOCATION&amp;gt;&amp;quot; gesetzt werden. Dazu passend werden HomeCMD Attribute erstellt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: kommaseparierte Liste von Wörtern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeSpecialModes====&lt;br /&gt;
Hier können eigene zusätzliche mode(s) als kommaseparierte Liste angegeben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Diese können dann über &amp;quot;set &amp;lt;HOMEMODE&amp;gt; mode &amp;lt;MODE&amp;gt;&amp;quot; gesetzt werden. Dazu passend werden HomeCMD Attribute erstellt.&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: kommaseparierte Liste von Wörtern&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert:&lt;br /&gt;
&lt;br /&gt;
====HomeTrendCalcAge====&lt;br /&gt;
Zeit in Sekunden für das Maximalalter des vorherigen Wertes für die Trendberechnung&amp;lt;br&amp;gt;&lt;br /&gt;
Werte: frei wählbar&amp;lt;br&amp;gt;&lt;br /&gt;
Werteformat: Zeit in Sekunden&amp;lt;br&amp;gt;&lt;br /&gt;
Standardwert: 900&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Teil der Konfiguration ist das Befüllen der HomeCMD Attribute. Da dieses durch die Vermischung von FHEM Code, Perl Code und zusätzlichen Platzhaltern erst einmal sehr befremdlich sein kann, habe ich bei der Beschreibung der HomeCMD Attribute teilweise Beispiele hinzugefügt um den Einstieg weiter zu erleichtern.&lt;br /&gt;
&lt;br /&gt;
==HomeCMD Attribute (mit Beispielen)==&lt;br /&gt;
Die HomeCMD Attribute sind zum Festlegen der jeweiligen Schaltaktionen gedacht und können damit evtl. vorhandene notify/DOIF ablösen. Sie können mit FHEM-Code, Perl-Code oder aber auch mit beidem vermischt befüllt werden (wovon ich allerdings abrate). Zusätzlich sind noch diverse Platzhalter (siehe Platzhalter) verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Perl-Code innerhalb der HomeCMD Attribute gibt es hier Besonderheiten.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
*Im Gegensatz zur FHEM-Eingabezeile müssen hier keine Semikolon verdoppelt werden&lt;br /&gt;
*Kommetarzeilen sind zulässig&lt;br /&gt;
*Kommentare am Ende einer Perl-Zeile sind nicht zulässig&lt;br /&gt;
&lt;br /&gt;
Typischer Weise werden in den HomeCMD Attributen weitere Module angesprochen.&amp;lt;br&amp;gt;&lt;br /&gt;
Z.B. benutze ich für jegliche Form der Benachrichtigung den msg Befehl.&lt;br /&gt;
&lt;br /&gt;
Keines der HomeCMD Attribute hat einen Standardwert. Es müssen alle Befehle selbst programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Platzhalter die Text(e) (string) beinhalten, müssen im Perl-Code in Anführungszeichen gesetzt werden (Beispiel %SENSOR%).&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter die Zahlen beinhalten (int,float) sollten nicht in Anführungszeichen gesetzt werden damit Zahlenvergleiche (mittels ==, &amp;lt;=, &amp;gt;=, &amp;gt;, &amp;lt;) funktionieren (Beispiel %LIGHT%, %ICE% oder %TEMPERATURE%).&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmSmoke====&lt;br /&gt;
Befehle die beim Anfang/Ende eines Rauchalarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmSmoke-off====&lt;br /&gt;
Befehle die beim Ende eines Rauchalarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende Rauchalarm eines beliebigen (von HOMEMODE überwachten) Rauchmelders&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg push ENTWARNUNG: Alle Rauchalarme sind beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmSmoke-on====&lt;br /&gt;
Befehle die bei einem Rauchalarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Rauchalarm eines beliebigen (von HOMEMODE überwachten) Rauchmelders&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $is = &amp;quot;meldet&amp;quot;;&lt;br /&gt;
   $is = &amp;quot;melden&amp;quot; if (%SMOKECT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg push ACHTUNG: %SMOKEHR% $is Rauchalarm!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTampered====&lt;br /&gt;
Befehle die beim Anfang/Ende eines Sabotage Alarms ausgeführt werden sollen.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTampered-off====&lt;br /&gt;
Befehle die beim Ende eines Sabotage Alarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende Sabotage Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg push ENTWARNUNG: Alle Manipulationen wurden beseitigt!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTampered-on====&lt;br /&gt;
Befehle die bei einem Sabotage Alarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Sabotage Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $is = &amp;quot;ist&amp;quot;;&lt;br /&gt;
   $is = &amp;quot;sind&amp;quot; if (%TAMPEREDCT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg push ACHTUNG: %TAMPEREDHR% $is sabotiert!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTriggered====&lt;br /&gt;
Befehle die beim Anfang/Ende eines Alarms ausgeführt werden sollen.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTriggered-off====&lt;br /&gt;
Befehle die beim Ende eines Alarms ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg ENTWARNUNG: Alle Alarme sind beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDalarmTriggered-on====&lt;br /&gt;
Befehle die bei einem Alarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Alarm eines beliebigen (von HOMEMODE überwachten) Kontakt-/Bewegungs-Sensors&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $is = &amp;quot;ist&amp;quot;;&lt;br /&gt;
   $is = &amp;quot;sind&amp;quot; if (%ALARMCT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg audio,push,light 3 !!! ALARM !!! %ALARMHR% $is ausgelöst!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDanyoneElseAtHome====&lt;br /&gt;
Befehle die beim on/off von anyoneElseAtHome ausgeführt werden sollen.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDanyoneElseAtHome-off====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald anyoneElseAtHome deaktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Abwesenheit und nicht deaktiviertem HomeAutoAlarmModes wird der Alarm Mode von &amp;quot;armaway&amp;quot; auf &amp;quot;armhome&amp;quot; umgeschaltet damit evtl. vorhandene Bewegungsmelder keinen Alarm mehr melden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: anyoneElseAtHome on&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg HINWEIS: Es ist nun niemand anderes mehr zu Hause!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDanyoneElseAtHome-on====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald anyoneElseAtHome aktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Abwesenheit und nicht deaktiviertem HomeAutoAlarmModes wird der Alarm Mode von &amp;quot;armhome&amp;quot; auf &amp;quot;armaway&amp;quot; umgeschaltet damit evtl. vorhandene Bewegungsmelder wieder Alarme melden können.&amp;lt;br&amp;gt;&lt;br /&gt;
Wird anyoneElseAtHome bei Anwesenheit und nicht deaktiviertem HomeAutoAlarmModes aktiviert, so passiert erst einmal nichts, ausser dass die hier angegebenen Befehle ausgeführt werden. Wird dann später die Abwesenheit erkannt, schaltet der Alarm Mode auf &amp;quot;armhome&amp;quot; statt auf &amp;quot;armaway&amp;quot; damit evtl. vorhandene Bewegungsmelder keinen Alarm mehr melden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: anyoneElseAtHome off&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg HINWEIS: Es ist nun noch jemand anderes zu Hause!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDbatteryLow====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Sensor einen niedrigen Batteriewert meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $msg;&lt;br /&gt;
   $msg = &amp;quot;Die Batterien von %BATTERYLOW% gehen zur Neige und sollten ausgetauscht werden!&amp;quot; if (%BATTERYLOWCT% == 1);&lt;br /&gt;
   $msg = &amp;quot;Die Batterien bei folgenden Geräten sollten ausgetauscht werden: %BATTERYLOWALL%&amp;quot; if (%BATTERYLOWCT% &amp;gt; 1);&lt;br /&gt;
   fhem &amp;quot;msg push $msg&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontact====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor open/tilted/closed meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter %ALIAS%, %SENSOR% und %STATE% können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor open/tilted/closed&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun %STATE%!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactClosed====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor geschlossen meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter %ALIAS%, %SENSOR% und %STATE% können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor closed&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun geschlossen!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpen====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor offen meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor open/tilted&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun offen!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactDoormain====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor des Types doormain open/tilted/closed meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter %ALIAS%, %SENSOR% und %STATE% können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor Type doormain open/tilted/closed&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun %STATE%!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactDoormainClosed====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor des Types doormain closed meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor vom Typ doormain wird geschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 { &lt;br /&gt;
   # Wenn es Ankommende gibt&lt;br /&gt;
   if (&amp;quot;%ARRIVERS%&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Zusammenstellen der Begrüßung&lt;br /&gt;
     my $msg = &amp;quot;Gute&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # &amp;quot;n&amp;quot; anhängen wenn Tageszeit nicht Nacht ist&lt;br /&gt;
     $msg .= &amp;quot;n&amp;quot; if (&amp;quot;%DAYTIME%&amp;quot; ne &amp;quot;Nacht&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Leerzeichen einfügen&lt;br /&gt;
     $msg .= &amp;quot; &amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # den Feiertag der Tageszeit voranstellen wenn ein Feiertag im Kalender FEIERTAG ist&lt;br /&gt;
     $msg .= &amp;quot;%FEIERTAG%-&amp;quot; if (&amp;quot;%FEIERTAG%&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Tageszeit einfügen&lt;br /&gt;
     $msg .= &amp;quot;%DAYTIME% &amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # bei ROOMMATE &amp;quot;zu Hause&amp;quot; in Begrüßung einfügen&lt;br /&gt;
     $msg .= &amp;quot;zu Hause &amp;quot; if (&amp;quot;%RESIDENT%&amp;quot; =~ /^rr_/);&lt;br /&gt;
 &lt;br /&gt;
     # Ankommende einfügen&lt;br /&gt;
     $msg .= &amp;quot;%ARRIVERS%&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # Begrüßung am Sonos im Flur ausgeben bei Abwesenheit über 60 min&lt;br /&gt;
     fhem &amp;quot;msg audio \@fl_Sonos $msg!&amp;quot; if (%DURABSENCELAST% &amp;gt; 60);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactDoormainOpen====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor des Types doormain open/tilted meldet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Kontaktsensor vom Typ doormain geöffnet&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $a = &amp;quot;%ALIAS%&amp;quot;;&lt;br /&gt;
   $a =~ s/d/D/;&lt;br /&gt;
   fhem &amp;quot;msg $a ist nun geöffnet!&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpenWarning1====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor die erste Offenwarnzeit erreicht hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: erste Offenwarnzeit des Kontakts erreicht&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio %ALIAS% steht noch offen!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpenWarning2====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor die zweite Offenwarnzeit erreicht hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: ab Erreichen der zweiten Offenwarnzeit des Kontakts&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio %ALIAS% steht immer noch offen!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDcontactOpenWarningLast====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Kontaktsensor die letzte Offenwarnzeit erreicht hat.&amp;lt;br&amp;gt;&lt;br /&gt;
Die speziellen Platzhalter &#039;&#039;&#039;%ALIAS%&#039;&#039;&#039;, &#039;&#039;&#039;%SENSOR%&#039;&#039;&#039; und &#039;&#039;&#039;%STATE%&#039;&#039;&#039; können in diesem Attribut benutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Erreichen der letzten Offenwarnzeit des Kontakts&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Das ist der letzte Hinweis %ALIAS% endlich zu schliessen!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdaytime====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald sich die Tageszeit (daytime) auf einen beliebigen Wert ändert.&amp;lt;br&amp;gt;&lt;br /&gt;
Um die jeweilige eingetretene Tageszeit zu ermitteln ist der Platzhalter &#039;&#039;&#039;%DAYTIME%&#039;&#039;&#039; vorgesehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung der Tageszeit (daytime)&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdaytime-&amp;amp;lt;DAYTIME&amp;amp;gt;====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald die jeweilige Tageszeit (daytime) erreicht ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung der Tageszeit (daytime) auf bestimmten Wert&amp;lt;br&amp;gt;&lt;br /&gt;
Bei &amp;quot;night&amp;quot; könnte man z.B. die Heizung bewohnerunabhängig ausschalten, bei &amp;quot;morning&amp;quot; wieder ein.&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdeviceDisable====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Gerät deaktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: &#039;set deviceDisable &amp;amp;lt;DEVICE&amp;amp;gt;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   speak &amp;quot;Das Gerät %ALIAS% ist nun deaktiviert!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # optional wirklich attr disable für Device setzen und Konfig speichern&lt;br /&gt;
   #fhem &amp;quot;attr %DEVICE%:FILTER=disable!=1 disable 1; save&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # ROOMMATE/GUEST auf gone/none setzen wenn Presence Devices deaktiviert werden&lt;br /&gt;
   if (&amp;quot;%DEVICE%&amp;quot; =~ /^PRESENCE\d?_(r[rg]_.*)/)&lt;br /&gt;
   {&lt;br /&gt;
     my $resident = $1;&lt;br /&gt;
     my $gone = $resident =~ /^rr_/ ? &amp;quot;gone&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;
     fhem &amp;quot;set $resident:FILTER=state!=$gone state $gone&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdeviceEnable====&lt;br /&gt;
Befehle die ausgeführt werden sollen sobald ein Gerät aktiviert wird.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: &#039;set deviceEnable &amp;amp;lt;DEVICE&amp;amp;gt;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   speak &amp;quot;Das Gerät %ALIAS% ist nun aktiviert!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # optional attr disable für Device entfernen und Konfig speichern&lt;br /&gt;
   #fhem &amp;quot;deleteattr %DEVICE%:FILTER=disable=1 disable; save&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # ROOMMATE/GUEST auf home setzen wenn Presence Devices aktiviert werden und anwesend sind&lt;br /&gt;
   if (&amp;quot;%DEVICE%&amp;quot; =~ /^PRESENCE\d?_(r[rg]_.*)/)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set $1:FILTER=state!=home state home&amp;quot; if (ReadingsVal(&amp;quot;%DEVICE%&amp;quot;,&amp;quot;presence&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;present&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdnd====&lt;br /&gt;
Befehle die beim Anfang/Ende des DND Modus ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende des DND Modus&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (%DND%)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg audio Der DND Modus ist nun eingeschaltet!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg audio Der DND Modus ist nun beendet!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdnd-off====&lt;br /&gt;
Befehle die beim Ende des DND Modus ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende des DND Modus&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Der DND Modus ist nun beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDdnd-on====&lt;br /&gt;
Befehle die beim Beginn des DND Modus ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn des DND Modus&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Der DND Modus ist nun eingeschaltet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent====&lt;br /&gt;
Befehle die beim Beginn eines beliebigen (holiday)Kalender Events ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn eines beliebigen (holiday)Kalender Events&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%CALENDAR%&#039;&#039;&#039;, &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; können zusätzlich verwendet werden&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   fhem &amp;quot;set Weihnachten on&amp;quot; if (&amp;quot;%EVENT%&amp;quot; eq &amp;quot;Weihnachten&amp;quot;);&lt;br /&gt;
   fhem &amp;quot;set Weihnachten off&amp;quot; if (&amp;quot;%PREVEVENT%&amp;quot; eq &amp;quot;Weihnachten&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent-&amp;amp;lt;KALENDER&amp;amp;gt;-each====&lt;br /&gt;
Befehle die beim Beginn/Ende eines beliebigen (holiday)Kalender Events eines bestimmten KALENDERs ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn eines beliebigen (holiday)Kalender Events eines bestimmten KALENDERs&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%EVENT%&#039;&#039;&#039; und &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; können zusätzlich verwendet werden&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-FEIERTAGE-each&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   fhem &amp;quot;set Weihnachten off&amp;quot; if (&amp;quot;%PREVEVENT%&amp;quot; eq &amp;quot;Weihnachten&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-URLAUBDAN-each&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (&amp;quot;%EVENT%&amp;quot; =~ /urlaub/i)&lt;br /&gt;
   {&lt;br /&gt;
     speak &amp;quot;Dan hat jetzt Urlaub!!!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /urlaub/i)&lt;br /&gt;
   {&lt;br /&gt;
     speak &amp;quot;Der Urlaub von Dan ist nun zu Ende!!!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-WOHNUNG-each&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Heizung an/aus schalten&lt;br /&gt;
   my $heiz = &amp;quot;([bksw]z|ku)_Thermostat&amp;quot;;&lt;br /&gt;
   if (&amp;quot;%EVENT%&amp;quot; =~ /^heizung(..+)?$/i)&lt;br /&gt;
   {&lt;br /&gt;
     my $zeit = $1;&lt;br /&gt;
     if (&amp;quot;%SEASON%&amp;quot; ne &amp;quot;Sommer&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
       # morgens nicht alle Thermostaten schalten&lt;br /&gt;
       $heiz = &amp;quot;([bks]z|ku)_Thermostat&amp;quot; if ($zeit &amp;amp;&amp;amp; $zeit =~ /morgens?$/i);&lt;br /&gt;
       fhem &amp;quot;set $heiz:FILTER=controlMode!=day controlMode day&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /^heizung/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set $heiz:FILTER=controlMode!=night controlMode night&amp;quot; if (&amp;quot;%SEASON%&amp;quot; ne &amp;quot;Sommer&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   # WLAN an/aus schalten&lt;br /&gt;
   elsif (&amp;quot;%EVENT%&amp;quot; =~ /^wlan|wifi|wi-fi/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set Router wifi off&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /^wlan|wifi|wi-fi/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set Router wifi on&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   # G-Tag für Putzfrau (de)aktivieren&lt;br /&gt;
   elsif (&amp;quot;%EVENT%&amp;quot; =~ /^putz/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceEnable PRESENCE_rg_Inge&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /^putz/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceDisable PRESENCE_rg_Inge&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   # G-Tag für Gast (de)aktivieren&lt;br /&gt;
   elsif (&amp;quot;%EVENT%&amp;quot; =~ /g([aä]|ae)st/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceEnable PRESENCE_rg_Gast&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   elsif (&amp;quot;%PREVEVENT%&amp;quot; =~ /g([aä]|ae)st/i)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;set %NAME% deviceDisable PRESENCE_rg_Gast&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent-&amp;amp;lt;KALENDER&amp;amp;gt;-&amp;amp;lt;EVENT&amp;amp;gt;-begin====&lt;br /&gt;
Befehle die beim Beginn eines bestimmten (holiday)Kalender EVENTs eines bestimmten KALENDERs ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn eines bestimmten (holiday)Kalender EVENTs eines bestimmten KALENDERs&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; kann zusätzlich verwendet werden&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDevent-FEIERTAGE-Neujahr-begin&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set %SENSORSENERGY% meterReset&lt;br /&gt;
&lt;br /&gt;
====HomeCMDevent-&amp;amp;lt;KALENDER&amp;amp;gt;-&amp;amp;lt;EVENT&amp;amp;gt;-end====&lt;br /&gt;
Befehle die bei Ende der (holiday)Kalender EVENTs eines bestimmten KALENDERs ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende der (holiday)Kalender EVENTs eines bestimmten KALENDERs&amp;lt;br&amp;gt;&lt;br /&gt;
Platzhalter &#039;&#039;&#039;%PREVEVENT%&#039;&#039;&#039; kann zusätzlich verwendet werden&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemDEFINED====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn ein neues Gerät angelegt wird (define)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Jedem neu definierten Gerät den Geräte-TYPE auch als Raum im Menüpunkt Module zuweisen&lt;br /&gt;
   fhem &amp;quot;attr %DEFINED% room Module-&amp;gt;&amp;quot;.$defs{&amp;quot;%DEFINED%&amp;quot;}-&amp;gt;{TYPE};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemINITIALIZED====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn FHEM gestartet wurde&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg FHEM Home wurde gestartet...&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemSAVE====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn in FHEM die Konfigurationsdatei gespeichert wird&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel (Backup von fhem.cfg und fhem.state):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Datum/Uhrzeit&lt;br /&gt;
   my $now = Timeow();&lt;br /&gt;
   # Leerzeichen durch Unterstriche ersetzen&lt;br /&gt;
   $now =~ s/ /_/g;&lt;br /&gt;
   # Backup der Datei fhem.cfg&lt;br /&gt;
   `cp $attr{global}{configfile} ./backup/fhem.cfg.$now`;&lt;br /&gt;
   # Log-Ausgabe der gespeicherten Datei&lt;br /&gt;
   Log3 undef,3,&amp;quot;saved ./backup/fhem.cfg.$now&amp;quot;;&lt;br /&gt;
   # Backup der Datei fhem.state&lt;br /&gt;
   `cp $attr{global}{statefile} ./backup/fhem.state.$now`;&lt;br /&gt;
   # Log-Ausgabe der gespeicherten Datei&lt;br /&gt;
   Log3 undef,3,&amp;quot;saved ./backup/fhem.state.$now&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDfhemUPDATE====&lt;br /&gt;
Befehle die ausgeführt werden sollen wenn das Update von FHEM ausgeführt wurde&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Das Update für FHEM ist beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDicewarning====&lt;br /&gt;
Befehle die bei Anfang/Ende der Eiswarnung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: icewarning 0/1&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (%ICE%)&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg push ACHTUNG!!! Es sind nur noch %TEMPERATURE%°C! Somit könnte es glatt werden!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
     fhem &amp;quot;msg audio Es sind wieder %TEMPERATURE%°C! Die Glättewarnung ist damit beendet!.&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDicewarning-off====&lt;br /&gt;
Befehle die bei Ende der Eiswarnung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: icewarning 0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio Es sind wieder %TEMPERATURE%°C! Die Glättewarnung ist damit beendet!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDicewarning-on====&lt;br /&gt;
Befehle die bei Beginn der Eiswarnung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: icewarning 1&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg audio ACHTUNG!!! Es sind nur noch %TEMPERATURE%°C! Somit könnte es glatt werden!&lt;br /&gt;
&lt;br /&gt;
====HomeCMDlocation====&lt;br /&gt;
Befehle die beim Ändern der location ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung location&lt;br /&gt;
&lt;br /&gt;
====HomeCMDlocation-&amp;amp;lt;LOCATION&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf eine bestimmte location ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung auf bestimmte location&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode====&lt;br /&gt;
Befehle die beim Ändern von mode ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung mode&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-absent-belated====&lt;br /&gt;
Befehle die nachträglich zur Abwesenheit ausgeführt werden sollen, die Zeit kann im Atteribut &amp;quot;HomeModeAbsentBelatedTime&amp;quot; eingestellt werden&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Abwesenheit + XX min&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlMode night&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-&amp;amp;lt;MODE&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten mode ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung auf bestimmten mode&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-absent&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set HarmonyHub:FILTER=activity!=PowerOff activity PowerOff;&lt;br /&gt;
 set wz_Ventilator:FILTER=speed!=0 speed 0;&lt;br /&gt;
 set TYPE=SONOSPLAYER:FILTER=Volume&amp;gt;0 Volume 0;&lt;br /&gt;
 set Sonos stopAll;&lt;br /&gt;
 sleep 3;&lt;br /&gt;
 set Wohnung [FILTER=state!=off] off&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-asleep&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 define atTmp_wz_Media_aus_%SELF% at +01:00:00 set HarmonyHub:FILTER=currentActivity!=PowerOff activity PowerOff;&lt;br /&gt;
 define atTmp_wz_Venti_aus_%SELF% at +01:00:00 set wz_Ventilator:FILTER=speed!=0 speed 0;&lt;br /&gt;
 define atTmp_wzLS_aus_%SELF% at +00:30:00 set wz_LS scene aus;&lt;br /&gt;
 define atTmp_all_Sonos_vol_down_%SELF% at +00:02:00 set TYPE=SONOSPLAYER:FILTER=Volume!=0 Volume 0 1;&lt;br /&gt;
 define atTmp_all_Sonos_off_%SELF% at +00:02:30 set Sonos stopAll;&lt;br /&gt;
 set [sw]z_Auto(Music|Light):FILTER=state!=off off;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlMode night&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-awoken&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set [sw]z_Auto(Music|Light):FILTER=state!=on on&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-gone&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlManu off&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-&amp;amp;lt;MODE&amp;amp;gt;-resident====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten mode, ausgelöst durch einen beliebigen Resident, ausgeführt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung mode von beliebigem Resident ausgelöst&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-asleep-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 msg audio @%AUDIO% Guten Nacht und schlaf&#039; gut %ALIAS%!&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmode-awoken-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $msg = &amp;quot;Guten&amp;quot;;&lt;br /&gt;
   $msg .= &amp;quot; %FEIERTAG%&amp;quot; if (&amp;quot;%FEIERTAG%&amp;quot;);&lt;br /&gt;
   $msg .= &amp;quot; Morgen %ALIAS%&amp;quot;;&lt;br /&gt;
   fhem &amp;quot;msg audio \@%AUDIO% $msg&amp;quot;;&lt;br /&gt;
   fhem &amp;quot;defmod atTmp_wetter_%RESIDENT%_%SELF% at +00:07:00 msg audio Wettervorhersage für heute: %FORECASTTODAY%&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmode-&amp;amp;lt;MODE&amp;amp;gt;-&amp;amp;lt;ROOMMATE/GUEST&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten mode, ausgelöst durch einen bestimmten Resident, ausgeführt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung mode von bestimmten Resident ausgelöst&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmodeAlarm====&lt;br /&gt;
Befehle die beim Ändern von modeAlarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung modeAlarm&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmodeAlarm-&amp;amp;lt;armaway/armhome/armnight/disarm&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung auf einen bestimmten modeAlarm ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung auf bestimmten modeAlarm&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-armaway&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   if (&amp;quot;%PREVAMODE%&amp;quot; eq &amp;quot;disarm&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Alarmanlage einschalten&lt;br /&gt;
     fhem &amp;quot;set AA_Arm:FILTER=level!=100 alarmLevel armAll&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht zusammensetzen&lt;br /&gt;
     my $msg;&lt;br /&gt;
     $msg .= &amp;quot;Die Alarmanlage ist nun scharf geschaltet!&amp;quot; if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot;);&lt;br /&gt;
     my $is = &amp;quot;%ALARMHR%&amp;quot; =~ /und/ ? &amp;quot;sind&amp;quot; : &amp;quot;ist&amp;quot;;&lt;br /&gt;
     $msg .= &amp;quot; &amp;quot; if ($msg);&lt;br /&gt;
     $msg .= &amp;quot;ACHTUNG: %ALARMHR% $is noch offen!!!&amp;quot; if (%ALARMCT%);&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht an ROOMMATE/GUEST senden&lt;br /&gt;
     fhem &amp;quot;msg \@%RESIDENT% $msg&amp;quot; if ($msg);&lt;br /&gt;
 &lt;br /&gt;
     # Eingangstür abschließen falls noch nicht geschehen&lt;br /&gt;
     fhem &amp;quot;set fl_Tuerschloss:FILTER=state!=locked lock&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-armhome&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 AA_Arm:FILTER=level!=25 alarmLevel armExtSens;&lt;br /&gt;
 set fl_Tuerschloss:FILTER=state!=locked lock&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-armnight&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 AA_Arm:FILTER=level!=25 alarmLevel armExtSens;&lt;br /&gt;
 set fl_Tuerschloss:FILTER=state!=locked lock&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDmodeAlarm-disarm&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Alarmanlage ausschalten&lt;br /&gt;
   fhem &amp;quot;set AA_Arm:FILTER=level!=0 alarmLevel disarmed&amp;quot;;&lt;br /&gt;
   my $prio = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   # Nachrichtenpriorität auf 1 setzen bei Ankunft (höhere Lautstärke beim Abspielen damit man das auch vor der Tür hört)&lt;br /&gt;
   $prio = &amp;quot; 1&amp;quot; if (&amp;quot;%LOCATION%&amp;quot; eq &amp;quot;arrival&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Nachricht an ROOMMATE/GUEST senden wenn der vorherige alarmMode nicht &amp;quot;armnight&amp;quot; ist&lt;br /&gt;
   fhem &amp;quot;msg audio \@fl_Sonos$prio Die Alarmanlage ist nun ausgeschaltet %ALIAS%!&amp;quot; if (&amp;quot;%PREVAMODE%&amp;quot; ne &amp;quot;armnight&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmotion====&lt;br /&gt;
Befehle die bei Statusänderung eines beliebigen Bewegungsmelders ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: öffnen/schließen eines beliebigen Bewegungsmelders&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Raum aus Sensornamen ermitteln, z.B. bz_Sensor&lt;br /&gt;
   my $room = (split /_/,&amp;quot;%SENSOR%&amp;quot;)[0];&lt;br /&gt;
 &lt;br /&gt;
   # Status des structure aller Lichter dieses Raums&lt;br /&gt;
   my $lichter = Value($room.&amp;quot;_Lichter&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Status des dummy Tageslicht&lt;br /&gt;
   my $tl = Value(&amp;quot;Tageslicht&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   if (&amp;quot;%STATE%&amp;quot; eq &amp;quot;geöffnet&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Lichtwert des Sensors&lt;br /&gt;
     my $lum = ReadingsNum(&amp;quot;%SENSOR%&amp;quot;,&amp;quot;luminance&amp;quot;,100);&lt;br /&gt;
 &lt;br /&gt;
     # Löschen des evtl. schon vorhandenen &amp;quot;at&amp;quot;&lt;br /&gt;
     fhem &amp;quot;delete atTmp_Bewegungsmelder_Licht_aus_&amp;quot;.$room.&amp;quot;_%SELF%&amp;quot; if (IsDevice(&amp;quot;atTmp_Bewegungsmelder_Licht_aus_&amp;quot;.$room.&amp;quot;_%SELF%&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
     # Licht nur wenn kein Tageslicht oder Lichtwert des Sensors kleiner als 10 und AutoLight eingeschaltet und modeAlarm nicht armaway&lt;br /&gt;
     if (($tl eq &amp;quot;off&amp;quot; || $lum &amp;lt; 10) &amp;amp;&amp;amp; $lichter eq &amp;quot;off&amp;quot; &amp;amp;&amp;amp; Value($room.&amp;quot;_AutoLight&amp;quot;) eq &amp;quot;on&amp;quot; &amp;amp;&amp;amp; &amp;quot;%AMODE%&amp;quot; ne &amp;quot;armaway&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       my $scene;&lt;br /&gt;
 &lt;br /&gt;
       # verschiedene Szenen für verschiedene Modus bzw. Aussenlichtstärken&lt;br /&gt;
       if (&amp;quot;%MODE%&amp;quot; eq &amp;quot;gotosleep&amp;quot;)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;Abend&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       elsif (&amp;quot;%MODE%&amp;quot; eq &amp;quot;asleep&amp;quot;)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;Nacht&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       elsif (%LIGHT% &amp;gt; 3)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;viel&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       elsif (%LIGHT% &amp;lt; 4)&lt;br /&gt;
       {&lt;br /&gt;
         $scene = &amp;quot;mittel&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       # Schalten der entsprechenden Szene (Modul LightScene)&lt;br /&gt;
       fhem &amp;quot;set &amp;quot;.$room.&amp;quot;_LS scene $scene&amp;quot; if ($scene);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
     # unterschiedliche Ausschaltzeiten für unterschiedliche Räume&lt;br /&gt;
     my $t = 3;&lt;br /&gt;
     $t = 15 if ($room eq &amp;quot;wz&amp;quot;);&lt;br /&gt;
     $t = 2 if ($room eq &amp;quot;bz&amp;quot; || ($room =~ /wz|ku/ &amp;amp;&amp;amp; &amp;quot;%MODE%&amp;quot; =~ /sleep/));&lt;br /&gt;
     $t = 1 if ($room eq &amp;quot;fl&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Zahl in Minuten umrechnen in einen Zeitpunkt für das &amp;quot;at&amp;quot;&lt;br /&gt;
     my $d = HOMEMODE_hourMaker($t);&lt;br /&gt;
 &lt;br /&gt;
     # Anlegen des &amp;quot;at&amp;quot; zum Ausschalten des Lichts wenn die Lichter angeschaltet sind und auch AutoLight eingeschaltet ist&lt;br /&gt;
     if ($lichter ne &amp;quot;off&amp;quot; &amp;amp;&amp;amp; Value($room.&amp;quot;_AutoLight&amp;quot;) eq &amp;quot;on&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       my $cmd = &amp;quot;set &amp;quot;.$room.&amp;quot;_LS scene aus&amp;quot;;&lt;br /&gt;
       fhem &amp;quot;defmod atTmp_Bewegungsmelder_Licht_aus_&amp;quot;.$room.&amp;quot;_%SELF% at +$d $cmd&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmotion-off====&lt;br /&gt;
Befehle die bei Ende der Bewegung eines beliebigen Bewegungsmelders ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende der Bewegung eines beliebigen Bewegungsmelders&lt;br /&gt;
&lt;br /&gt;
====HomeCMDmotion-on====&lt;br /&gt;
Befehle die bei Beginn der Bewegung eines beliebigen Bewegungsmelders ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn der Bewegung eines beliebigen Bewegungsmelders&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung von presence ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDpresence-present&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 set w_Steckdosen [FILTER=state!=on] on;&lt;br /&gt;
 set Heizungen [FILTER=controlManu!=off] controlMode auto&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-device====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch ein beliebiges Presence Device, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch beliebiges Presence Device&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDpresence-present-device&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # mindestens 1x täglich den Batteriewert des PRESENCE Geräts bei erkannter Anwesenheit holen&lt;br /&gt;
   fhem &#039;&amp;quot;sudo /opt/fhem/scripts/GTag-bat.sh %DEVICE% %ADDRESS% &amp;amp;&amp;quot;&#039;&lt;br /&gt;
     if (&amp;quot;%DEVICE%&amp;quot; =~ /^PRESENCE_/ &amp;amp;&amp;amp; (!defined ReadingsVal(&amp;quot;%DEVICE%&amp;quot;,&amp;quot;battery&amp;quot;,undef) || ReadingsAge(&amp;quot;%DEVICE%&amp;quot;,&amp;quot;battery&amp;quot;,0) &amp;gt; 64800));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-resident====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch einen beliebigen Resident, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch beliebigen Resident&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel für &amp;quot;HomeCMDpresence-absent-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # Mich benachrichtigen wenn ich nicht zu hause bin und jemand anderes die Wohnung verlässt&lt;br /&gt;
   fhem &amp;quot;msg push \@rr_Dan %ALIAS% hat gerade die Wohnung verlassen!&amp;quot;&lt;br /&gt;
     if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot; &amp;amp;&amp;amp; ReadingsVal(&amp;quot;rr_Dan&amp;quot;,&amp;quot;presence&amp;quot;,&amp;quot;&amp;quot;) ne &amp;quot;present&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Verabschiedungsnachricht zusammensetzen&lt;br /&gt;
   my $msg;&lt;br /&gt;
 &lt;br /&gt;
   # Alle außer mich selbst verabschieden&lt;br /&gt;
   $msg .= &amp;quot;Bis bald und auf Wiedersehen %ALIAS%...&amp;quot; if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   # Glättewarnung wenn nötig&lt;br /&gt;
   $msg .= &amp;quot; ACHTUNG!!! Es ist %TEMPERATURE%°C kalt! Somit könnte es glatt werden!&amp;quot; if (%ICE%);&lt;br /&gt;
 &lt;br /&gt;
   # Nachricht senden wenn vorhanden&lt;br /&gt;
   fhem &amp;quot;msg \@%RESIDENT% $msg&amp;quot; if ($msg);&lt;br /&gt;
 }&lt;br /&gt;
&#039;&#039;&#039;Beispielcode für &amp;quot;HomeCMDpresence-present-resident&amp;quot;:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   # alle Ankommenden außer mir selbst&lt;br /&gt;
   if (&amp;quot;%RESIDENT%&amp;quot; ne &amp;quot;rr_Dan&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
     # Benachrichtigung wenn jemand kommt&lt;br /&gt;
     fhem &amp;quot;msg audio %ALIAS% kommt gerade!&amp;quot; if (&amp;quot;%LOCATION%&amp;quot; ne &amp;quot;arrival&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht an Ankommende(n) zusammensetzen&lt;br /&gt;
     my $g = &amp;quot;gute&amp;quot;;&lt;br /&gt;
     $g .= &amp;quot;n&amp;quot; if (&amp;quot;%DAYTIME%&amp;quot; ne &amp;quot;Nacht);&lt;br /&gt;
 &lt;br /&gt;
     # Nachricht an Ankommende(n) senden &lt;br /&gt;
     fhem &amp;quot;msg \@%RESIDENT% Willkommen und $g %DAYTIME% %ALIAS%!&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-&amp;amp;lt;ROOMMATE/GUEST&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch einen bestimmten Resident, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch bestimmten Resident&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HomeCMDpresence-&amp;amp;lt;absent/present&amp;amp;gt;-&amp;amp;lt;ROOMMATE/GUEST&amp;amp;gt;-&amp;amp;lt;DEVICE&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung von presence, ausgelöst durch ein bestimmtes Presence Device eines bestimmten Resident, ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Attribut ist nur verfügbar wenn ein Resident mehr als ein Presence Device hat&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung presence, ausgelöst durch bestimmtes Presence Device eines bestimmten Resident&lt;br /&gt;
&lt;br /&gt;
====HomeCMDseason====&lt;br /&gt;
Befehle die bei Änderung der Jahreszeit ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung Jahreszeit&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   my $t = &amp;quot;%SEASON%&amp;quot;;&lt;br /&gt;
   $t .= &amp;quot;s&amp;quot; if ($t eq &amp;quot;Frühling&amp;quot;);&lt;br /&gt;
   fhem &amp;quot;msg push Die Wohnung ist nun im $t-Modus!&amp;quot;;&lt;br /&gt;
   fhem &amp;quot;set Heizungen [FILTER=controlMode!=auto] controlMode auto&amp;quot; if ($t ne &amp;quot;Sommer&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====HomeCMDseason-&amp;amp;lt;SEASON&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung der Jahreszeit in eine bestimmte Jahreszeit ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung bestimmte Jahreszeit&lt;br /&gt;
&lt;br /&gt;
====HomeCMDtwilight====&lt;br /&gt;
Befehle die bei Änderung der Dämmerung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung Dämmerung&lt;br /&gt;
&lt;br /&gt;
====HomeCMDtwilight-&amp;amp;lt;sr/sr_astro/sr_civil/sr_indoor/sr_weather/ss/ss_astro/ss_civil/ss_indoor/ss_weather&amp;amp;gt;====&lt;br /&gt;
Befehle die bei Änderung zu bestimmter Dämmerung ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Änderung zu bestimmter Dämmerung&lt;br /&gt;
&lt;br /&gt;
====HomeCMDuwz-warn====&lt;br /&gt;
Befehle die bei Beginn/Ende der UWZ Warnungen ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn/Ende der UWZ Warnungen&lt;br /&gt;
&lt;br /&gt;
====HomeCMDuwz-warn-begin====&lt;br /&gt;
Befehle die bei Beginn der UWZ Warnungen ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Beginn der UWZ Warnungen&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg %UWZLONG%&lt;br /&gt;
&lt;br /&gt;
====HomeCMDuwz-warn-end====&lt;br /&gt;
Befehle die beim Ende der UWZ Warnungen ausgeführt werden sollen&amp;lt;br&amp;gt;&lt;br /&gt;
Auslöser: Ende der UWZ Warnungen&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 msg Alle Unwetterwarnungen sind nun beendet!&lt;br /&gt;
&lt;br /&gt;
=Platzhalter=&lt;br /&gt;
==verfügbar in allen HomeCMD Attributen==&lt;br /&gt;
===%ADDRESS%===&lt;br /&gt;
MAC Adresse des zuletzt ausgelösten Presence Geräts&lt;br /&gt;
&lt;br /&gt;
===%ALARM%===&lt;br /&gt;
Liste mit Namen der ausgelösten Alarm Geräte&amp;lt;br&amp;gt;&lt;br /&gt;
Wert ist 0 wenn kein Alarm Device ausgelöst ist&lt;br /&gt;
&lt;br /&gt;
===%ALARMCT%===&lt;br /&gt;
Anzahl der ausgelösten Alarm Geräte&lt;br /&gt;
&lt;br /&gt;
===%ALARMHR%===&lt;br /&gt;
Liste mit (human readable) Namen der ausgelösten Alarm Geräte&amp;lt;br&amp;gt;&lt;br /&gt;
Wert ist 0 wenn kein Alarm Device ausgelöst ist&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. für msg benutzt werden&lt;br /&gt;
&lt;br /&gt;
===%ALIAS%===&lt;br /&gt;
Alias des zuletzt ausgelösten Resident&lt;br /&gt;
&lt;br /&gt;
===%AMODE%===&lt;br /&gt;
aktueller Alarm Mode&lt;br /&gt;
&lt;br /&gt;
===%AEAH%===&lt;br /&gt;
Wert von anyoneElseAtHome&amp;lt;br&amp;gt;&lt;br /&gt;
Wert ist 1 wenn on und 0 wenn off&lt;br /&gt;
&lt;br /&gt;
===%ARRIVERS%===&lt;br /&gt;
Alias-Liste der ROOMMATE/GUEST deren location auf arrival steht&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um Residents zu begrüßen&amp;lt;br&amp;gt;&lt;br /&gt;
z.B. Peter, Paul und Marry&lt;br /&gt;
&lt;br /&gt;
===%AUDIO%===&lt;br /&gt;
Audio Device des zuletzt ausgelösten ROOMMATE/GUEST (Attribut msgContactAudio)&amp;lt;br&amp;gt;&lt;br /&gt;
wenn das Attribut msgContactAudio des jeweiligen Resident keinen Wert hat, so wird versucht den Wert des Attributs aus dem globalMsg (sofern vorhanden) auszulesen&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um Resident spezifische msg(s) vom Typ audio zu senden, z.B. Nacht/Morgen Grüße/Wünsche&lt;br /&gt;
&lt;br /&gt;
===%BATTERYLOW%===&lt;br /&gt;
Alias des zu letzt gemeldeten Geräts mit niedrigem Batteriestand&lt;br /&gt;
&lt;br /&gt;
===%BATTERYLOWALL%===&lt;br /&gt;
Wert des Reading batteryLow_hr&lt;br /&gt;
&lt;br /&gt;
===%BATTERYLOWCT%===&lt;br /&gt;
Wert des Reading batteryLow_ct&lt;br /&gt;
&lt;br /&gt;
===%CONDITION%===&lt;br /&gt;
Wert des Reading condition des überwachten Yahoo weather Device&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. für Wetter(vorhersage) benutzt werden&lt;br /&gt;
&lt;br /&gt;
===%CONTACT%===&lt;br /&gt;
Wert des Reading lastContact (Name des zuletzt geöffneten Kontakt Sensor)&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um msg zu versenden&lt;br /&gt;
&lt;br /&gt;
===%DAYTIME%===&lt;br /&gt;
Wert des Reading daytime&amp;lt;br&amp;gt;&lt;br /&gt;
kann z.B. dafür benutzt werden um Tageszeit spezifische Aktionen zu schalten&lt;br /&gt;
&lt;br /&gt;
===%DEVICE%===&lt;br /&gt;
Name des zuletzt ausgelösten Presence Gerät&lt;br /&gt;
&lt;br /&gt;
===%DEVICEA%===&lt;br /&gt;
Wert des Reading lastAbsentByPresenceDevice&lt;br /&gt;
&lt;br /&gt;
===%DEVICEP%===&lt;br /&gt;
Wert des Reading lastPresentByPresenceDevice&lt;br /&gt;
&lt;br /&gt;
===%DISABLED%===&lt;br /&gt;
Wert des Reading devicesDisabled&lt;br /&gt;
&lt;br /&gt;
===%DND%===&lt;br /&gt;
DND Status&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn an, 0 wenn aus&lt;br /&gt;
&lt;br /&gt;
===%DURABSENCE%===&lt;br /&gt;
Wert des Reading durTimerAbsence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURABSENCELAST%===&lt;br /&gt;
Wert des Reading lastDurAbsence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURPRESENCE%===&lt;br /&gt;
Wert des Reading durTimerPresence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURPRESENCELAST%===&lt;br /&gt;
Wert des Reading lastDurPresence_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURSLEEP%===&lt;br /&gt;
Wert des Reading durTimerSleep_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%DURSLEEPLAST%===&lt;br /&gt;
Wert des Reading lastDurSleep_cr des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%&amp;lt;CALENDARNAME&amp;gt;%===&lt;br /&gt;
Event des benannten Kalenders&amp;lt;br&amp;gt;&lt;br /&gt;
0 wenn kein gerade kein Event ist&lt;br /&gt;
&lt;br /&gt;
===%&amp;lt;CALENDARNAME-EVENTNAME&amp;gt;%===&lt;br /&gt;
0 wenn das benannte Event nicht aktiv ist&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn das benannte Event aktiv ist&lt;br /&gt;
&lt;br /&gt;
===%FORECAST%===&lt;br /&gt;
Wettervorhersage für morgen&lt;br /&gt;
&lt;br /&gt;
===%FORECASTTODAY%===&lt;br /&gt;
Wettervorhersage für heute&lt;br /&gt;
&lt;br /&gt;
===%HUMIDITY%===&lt;br /&gt;
Wert des Reading humidity von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%HUMIDITYTREND%===&lt;br /&gt;
Wert des Reading humidityTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%ICE%===&lt;br /&gt;
0 wenn keine Eiswarnung besteht&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn Eiswarnung besteht&lt;br /&gt;
&lt;br /&gt;
===%IP%===&lt;br /&gt;
Wert des Reading publicIP von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LIGHT%===&lt;br /&gt;
Wert des Reading light von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LOCATION%===&lt;br /&gt;
Wert des Reading location von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LOCATIONR%===&lt;br /&gt;
Wert des Reading location des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%LUMINANCE%===&lt;br /&gt;
Wert des Reading luminance von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%LUMINANCETREND%===&lt;br /&gt;
Wert des Reading luminanceTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%MODE%===&lt;br /&gt;
gerade aktiver Modus von HOMEMODE (Reading mode)&lt;br /&gt;
&lt;br /&gt;
===%MODEALARM%===&lt;br /&gt;
aktueller Alarm Mode (wie %AMODE%)&lt;br /&gt;
&lt;br /&gt;
===%MOTION%===&lt;br /&gt;
Wert des Reading lastMotion von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%NAME%===&lt;br /&gt;
Name des HOMEMODE Geräts selbst (identisch zu %SELF%)&lt;br /&gt;
&lt;br /&gt;
===%OPEN%===&lt;br /&gt;
Wert des Reading contactsOutsideOpen von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%OPENCT%===&lt;br /&gt;
Wert des Reading contactsOutsideOpen_ct von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%OPENHR%===&lt;br /&gt;
Wert des Reading contactsOutsideOpen_hr von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PANIC%===&lt;br /&gt;
0 wenn panic ausgeschaltet ist&amp;lt;br&amp;gt;&lt;br /&gt;
1 wenn panic eingeschaltet ist&lt;br /&gt;
&lt;br /&gt;
===%RESIDENT%===&lt;br /&gt;
Name des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%PRESENT%===&lt;br /&gt;
presence von HOMEMODE&lt;br /&gt;
0 wenn absent&lt;br /&gt;
1 wenn present&lt;br /&gt;
&lt;br /&gt;
===%PRESENTR%===&lt;br /&gt;
presence des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
0 wenn absent&lt;br /&gt;
1 wenn present&lt;br /&gt;
&lt;br /&gt;
===%PRESSURE%===&lt;br /&gt;
Wert des Reading pressure von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PRESSURETREND%===&lt;br /&gt;
Wert des Reading pressureTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PREVAMODE%===&lt;br /&gt;
vorheriger modeAlarm von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PREVCONTACT%===&lt;br /&gt;
vorheriger geöffneter Kontaktsensor&lt;br /&gt;
&lt;br /&gt;
===%PREVMODE%===&lt;br /&gt;
vorheriger mode von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%PREVMODER%===&lt;br /&gt;
vorheriger state des zu letzt ausgelösten ROOMMATE/GUEST&lt;br /&gt;
&lt;br /&gt;
===%PREVMOTION%===&lt;br /&gt;
vorheriger geöffneter Bewegungsmelder&lt;br /&gt;
&lt;br /&gt;
===%SEASON%===&lt;br /&gt;
Wert des Reading season von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%SELF%===&lt;br /&gt;
Name des HOMEMODE Geräts selbst (identisch zu %NAME%)&lt;br /&gt;
&lt;br /&gt;
===%SENSORSBATTERY%===&lt;br /&gt;
Liste aus Internal SENSORSBATTERY&lt;br /&gt;
&lt;br /&gt;
===%SENSORSCONTACT%===&lt;br /&gt;
Liste aus Internal SENSORSCONTACT&lt;br /&gt;
&lt;br /&gt;
===%SENSORSENERGY%===&lt;br /&gt;
Liste aus Internal SENSORSENERGY&lt;br /&gt;
&lt;br /&gt;
===%SENSORSMOTION%===&lt;br /&gt;
Liste aus Internal SENSORSMOTION&lt;br /&gt;
&lt;br /&gt;
===%SENSORSSMOKE%===&lt;br /&gt;
Liste aus Internal SENSORSSMOKE&lt;br /&gt;
&lt;br /&gt;
===%SMOKE%===&lt;br /&gt;
Wert des Reading alarmSmoke von HOMEMODE&lt;br /&gt;
0 wenn kein Alarm&lt;br /&gt;
&lt;br /&gt;
===%SMOKECT%===&lt;br /&gt;
Wert des Reading alarmSmoke_ct von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%SMOKEHR%===&lt;br /&gt;
Wert des Reading alarmSmoke_hr von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TAMPERED%===&lt;br /&gt;
Wert des Reading sensorsTampered von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TAMPEREDCT%===&lt;br /&gt;
Wert des Reading sensorsTampered_ct von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TAMPEREDHR%===&lt;br /&gt;
Wert des Reading sensorsTampered_hr von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TEMPERATURE%===&lt;br /&gt;
Wert des Reading temperature von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TEMPERATURETREND%===&lt;br /&gt;
Wert des Reading temperatureTrend von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TOBE%===&lt;br /&gt;
are/sind oder is/ist der Wetterkondition&lt;br /&gt;
&lt;br /&gt;
===%TWILIGHT%===&lt;br /&gt;
Wert des Reading twilight von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%TWILIGHTEVENT%===&lt;br /&gt;
aktuelles twilight Event&lt;br /&gt;
&lt;br /&gt;
===%UWZ%===&lt;br /&gt;
UWZ Warnlevel&lt;br /&gt;
&lt;br /&gt;
===%UWZLONG%===&lt;br /&gt;
alle aktuellen UWZ Warnungen (lange Version)&lt;br /&gt;
&lt;br /&gt;
===%UWZSHORT%===&lt;br /&gt;
alle aktuellen UWZ Warnungen (kurze Version)&lt;br /&gt;
&lt;br /&gt;
===%WEATHER%===&lt;br /&gt;
Wert von &amp;quot;get &amp;lt;HOMEMODE&amp;gt; weather short&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===%WEATHERLONG%===&lt;br /&gt;
Wert von &amp;quot;get &amp;lt;HOMEMODE&amp;gt; weather long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===%WIND%===&lt;br /&gt;
Wert des Reading wind von HOMEMODE&lt;br /&gt;
&lt;br /&gt;
===%WINDCHILL%===&lt;br /&gt;
Wert des Reading wind_chill vom eingebundenen Yahoo Wetter Gerät&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeCMDcontact, HomeCMDmotion und HomeCMDalarm Attributen==&lt;br /&gt;
===%ALIAS%===&lt;br /&gt;
alias des zuletzt ausgelösten Kontakt/Bewegungs/Rauchsensors&lt;br /&gt;
&lt;br /&gt;
===%SENSOR%===&lt;br /&gt;
name des zuletzt ausgelösten Kontakt/Bewegungs/Rauchsensors&lt;br /&gt;
&lt;br /&gt;
===%STATE%===&lt;br /&gt;
state des zuletzt ausgelösten Kontakt/Bewegungs/Rauchsensors&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeTextWeatherForecast Attributen==&lt;br /&gt;
===%CONDITION%===&lt;br /&gt;
Wert des Readings condition des Yahoo Weather Geräts&lt;br /&gt;
&lt;br /&gt;
===%DAY%===&lt;br /&gt;
Tag der Wettervorhersage (1 - heute, 2 - morgen)&lt;br /&gt;
&lt;br /&gt;
===%HIGH%===&lt;br /&gt;
maximale Temperatur der Wettervorhersage&lt;br /&gt;
&lt;br /&gt;
===%LOW%===&lt;br /&gt;
minimale Temperatur der Wettervorhersage&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeCMDevent Attributen==&lt;br /&gt;
===%CALENDAR%===&lt;br /&gt;
Name der Kalenders&lt;br /&gt;
&lt;br /&gt;
===%DESCRIPTION%===&lt;br /&gt;
Beschreibung des aktuellen Event des Kalenders (nicht verfügbar bei holiday Geräten)&lt;br /&gt;
&lt;br /&gt;
===%EVENT%===&lt;br /&gt;
Name/Titel des aktuellen Event des Kalenders&lt;br /&gt;
&lt;br /&gt;
===%PREVEVENT%===&lt;br /&gt;
Name/Titel des vorherigen Event des Kalenders&lt;br /&gt;
&lt;br /&gt;
==verfügbar in den HomeCMDdevice Attributen==&lt;br /&gt;
===%DEVICE%===&lt;br /&gt;
name der deaktivierten Geräts&lt;br /&gt;
&lt;br /&gt;
===%ALIAS%===&lt;br /&gt;
alias der deaktivierten Geräts&lt;br /&gt;
&lt;br /&gt;
=Benötigte Events=&lt;br /&gt;
Folgende Events werden von HOMEMODE ausgewertet bzw. werden benötigt damit HOMEMODE vollumfänglich funktionieren kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;DEVICE-TYPE&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;EVENT&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;RESIDENTS&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;presence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;ROOMMATE,GUEST&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;presence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;wayhome&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSCONTACT}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;sabotageError&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsContactReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSMOTION}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;sabotageError&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsMotionReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSLUMINANCE}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;luminance&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsLuminanceReading&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSENERGY}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;power&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;energy&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsPowerEnergyReadings&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{SENSORSBATTERY}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;battery&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorsBatteryReading&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomePresenceDeviceType&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;presence&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeYahooWeatherDevice&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;humidity&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;temperature&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;wind&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;pressure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeTwilightDevice&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;light&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;twilight&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;aktEvent&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;pressure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorTemperatureOutside&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;temperature&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;humidity&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorHumidityOutside&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;humidity&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorWindspeed&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorWindspeed&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorAirpressure&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeSensorAirpressure&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeEventsHolidayDevices&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;state&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;quot;HomeUWZ&amp;quot;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;WarnCount&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT_Einf%C3%BChrung&amp;diff=27460</id>
		<title>MQTT Einführung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT_Einf%C3%BChrung&amp;diff=27460"/>
		<updated>2018-07-15T12:06:02Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Links */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MQTT ist ein Protokoll (&amp;quot;Message Queue Telemetry Transport&amp;quot;), mit dem Daten und Befehle zwischen verschiedenen Geräten ausgetauscht werden. Die Kommunikation erfolgt dabei über einen Broker, den so genannten MQTT-Broker.&lt;br /&gt;
&lt;br /&gt;
MQTT wurde entwickelt, um möglichst effizient, sicher und mit wenig Datenlast zu kommunizieren. MQTT ist ergebnisorientiert und daher muss ein Client nicht beständig beim Server anfragen, ob neue Daten vorliegen. Heute findet sich MQTT vor allem im Bereich des Internet-of-Things (IoT). Insbesondere dort, wo viele Sensoren ausgelesen werden müssen, wird MQTT eingesetzt. &lt;br /&gt;
&lt;br /&gt;
Es ist daher nicht verwunderlich, dass mehr und mehr Geräte MQTT einsetzen. MQTT kann leicht mit FHEM verbunden werden, ohne dass dabei größerer CPU- oder Datenverbrauch entsteht. &lt;br /&gt;
&lt;br /&gt;
== Eine sehr kurze Einführung in MQTT ==&lt;br /&gt;
Die folgende Einführung soll denjenigen helfen, die noch nie von MQTT gehört haben und überlegen, ob sie es in FHEM einsetzen. Sie kann eine vollwertige Einleitung wie beispielsweise [https://github.com/mqtt/mqtt.github.io/wiki diese Wikieinträge] nicht ersetzen. &lt;br /&gt;
&lt;br /&gt;
Bei MQTT findet die Kommunikation nur zwischen den Geräten (seien es Empfänger oder Sender) auf der einen Seite und dem Broker auf der anderen Seite statt. Die Geräte kommunizieren nicht untereinander. Eine Nachricht besteht im Wesentlichen aus zwei Dingen: Einem Topic und einem Payload. Dies ist nicht ganz korrekt. Es gibt zwei weitere Elemente, die zu einer Nachricht gehören: Den Quality of Service (soll geprüft werden, ob die Nachricht zugestellt wurde und mit welcher &amp;quot;Tiefe&amp;quot;?) und Retained Message. Details bitte in der oben genannten Einführung nachlesen.&lt;br /&gt;
&lt;br /&gt;
Eine anschauliche Beschreibung würde beide Begriffe mit einem Brief vergleichen. Der Topic entspricht der Adresse, an die der Brief geschickt wird. Der Payload ist der Inhalt, der sich im Briefumschlag befindet. &lt;br /&gt;
&lt;br /&gt;
Ein Topic schafft damit eine Hierarchie der Nachrichten und sortiert für die Clienten, um was für Nachrichten es sich handelt. Topics sind einfache Strings, die mit Schrägstrichen getrennt werden (keine Leerzeichen erlaubt, das gilt auch für gewisse Sonderzeichen). Ein Topic könnte beispielhaft so lauten:&lt;br /&gt;
:&#039;&#039;&#039;zuHause/1OG/Kueche/Licht/state&#039;&#039;&#039;&lt;br /&gt;
Offensichtlich sind hier Objekte zuerst danach sortiert, ob sie sich zu Haus befinden, dann wird nach Stockwerken sortiert und im ersten Stock schaut man auf die Küche sowie das dort vorhandene Licht.  &lt;br /&gt;
&lt;br /&gt;
Ein Payload kann beliebige Inhalte aufnehmen. Oft enthalten Topics Befehle oder Daten. &lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit von MQTT besteht darin, dass die Geräte nur mit dem Broker kommunizieren. Sendet ein Gerät also Daten, werden diese an den Broker geschickt und der Broker nimmt sie entgegen. Wollen die Clienten wissen, welche Daten vorliegen, müssen sie dem Broker mitteilen, dass sie über diese Daten informiert werden wollen. Diesen Vorgang nennt man &amp;quot;subscribe&amp;quot;. Im IoT ist besonders interessant, dass Sender und Empfänger von Nachrichten durch den Broker vollständig entkoppelt werden können - jemand, der Daten bereit stellt, muss sich also nicht darum kümmern, wer diese Daten empfängt.&lt;br /&gt;
&lt;br /&gt;
== Installation in FHEM ==&lt;br /&gt;
Um MQTT in FHEM zu nutzen, benötigt man einen MQTT-Broker. Ein gern verwendeter Broker ist beispielsweise [http://mosquitto.org Mosquitto]. Er kann ohne weiteres auf dem Raspberry Pi, der bereits eine FHEM-Installation besitzt, installiert werden und wird keine größere CPU- oder Netzwerklast verursachen. MQTT kommuniziert über Port 1883. &lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation findet sich beispielsweise in diesem [http://blog.wenzlaff.de/?p=6487 Blogeintrag]. Im wesentlichen beschränkt sich die Installation eines MQTT Servers aber auf wenige Arbeitsschritte. Bei &#039;&#039;stretch&#039;&#039; ist &#039;&#039;Mosquitto&#039;&#039; bereits in der Distribution enthalten und kann - zusammen mit dem client Befehl &#039;&#039;mosquito_sub&#039;&#039;, der weiter unten benötigt wird, wie folgt installiert und getestet werden&amp;lt;ref&amp;gt;Die für den Betrieb mit FHEM erforderlichen Perl-Module sind teilweise (noch) nicht in den Paketquellen verfügbar. Sie können dennoch statt mit cpan auch als Debian-Paket mit Hilfe von &#039;&#039;dh-make-perl&#039;&#039; installiert werden, wobei vorab das in den Paketquellen bereits vorhandene &#039;&#039;libmodule-pluggable-perl&#039;&#039; installiert werden sollte:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;br&amp;gt; &lt;br /&gt;
sudo apt-get install dh-make-perl&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::simple&amp;lt;br&amp;gt;&lt;br /&gt;
dh-make-perl --install --cpan Net::MQTT::Constants&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-simple-perl*.deb&amp;lt;br&amp;gt;&lt;br /&gt;
sudo dpkg -i libnet-mqtt-perl*.deb&amp;lt;/ref&amp;gt;:&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für ältere Distributionen (hier am Beispiel von &#039;&#039;jessie&#039;&#039;) muß ggf. aus einer zusätzlichen Paketquelle installiert werden:&lt;br /&gt;
 wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key&lt;br /&gt;
 sudo apt-key add mosquitto-repo.gpg.key&lt;br /&gt;
 cd /etc/apt/sources.list.d/&lt;br /&gt;
 sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
Danach kann die eigentliche Installation durchgeführt werden wie links für &#039;&#039;stretch&#039;&#039; beschrieben.}}&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  sudo apt-get install mosquitto mosquitto-clients&lt;br /&gt;
 &lt;br /&gt;
 # MQTT Server Test&lt;br /&gt;
 sudo service mosquitto status&lt;br /&gt;
&lt;br /&gt;
 # Start / Stop des Servers&lt;br /&gt;
 sudo service mosquitto stop&lt;br /&gt;
 sudo service mosquitto start&lt;br /&gt;
 &lt;br /&gt;
 # Perl Version ausgeben&lt;br /&gt;
 perl -v&lt;br /&gt;
 # Perl MQTT Module nachinstallieren (läuft ein paar Minuten)&lt;br /&gt;
 sudo cpan install Net::MQTT:Simple&lt;br /&gt;
 sudo cpan install Net::MQTT:Constants&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach ist FHEM mit &amp;lt;nowiki&amp;gt;shutdown restart&amp;lt;/nowiki&amp;gt; neu zu starten.&lt;br /&gt;
&lt;br /&gt;
Zur Kommunikation mit dem Broker von seiten eines Arduinos böte sich der PubSubClient an.&lt;br /&gt;
Um die Funktionalität des Brokers zu testen kann z.B. ein Analyse-Tool wie MQTT.fx verwendet werden.&lt;br /&gt;
&amp;lt;!---Bitte diese beiden Sätze inhaltlich prüfen---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MQTT und Sonoff-Tasmota ==&lt;br /&gt;
Eine derzeit oft genutzte Möglichkeit für MQTT bilden die [[Sonoff]]-Geräte. Werden diese mit einer offenen Firmware von [https://github.com/arendst arendst] geflasht, so kommunizieren sie über MQTT. Um diese Geräte einzubinden, ist wie folgt vorzugehen. Zuerst ist Mosquitto zu installieren.&lt;br /&gt;
&lt;br /&gt;
Unter Sonoff sind einige Topics voreingestellt. arendst stellt insbesondere drei Topic-Präfixe bereit, die seiner Meinung jedes Topic einleiten sollen (in den Eingabemasken als &amp;quot;%prefix%&amp;quot; notiert). Das sind einmal Kommandos (abgekürzt als cmnd), die dazu dienen, Befehle auszuführen. Daten werden mit tele und stat übertragen. Ein Topic besteht dann zuerst aus diesem Präfix und danach dem eigentlichen Topic. Wer also beispielsweise einem Sonoff_Switch einen Befehl senden will, sollte als Topic cmnd/Sonoff_Switch wählen. Wenn der Switch ein- und ausgeschaltet werden kann, muss der Topic noch das Wort POWER enthalten (in MQTT werden viele Kennworte komplett groß geschrieben). Der Topic lautet damit vollständig &amp;quot;cmnd/Sonoff_Switch/POWER/set&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Die Einrichtung in FHEM wird von den Modulen 00_MQTT.pm, 10_MQTT_BRIDGE und 10_MQTT_DEVICE.pm unterstützt.&lt;br /&gt;
Ebenso wird das Modul 98_expandJSON.pm benötigt, um den {{Link2Forum|Topic=66761|LinkText=JSON String zu filtern}}.&lt;br /&gt;
&lt;br /&gt;
Briges und Devices unterscheiden sich wie folgt. Eine Bridge ist ein Gerät, das bereits in FHEM angelegt wurde und nur mit MQTT verbunden werden soll. Ein Device existiert noch nicht in FHEM und soll erst angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Link zum Forum: {{Link2Forum|Topic=27532|LinkText=MQTT FHEM Einrichtung}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Sofern der Broker mit FEHM über localhost kommunizieren kann, sollte als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
 ### 1. Broker anlegen ###&lt;br /&gt;
 define myBroker MQTT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
&lt;br /&gt;
 ### 2. FHEM Device mit MQTT verbinden ###&lt;br /&gt;
 define Sonoff_Switch MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Switch IODev myBroker&lt;br /&gt;
 attr Sonoff_Switch devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON&lt;br /&gt;
 attr Sonoff_Switch icon hue_filled_br30&lt;br /&gt;
 attr Sonoff_Switch publishSet ON OFF cmnd/TestSwitch/POWER&lt;br /&gt;
 attr Sonoff_Switch room MQTT&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Licht stat/Sonoff_Switch/POWER&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Sensor tele/Sonoff_Switch/SENSOR&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Status stat/Sonoff_Switch/STATUS&lt;br /&gt;
 attr Sonoff_Switch webCmd ON:OFF&lt;br /&gt;
&lt;br /&gt;
Der hier dargestellte Beispielcode realisiert die Kommunikation zwischen FHEM und dem sonoff Modul via MQTT Broker. Zu beachten ist hier, dass &#039;&#039;&#039;subscribeReading_Licht&#039;&#039;&#039; und &#039;&#039;&#039;subscribeReading_Status&#039;&#039;&#039; unterschiedliche Syntax des Topic Strings haben!&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
Prinzipiell ist MQTT ebenso sicher wie eine Postkarte. Solange man es nicht extra absichert, kann jeder der, im eigenen LAN ist (und die Adresse vom Broker kennt) alle Topics mitlesen.&lt;br /&gt;
:&amp;lt;code&amp;gt;meinHaus/Flur/Haustuer:open / close&amp;lt;/code&amp;gt;&lt;br /&gt;
ist da nicht wirklich schlau! &lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
=== Username / Passwort ===&lt;br /&gt;
Zunächst kann man erst mal einen Username / Passwort vergeben. Da ist zwar auch noch lange nicht sicher, aber zumindest steigert es den Aufwand schon mal. Jetzt muss man zumindest schon mal Pakete sniffen und verstehen, um unbefugt zu lesen oder gar zu publishen.&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
Um wirklich sicher zu werden, führt kein Weg an TLS vorbei. Leider kann z.B. ein Arduino das schlicht nicht mehr. Irgendwo machen sich der Speicher und die Rechenleistung dann doch bemerkbar.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://mqtt.org Offizielle Homepage von MQTT, englisch]&lt;br /&gt;
* [http://www.hivemq.com/blog/mqtt-essentials-part-1-introducing-mqtt Sehr gute Einführung, englisch, sind 5 lesenswerte Teile]&lt;br /&gt;
* [https://www.heise.de/developer/artikel/MQTT-Protokoll-fuer-das-Internet-der-Dinge-2168152.html Ein Exkurs von Heise mit Beispielen, deutsch, sehr lesenswert]&lt;br /&gt;
* [http://www.mqttfx.org/ MQTT FX - ein sehr praktisches Analysetool]&lt;br /&gt;
* {{Link2Forum|Topic=69230|LinkText=Diskussionsthread im Forum}}&lt;br /&gt;
* [[MQTT_Einf%C3%BChrung_Teil_2|Teil 2 der MQTT Einführung]]; schwerere Kost&lt;br /&gt;
* [[MQTT Einführung Teil 3|Teil 3 der MQTT Einführung: Hände schmutzig machen]]&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27286</id>
		<title>PRESENCE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27286"/>
		<updated>2018-06-29T12:53:30Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* BT-Tags aktivieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=73_PRESENCE.pm&lt;br /&gt;
|ModOwner=markusbloch&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lan-ping&#039;&#039;&#039; - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.&lt;br /&gt;
* &#039;&#039;&#039;fritzbox&#039;&#039;&#039; - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)&lt;br /&gt;
* &#039;&#039;&#039; Bluetooth&#039;&#039;&#039;&lt;br /&gt;
:- &#039;&#039;&#039;local-bluetooth&#039;&#039;&#039; - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)&lt;br /&gt;
:- &#039;&#039;&#039;lan-bluetooth&#039;&#039;&#039;   - Das Überwachen von Bluetoothgeräten, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. [[:Kategorie:Raspberry Pi|Raspberry Pi]]) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.&lt;br /&gt;
* &#039;&#039;&#039;function&#039;&#039;&#039; - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)&lt;br /&gt;
* &#039;&#039;&#039;shell-script&#039;&#039;&#039; - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Ping im WLAN/LAN =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die IP-Addresse 192.168.0.30 alle 30&amp;amp;nbsp;Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status &amp;quot;present&amp;quot; (anwesend), ansonsten &amp;quot;absent&amp;quot; (abwesend).&lt;br /&gt;
&lt;br /&gt;
Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30 &#039;&#039;&#039;60&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun würde das Handy alle 60 Sekunden geprüft werden.&lt;br /&gt;
&lt;br /&gt;
Nur wenn bei einem iPhone/iPad die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.&lt;br /&gt;
&lt;br /&gt;
Sollte die Fehlermeldung &lt;br /&gt;
:&amp;lt;code&amp;gt; PRESENCE (Handy) - ping command returned with output: ping: icmp open socket: Operation not permitted &amp;lt;/code&amp;gt; &lt;br /&gt;
im Log auftauchen und lan-ping dadurch nicht funktionieren, liegt ein Berechtigungsproblem vor. Kein Grund den User fhem zu root zu machen!&lt;br /&gt;
Prüfe zu erst als User root ob die Capabilities gesetzt sind.&lt;br /&gt;
:&amp;lt;code&amp;gt;getcap /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Sollte folgendes Ergeben zu Tage fördern.&lt;br /&gt;
:&amp;lt;code&amp;gt;/bin/ping = cap_net_raw+ep&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist dem nicht so, setzen wir die benötigten Capabilities&lt;br /&gt;
:&amp;lt;code&amp;gt;setcap cap_net_raw+ep /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Mehr Informationen zum Thema Capabilities [https://manpages.debian.org/jessie/manpages-de/capabilities.7.de.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.&lt;br /&gt;
&lt;br /&gt;
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt &amp;quot;Heimnetz&amp;quot; auftaucht. &lt;br /&gt;
&lt;br /&gt;
Die erforderliche Definition:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE fritzbox iPhone-4S&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachung mittels Perl-Code =&lt;br /&gt;
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; PRESENCE function {...} [ &amp;lt;check-interval&amp;gt; [ &amp;lt;present-check-interval&amp;gt; ] ]&lt;br /&gt;
&lt;br /&gt;
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.&lt;br /&gt;
&lt;br /&gt;
== Beispiel DHCP Überwachung auf Airport Basestation ==&lt;br /&gt;
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.&lt;br /&gt;
&lt;br /&gt;
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z.&amp;amp;nbsp;B. mit: &amp;lt;code&amp;gt;cpan install use Net::SNMP&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zuerst ist folgender Code in 99_myUtils.pm einzufügen, sollte diese noch nicht vorhanden sein muss diese aus dem Template welches unter Edit Files zu finden ist erzeugt werden.&lt;br /&gt;
&#039;&#039;&#039;Achtung, das ist nicht der komplette Inhalt der 99_myUtils!&#039;&#039;&#039; Das ist nur die einzelne Routine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::SNMP;&lt;br /&gt;
sub&lt;br /&gt;
snmpCheck($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($airport,$client)= @_;&lt;br /&gt;
&lt;br /&gt;
  my $community = &amp;quot;public&amp;quot;;&lt;br /&gt;
  my $host = $airport;&lt;br /&gt;
  my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2&amp;quot;;&lt;br /&gt;
  #my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2.25.1.10.0.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my ( $session, $error ) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
    -hostname =&amp;gt; $host,&lt;br /&gt;
    -community =&amp;gt; $community,&lt;br /&gt;
    -port =&amp;gt; 161,&lt;br /&gt;
    -version =&amp;gt; 1&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if( !defined($session) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
    return &amp;quot;Can&#039;t connect to host $host.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  my @snmpoids = ();&lt;br /&gt;
&lt;br /&gt;
  my $response = $session-&amp;gt;get_next_request($oid);&lt;br /&gt;
  my @nextid = keys %$response;&lt;br /&gt;
  while ( @nextid &amp;amp;&amp;amp; $nextid[0] &amp;amp;&amp;amp; $nextid[0] =~ m/^$oid/ ) {&lt;br /&gt;
    push( @snmpoids, $nextid[0] );&lt;br /&gt;
&lt;br /&gt;
    $response = $session-&amp;gt;get_next_request( $nextid[0] );&lt;br /&gt;
    @nextid = keys %$response;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if( !defined($response = $session-&amp;gt;get_request( @snmpoids ) ) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  foreach my $value (values %$response) {&lt;br /&gt;
    return 1 if( $value eq $client )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich das Mobilgerät so überwachen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define iPhone PRESENCE function {snmpCheck(&amp;quot;10.0.1.1&amp;quot;,&amp;quot;0x44d77429f35c&amp;quot;)} 30 30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwesenheitserkennung mittels UniFi Controller ==&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung bei Geräten in Verbindung mit UniFi-Produkten funktioniert selbst dann, wenn sich die Geräte im PowerSave-Modus befinden. &lt;br /&gt;
&lt;br /&gt;
Beachte: Die Geräte werden erst ungefähr nach 5 Minuten, nachdem das Gerät das WLAN verlassen hat als disconnected angezeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE function {ReadingsVal(&amp;quot;&amp;lt;UniFi&amp;gt;&amp;quot;,&amp;quot;&amp;lt;NamedDevice&amp;gt;&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;connected&amp;quot; ? 1:0}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Events =&lt;br /&gt;
Der Vorteil gegenüber der Function-Variante ist, dass diese Variante ohne Blocking.pm-Overhead direkt ausgeführt werden kann und in &amp;quot;Echtzeit&amp;quot; abläuft (siehe {{Link2Forum|Topic=40287|Message=562823}}).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Bluetooth =&lt;br /&gt;
== Vorbereitung und Informationen ==&lt;br /&gt;
=== Getestete Hardware/Software ===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie (interner BT-Controller)&lt;br /&gt;
* &#039;&#039;&#039;BT-Dongle&#039;&#039;&#039; - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano &amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt &#039;&#039;LowEnergy&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;BT-TAG&#039;&#039;&#039; - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo&lt;br /&gt;
&lt;br /&gt;
=== BT-Dongle am RaspberryPI installieren ===&lt;br /&gt;
Um den BT-Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am RaspberryPI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debian nachinstalliert werden.&lt;br /&gt;
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install bluetooth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach erfolgreicher Installation der Pakete sollte der RaspberryPI neu gestartet werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Reboot bitte das Log des RaspberryPI auf folgende Einträge prüfen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773748] NET: Registered protocol family 31&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773765] Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773797] Bluetooth: HCI socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773821] Bluetooth: L2CAP socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773890] Bluetooth: SCO socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.797531] usbcore: registered new interface driver btusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sobald der BT-Dongle erkannt wurde &#039;&#039;leuchtet&#039;&#039; (wenn vorhanden) auch die &#039;&#039;blaue/gelbe&#039;&#039; LED am Dongle auf.&lt;br /&gt;
&lt;br /&gt;
=== BT-Tags aktivieren ===&lt;br /&gt;
Jetzt kann der BT-Tag aktiviert werden. Bei einigen BT-Tags muss dafür die &#039;&#039;&#039;Batteriesicherung&#039;&#039;&#039; gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Ein BT-Tag wird mit folgendem Befehl auf der Konsole gesucht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hcitool lescan&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
LE Scan ...&lt;br /&gt;
7C:2F:80:A1:XA:XD (unknown)&lt;br /&gt;
7C:2F:80:A1:XA:XD Gigaset G-tag&lt;br /&gt;
7C:2F:80:A1:X4:X1 (unknown)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Übersicht über die möglichen Befehle von hcitool gibt es mit der Eingabe von:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo hcitool&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
hcitool - HCI Tool ver 5.23&lt;br /&gt;
Usage:&lt;br /&gt;
        hcitool [options] &amp;lt;command&amp;gt; [command parameters]&lt;br /&gt;
Options:&lt;br /&gt;
        --help  Display help&lt;br /&gt;
        -i dev  HCI device&lt;br /&gt;
Commands:&lt;br /&gt;
        dev     Display local devices&lt;br /&gt;
        inq     Inquire remote devices&lt;br /&gt;
        scan    Scan for remote devices&lt;br /&gt;
        name    Get name from remote device&lt;br /&gt;
        info    Get information from remote device&lt;br /&gt;
        spinq   Start periodic inquiry&lt;br /&gt;
        epinq   Exit periodic inquiry&lt;br /&gt;
        cmd     Submit arbitrary HCI commands&lt;br /&gt;
        con     Display active connections&lt;br /&gt;
        cc      Create connection to remote device&lt;br /&gt;
        dc      Disconnect from remote device&lt;br /&gt;
        sr      Switch master/slave role&lt;br /&gt;
        cpt     Change connection packet type&lt;br /&gt;
        rssi    Display connection RSSI&lt;br /&gt;
        lq      Display link quality&lt;br /&gt;
        tpl     Display transmit power level&lt;br /&gt;
        afh     Display AFH channel map&lt;br /&gt;
        lp      Set/display link policy settings&lt;br /&gt;
        lst     Set/display link supervision timeout&lt;br /&gt;
        auth    Request authentication&lt;br /&gt;
        enc     Set connection encryption&lt;br /&gt;
        key     Change connection link key&lt;br /&gt;
        clkoff  Read clock offset&lt;br /&gt;
        clock   Read local or remote clock&lt;br /&gt;
        lescan  Start LE scan&lt;br /&gt;
        lewladd Add device to LE White List&lt;br /&gt;
        lewlrm  Remove device from LE White List&lt;br /&gt;
        lewlsz  Read size of LE White List&lt;br /&gt;
        lewlclr Clear LE White list&lt;br /&gt;
        lecc    Create a LE Connection&lt;br /&gt;
        ledc    Disconnect a LE Connection&lt;br /&gt;
        lecup   LE Connection Update &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls beim SCAN kein BT-Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des RaspBerryPI notwendig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hciconfig hci0 down&lt;br /&gt;
sudo hciconfig hci0 up&lt;br /&gt;
sudo hcitool dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch den FHEM Server direkt ==&lt;br /&gt;
[[Datei:Bluetooth-Adresse-iPhone.png|thumb|Bluetooth-Adresse eines iPhones]]&lt;br /&gt;
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.&lt;br /&gt;
&lt;br /&gt;
Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.&lt;br /&gt;
&lt;br /&gt;
Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der [[Konfiguration]] benötigt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord) ==&lt;br /&gt;
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]&lt;br /&gt;
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.&lt;br /&gt;
&lt;br /&gt;
Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Programm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Unterschied presenced / lepresenced / collectord ===&lt;br /&gt;
presenced und lepresenced sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced und lepresenced ist, dass lepresenced insbesondere für [https://de.wikipedia.org/wiki/Bluetooth_Low_Energy Bluetooth-LE-Devices] ist und presenced für &amp;quot;normale&amp;quot; Bluetooth-Geräte. &lt;br /&gt;
&lt;br /&gt;
collectord wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben. Sofern alle Räume einen Empfangspegel (RSSI) ermitteln können, wird bei mehreren anwesenden Räumen der Raum mit dem besten Empfangspegel selektiert (siehe {{Link2Forum|Topic=54482}}).&lt;br /&gt;
&lt;br /&gt;
=== Installation von (le)presenced ===&lt;br /&gt;
Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritte gehen jedoch auch mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket.&lt;br /&gt;
Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeitshalber wird sie aber aufgeführt.&lt;br /&gt;
&lt;br /&gt;
===== Installation per .deb-Paket =====&lt;br /&gt;
&lt;br /&gt;
Die bevorzugte Variante ist die Installation von lepresenced durch die passenden .deb Pakete.&lt;br /&gt;
{{Randnotiz|RNText=Bei einem Upgrade einer älteren Version reicht es, das neue .deb Paket mit&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo dpkg -i lepresenced-X.XX-X.deb&amp;lt;/code&amp;gt;&lt;br /&gt;
zu aktualisieren}} &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.Variante:&#039;&#039;&#039;&lt;br /&gt;
Herunterladen der aktuellen lepresenced-0.83-3.deb (Stand August 2017) Datei über den Webbrowser &lt;br /&gt;
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/ SVN-Repository]. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Download in other formats:&lt;br /&gt;
    Original Format &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
anklicken und die Datei herunterladen.&lt;br /&gt;
Die Datei kann jetzt auf den RPi kopiert und mit folgenden Befehlen ausgeführt werden (ggf. Berechtigungen anpassen). &lt;br /&gt;
&lt;br /&gt;
Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)&lt;br /&gt;
 https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.Variante:&#039;&#039;&#039; (zu Verwenden, wenn es Probleme bei Variante 1 gibt)&lt;br /&gt;
Herunterladen aus dem fhem contrib Verzeichnis:&lt;br /&gt;
Hierzu muss das contrib auf dem aktuellen Stand sein. Dazu wird die Installation von subversion (normal bereits vorhanden) benötigt.&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install subversion&lt;br /&gt;
&lt;br /&gt;
Danach kann per &lt;br /&gt;
 sudo svn checkout https://svn.fhem.de/fhem/trunk/fhem/contrib svnrepo&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Repository auf den Pi heruntergeladen werden. Danach sollte im gewählten Verzeichnis die eingecheckten Dateien verfügbar sein.&lt;br /&gt;
 /opt/fhem/svnrepo/PRESENCE/deb  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Installation der Variante 1 oder 2 &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Egal welche Variante gewählt wurde, nun kann mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;: Das &#039;&#039;&#039;Paket&#039;&#039;&#039; hat eine ca. Größe von &#039;&#039;&#039;6,5Kb&#039;&#039;&#039;. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird.&lt;br /&gt;
Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich &amp;quot;Download in other formats&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get -f install&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Installation sollte am Ende ein [ ok ] Starting lepresenced (via systemctl): lepresenced.service. ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paketlisten werden gelesen... Fertig&lt;br /&gt;
Abhängigkeitsbaum wird aufgebaut.       &lt;br /&gt;
Statusinformationen werden eingelesen.... Fertig&lt;br /&gt;
Abhängigkeiten werden korrigiert ... Fertig&lt;br /&gt;
Die folgenden zusätzlichen Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
Die folgenden NEUEN Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.&lt;br /&gt;
1 nicht vollständig installiert oder entfernt.&lt;br /&gt;
Es müssen 157 kB an Archiven heruntergeladen werden.&lt;br /&gt;
Nach dieser Operation werden 490 kB Plattenplatz zusätzlich benutzt.&lt;br /&gt;
Möchten Sie fortfahren? [J/n]&lt;br /&gt;
Holen: 1 http://archive.raspberrypi.org/debian/ jessie/main bluez-hcidump armhf 5.23-2+rpi2 [157 kB]&lt;br /&gt;
Es wurden 157 kB in 0 s geholt (921 kB/s).&lt;br /&gt;
Vormals nicht ausgewähltes Paket bluez-hcidump wird gewählt.&lt;br /&gt;
(Lese Datenbank ... 42033 Dateien und Verzeichnisse sind derzeit installiert.)&lt;br /&gt;
Vorbereitung zum Entpacken von .../bluez-hcidump_5.23-2+rpi2_armhf.deb ...&lt;br /&gt;
Entpacken von bluez-hcidump (5.23-2+rpi2) ...&lt;br /&gt;
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...&lt;br /&gt;
bluez-hcidump (5.23-2+rpi2) wird eingerichtet ...&lt;br /&gt;
lepresenced (0.82-1) wird eingerichtet ...&lt;br /&gt;
[ ok ] Starting lepresenced (via systemctl): lepresenced.service.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.Variante:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante wird das aktuellste lepresenced Skript aus github heruntergeladen. Das bedeutet, dass jegliche Konfiguration wie automatischer Start, Berechtigungen etc. &lt;br /&gt;
manuell konfiguriert werden muss. Diese Variante eignet sich nur für diejenigen, die keine .deb-Pakete installieren wollen/können oder die genau Wissen, was sie tun!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/PRESENCE/lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur &amp;quot;Installation&amp;quot; des Skripts folgendermaßen vorgehen:&lt;br /&gt;
Unter /fhem manuell den Ordner „script“ anlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir script&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Datei lepresenced reinkopieren und ausführbar machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod +x /opt/fhem/script/lepresenced&lt;br /&gt;
sudo chgrp -cR dialout lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Skript erstmalig starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt beim Starten des Skript eine Fehlermeldung, müssen die Abhängigkeiten aufgelöst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Can&#039;t locate Net/Server/Daemonize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 / usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /opt/fhem/lepresenced line 17.&lt;br /&gt;
BEGIN failed--compilation aborted at /opt/fhem/lepresenced line 17.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um die Abhängigkeiten aufzulösen muss folgendes nachinstalliert werden und anschließend ein Reboot durchgeführt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libnet-server-*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Einrichtung eines Bluetooth-Geräts über FHEM =====&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration eines BT-Geräts in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der zum Beispiel ein G-Tag dem FHEM-Server bekannt gemacht werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden&lt;br /&gt;
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist den angegeben Port zu unterscheiden. Für presenced muss der Port 5111 genommen werden, für lepresenced der Port 5333.&#039;&#039;&#039;&lt;br /&gt;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
Diese Variante sollte eingesetzt werden, wenn nur ein Pi nach Bluetooth-Geräten sucht. Möchte man mehr als ein Gerät nutzen um zum Beispiel eine größere Fläche abzudecken so muss mit collectored gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alle Räume gemeinsam ansprechen mittels collectord ===&lt;br /&gt;
Um zwei presenced- oder lepresenced Installationen zu verbinden wird der collectord Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Presence_Collectord_Uebersicht.jpg|200px|thumb|left|Schematische Darstellung Presence und Collectord, Danke an dtavb]]&lt;br /&gt;
Auf Basis folgender Skizze wird die Einrichtung und der Betrieb der Anwesenheitserkennung und Überwachung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mit dem PRESENCE-Modul sowie dem Skript (.deb-Paket) lepresenced beschrieben. Zusätzlich wird für die Verbindung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mehrere lepresenced Instanzen der collectord verwendet.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.&lt;br /&gt;
{{NeuerTextBlock}}&lt;br /&gt;
&lt;br /&gt;
==== Aufbau ====&lt;br /&gt;
; RPi1 (Hauptinstanz): &lt;br /&gt;
: FHEM Installation&lt;br /&gt;
: presence/lepresenced Installation &lt;br /&gt;
: collectord installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
; RPi2 (Zweitsystem): &lt;br /&gt;
: FHEM installation&lt;br /&gt;
: presence/lepresenced Installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Installation per .deb-Paket ====&lt;br /&gt;
collectord wird heruntergeladen und installiert:&lt;br /&gt;
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.8.deb (Stand Januar 2018)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i collectord-1.8.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord. Weitere Einstellungen können unter /etc/default/collectord vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration auf Shellebene ==== &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo vi /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datei muss jetzt nach folgender Vorlage angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# room definition&lt;br /&gt;
#[room-name]              # name of the room&lt;br /&gt;
#address=192.168.0.10     # ip-address or hostname&lt;br /&gt;
#port=5111                # tcp port which should be used (5111 is default)&lt;br /&gt;
#presence_timeout=120     # timeout in seconds for each check when devices are present&lt;br /&gt;
#absence_timeout=20       # timeout in secondsfor each check when devices are absent&lt;br /&gt;
&lt;br /&gt;
[RPi1] 			          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=127.0.0.1 	          # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&lt;br /&gt;
[RPi2]  		          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=192.168.178.127	          # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
* Es dürfen keine [Namen] mit Leerzeichen verwendet werden&lt;br /&gt;
* Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration in FHEM ==== &lt;br /&gt;
;RPi1&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60           &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222)&#039;&#039;&lt;br /&gt;
;RPi2&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60     &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222 - die IP-Adresse von die von RPi1)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration kann der Daemon gestartet werden.&lt;br /&gt;
Sobald das Bluetoothgerät irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort &lt;br /&gt;
an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading &amp;quot;rooms&amp;quot; des jeweiligen BT-Gerätes dargestellt.&lt;br /&gt;
&lt;br /&gt;
Zum testen sollte collectord einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectord prüfen kann, dieser steht in der Zeile &amp;lt;pre&amp;gt;created socket on 0.0.0.0 with port 5222&amp;lt;/pre&amp;gt; und man sehen kann, ob der collectord richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -vv -c /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Ausgabe sieht wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2017-04-02 17:52:55 - =================================================&lt;br /&gt;
2017-04-02 17:52:55 - started with PID 15554&lt;br /&gt;
2017-04-02 17:52:55 - reading configuration file&lt;br /&gt;
2017-04-02 17:52:55 - no config errors found&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5222&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656&lt;br /&gt;
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 2 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48662&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48664&lt;br /&gt;
2017-04-02 17:53:20 - created thread 3 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 4 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 5 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 6 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51638&lt;br /&gt;
2017-04-02 17:53:22 - created thread 7 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - created thread 8 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51640&lt;br /&gt;
2017-04-02 17:53:22 - created thread 9 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:23 - created thread 10 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:29 - new connection from 192.168.xxx.xxx:51642&lt;br /&gt;
2017-04-02 17:53:29 - created thread 11 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
2017-04-02 17:53:29 - created thread 12 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading &amp;quot;rooms&amp;quot; mit dem Wert der erkannten PRESENCE-Installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verhalten presence timeout im zusammenhang mit dem Attribut &amp;quot;absenceThreshold&amp;quot; der PRESENCE Konfiguration in FHEM&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der collectord.conf sind &amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt; für den jeweiligen Raum konfiguriert.&lt;br /&gt;
Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.&lt;br /&gt;
&lt;br /&gt;
In der PRESENCE-Definition kann man ebenfalls ein &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; setzen. Sobald sich der Zustand ändert, wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss. Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand. Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.&lt;br /&gt;
&lt;br /&gt;
Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Reading &amp;quot;room&amp;quot; bei einer PRESENCE Definition und der Zusammenhang zu collectord&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der collectord (ab Version 1.8) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das &amp;quot;room&amp;quot;-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.&lt;br /&gt;
&lt;br /&gt;
====  Automatischer Start ====&lt;br /&gt;
Wenn der collectord per .deb Paket installiert wurde, startet er automatisch bei einem Reboot mit (via systemd/init-Skript).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Collectord wird standardmäßig mit dem Port 5222 gestartet. Um diese anzupassen sind zwei Schritte notwendig:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;1.)&#039;&#039;&#039; Anpassen der /usr/bin/collectord &lt;br /&gt;
    Hier bitte den Parameter my $opt_p von 5222 auf 5XXX abändern.&lt;br /&gt;
&lt;br /&gt;
Da der collectord mittlerweile per systemd beim reboot des RPi gestarte wird muss auch diese Konfiguration auf den neuen Port angepasst werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2.)&#039;&#039;&#039; Anpassen der /etc/default/collectord&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# collectord startup defaults:&lt;br /&gt;
# The TCP port collectord will listen for incoming connections (default: 5222)&lt;br /&gt;
PORT=5111&lt;br /&gt;
# The location of the configuration file (default: /etc/collectord.conf&lt;br /&gt;
CFGFILE=/etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manuell starten als Daemon (Parameter &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;) mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batterieüberwachung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung mit dem Modul BleTagBattery ===&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=74_BleTagBattery&lt;br /&gt;
|ModOwner=mumpitzstuff&lt;br /&gt;
}}&lt;br /&gt;
Mit dem Modul BleTagBattery - können die Batteriestati aller BT-LE Devices gelesen werden.&lt;br /&gt;
Es wird das batteryLevel und battery angelegt welches als BT-LE Tags an einer PRESENCE-Installation registriert wurden.&lt;br /&gt;
&lt;br /&gt;
Vorraussetzung und Installation:&lt;br /&gt;
&lt;br /&gt;
Bluez und Gattool&lt;br /&gt;
 sudo apt-get install bluez&lt;br /&gt;
&lt;br /&gt;
Das Gattool ist in den Installationen von Bluez inbegriffen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinzufügen des githup für das Modul&lt;br /&gt;
 update add http://raw.githubusercontent.com/mumpitzstuff/fhem-BleTagBattery/master/controls_bletagbattery.txt&lt;br /&gt;
 update all&lt;br /&gt;
 restart fhem: shutdown restart&lt;br /&gt;
 BT-LE tags muss an einer PRESENCE-Installation des type &amp;quot;lan-bluetooth&amp;quot; registriert sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart von FHEM kann das Modul definiert werden:&lt;br /&gt;
 define a new device: define &amp;lt;name of device&amp;gt; BleTagBattery&lt;br /&gt;
&lt;br /&gt;
Das Modul versucht in der Standardkonfiguration alle 6 Stunden die BT-LE Devices zu erreichen und das Reading batteryLevel und battery zu aktualisieren.&lt;br /&gt;
Das Update kann auch manuell mit dem folgenden Befehl erzwungen werden&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;name of device&amp;gt; statusRequest.&lt;br /&gt;
&lt;br /&gt;
Weiter Informationen und Disskussionen können dem eigentlichen [https://forum.fhem.de/index.php?topic=68104.0 Forumsbeitrag] entnommen werden,&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (aktuell nur G-Tags) ===&lt;br /&gt;
&lt;br /&gt;
Leider überträgt der G-Tag nach der Einrichtung als Device in FHEM kein Reading mit seinem aktuellen Batteriestatus.&lt;br /&gt;
Dem wurde mit Hilfe des Forum Abhilfe geschaffen.&lt;br /&gt;
Im Folgenden wird erläutert wie die Batterieüberwachung eingerichtet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
bc - Basiscalculator [https://packages.debian.org/de/sid/bc Bc-Paket]&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install bc &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen eines Shellskript auf dem Raspberry System. &lt;br /&gt;
Die Parameter &amp;lt;&amp;lt;MAC-Adresse&amp;gt;&amp;gt; und &amp;lt;&amp;lt;TagName&amp;gt;&amp;gt; müssen durch die Werte des auszulesenden G-Tags ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
stringZ=$(sudo gatttool -b 5C:2B:80:C1:14:41 --char-read --handle=0x001b)&lt;br /&gt;
stringZ=${stringZ:33:2}&lt;br /&gt;
stringZ=$(echo &amp;quot;$stringZ&amp;quot; | tr a-f A-F)&lt;br /&gt;
decimal=$(echo &amp;quot;ibase=16; $stringZ&amp;quot; | bc)&lt;br /&gt;
perl /opt/fhem/fhem.pl 7072 &amp;quot;setreading MeinGtag Batterie $decimal&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dem Device in FHEM (hier MeinGtag) ein userReading mit dem Namen &#039;&#039;&#039;Batterie&#039;&#039;&#039; hinzufügen.&lt;br /&gt;
Das Shellskript mit folgendem Befehl starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./GtagBatterie.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist hierbei,&#039;&#039;&#039; dass Skript mit &amp;quot;./&amp;quot; und nicht mit &amp;quot;sh&amp;quot; aufzurufen. Beim Aufruf mit &amp;quot;sh GtagBatterie.sh&amp;quot; produziert es einen Fehler&lt;br /&gt;
&amp;lt;pre&amp;gt;GtagBatterie.sh: 3: GtagBatterie.sh: Bad substitution &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Reading wird auf den ausgelesenen Wert der Batterie gesetzt. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Es sollte für jeden G-Tag ein eigenes Skript abgelegt werden. Das Skript kann per crontab oder fhem Kommando (system) regelmäßig aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (alle Devices vom Typ &amp;quot;MODE=lan-bluetooth&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
Es gibt eine weitere Möglichkeit um den Batteriestatus von LE Devices abzurufen und in FHEM als Reading darzustellen.&lt;br /&gt;
Dabei wird der Batteriezustand für alle LE Devices, die bereits in FHEM konfiguriert sind und per lepresenced überwacht werden, automatisch in einem shell-Script ermittelt.&lt;br /&gt;
Näheres dazu im Forumartikel {{Link2Forum|Topic=56960|LinkText=Erweiterung: Anwesenheitserkennung/Batterieüberwachung}}.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Automatische Ermittlung aller in FHEM konfigurierten LE Devices&lt;br /&gt;
* Möglichkeit, diese Devices alternativ manuell im Script einzutragen&lt;br /&gt;
* Es werden nur Devices abgefragt, die im Status &amp;quot;present&amp;quot; sind, also mit ziemlicher Sicherheit auch verfügbar sind&lt;br /&gt;
* Ein eventuell auf dem FHEM telnet-Port gesetztes Passwort kann im Script hinterlegt werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionierendes lepresenced&#039;&#039;&#039; - siehe [[Anwesenheitserkennung#Anleitung_f.C3.BCr_ein_LE_Device_.28z.B._Gtags.2CPebbles_etc..29|Anleitung für ein LE Device (z.B. Gtags,Pebbles etc.)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;socat&#039;&#039;&#039; - TCP port forwarder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install socat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gawk&#039;&#039;&#039; - Zum extrahieren der Daten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install gawk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gatttool&#039;&#039;&#039; - Bestandteil von bluez &lt;br /&gt;
&lt;br /&gt;
gatttool ist auf den meisten Distributionen im bluez-Paket, allerdings nicht bei Opensuse. Dort muss man das Sourcepaket von bluez installieren und selbst kompilieren.&lt;br /&gt;
gatttool sollte dann nach /usr/bin oder /usr/local/bin kopiert werden,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den notwendigen Erweiterungen werden für die Ausführung von gatttool &#039;&#039;&#039;Root-Rechte benötigt&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Das Script selbst gibt es hier: [https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery lebattery]&lt;br /&gt;
&lt;br /&gt;
Am Besten unter /opt/fhem/script/lebattery speichern und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo su -&lt;br /&gt;
mkdir /opt/fhem/script&lt;br /&gt;
cd /opt/fhem/script&lt;br /&gt;
wget https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery&lt;br /&gt;
chmod 755 lebattery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Bedarf können im Script noch die folgenden 3 Parameter angepasst werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# If allowed_telnetPort is protected by a password, add the password here&lt;br /&gt;
TELNETPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
# Attribute for batterylevel in FHEM&lt;br /&gt;
ATTRIBUT=&amp;quot;batterylevel&amp;quot;&lt;br /&gt;
# Use this, if you dont want the script to determine the tags on its own&lt;br /&gt;
LETAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript wird dann unter root folgendermaßen gestartet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/fhem/script/lebattery -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe des Skripts, wenn es mit dem Verbose Parameter -v gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Beide Devices sind vom Typ NUT mini, das Device mit dem FHEM-Namen &#039;&#039;&#039;nut_Micky&#039;&#039;&#039; ist im Status &#039;&#039;&#039;absent&#039;&#039;&#039;. Das zweite Device ist im Status &#039;&#039;&#039;present&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Determining address for nut_Micky ...&lt;br /&gt;
nut_Micky is in state absent, no further action required&lt;br /&gt;
&lt;br /&gt;
Determining address for nut_Test ...&lt;br /&gt;
Fetching batterylevel for nut_Test (F3:44:04:81:54:89) ...&lt;br /&gt;
Setting batterylevel for nut_Test to 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mein crontab-Eintrag (User root) sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3 3  * * * /opt/fhem/script/lebattery -v &amp;gt;/opt/fhem/script/lebattery.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird jeden Morgen um 3 Minuten nach 3 Uhr der Zustand der Batterien aller Devices ermittelt und in FHEM abgespeichert.&amp;lt;br&amp;gt; &lt;br /&gt;
Bevor man das mit crontab macht, sollte man allerdings zunächst sicher stellen, dass es auch ohne crontab funktioniert....&lt;br /&gt;
&lt;br /&gt;
Bei Problemen kann man auch erstmal schauen, ob das mit dem gattool überhaupt funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gatttool -t &amp;lt;Typ&amp;gt; -b &amp;lt;MAC-Adresse&amp;gt; --char-read --uuid 0x2a19&lt;br /&gt;
&lt;br /&gt;
handle: 0x0017 	 value: 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In diesem Fall hat die Batterie noch 100% (hex 64).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Typ ist abhängig vom Hersteller und kann public (G-Tags) bzw. random (Nut) sein. Im Zweifelsfall beides ausprobieren.&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
==  Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags ==&lt;br /&gt;
Ein Skript zur Nutzung der Gigaset G-TAGs zur Alarmierung bei öffnen und schließen von Türen und zur Anwesenheitserkennung, um die Alarmierung zu aktivieren bzw. deaktivieren. &lt;br /&gt;
Es kann verwendet werden um die Anwesenheit von mehrern Personen im Haushalt zu erkennen. Dabei wird eingeschränkt, dass nur bestimmte Personen die Alarmierung aktivieren können ( Eltern/Kind -Beziehung ).&lt;br /&gt;
Des Weiteren werden im Beispiel die Eltern benachrichtigt wenn eins der Kinder das Haus verlässt und die Eltern nicht anwesend sind.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Namen der G-Tags in den Skripten bitte anpassen!}}&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;Notify&#039;&#039; und die &#039;&#039;RESIDENTS-Erweiterung&#039;&#039; wird ein Dummy benötigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm dummy&lt;br /&gt;
attr Alarm devStateIcon aktiv:secur_locked@red inaktiv:secur_open@lightgreen&lt;br /&gt;
attr Alarm eventMap on:aktiv off:inaktiv&lt;br /&gt;
attr Alarm setList on off&lt;br /&gt;
attr Alarm webCmd aktiv:inaktiv&lt;br /&gt;
attr Alarm room Alarm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtag.*.presence:.* {Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code für die 99_myUtils.pm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### GTAG ANWESENHEITS CHECK&lt;br /&gt;
sub Anwesenheit_check($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
&lt;br /&gt;
# gtag_rot	-	Alias Marco&lt;br /&gt;
# gtag_schwarz	-	Alias Ulli&lt;br /&gt;
# gtag_gruen	-	Alias Frida&lt;br /&gt;
# gtag_orange	-	Alias Hannah&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Alle GTAGs sind Standardmäßig Residents Roommate&lt;br /&gt;
# $RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur Gäste (Roomguest) Auskommentiert, da ich es so nicht brauche&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$NAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
my $ALIASNAME = AttrVal($ROOMMATE,&#039;alias&#039;,$ROOMMATE); # ALIAS des Roommates auslesen&lt;br /&gt;
&lt;br /&gt;
my $GTAG1 = Value(&#039;gtag_rot&#039;); # ELTERN&lt;br /&gt;
my $GTAG2 = Value(&#039;gtag_schwarz&#039;); # ELTERN&lt;br /&gt;
&lt;br /&gt;
my $STATUS = &amp;quot;wahrscheinlich gerade los&amp;quot;;&lt;br /&gt;
$STATUS = &amp;quot;anwesend&amp;quot; if ($EVENT eq &amp;quot;present&amp;quot;); # Status: anwesend&lt;br /&gt;
$STATUS = &amp;quot;unterwegs&amp;quot; if ($EVENT eq &amp;quot;absent&amp;quot;); # Status: unterwegs&lt;br /&gt;
&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME ist $STATUS.&amp;quot;; # LOG Eintrag erzeugen&lt;br /&gt;
&lt;br /&gt;
if (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME ist da...&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME ist da...&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_rot&amp;quot; xor $NAME eq &amp;quot;gtag_schwarz&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG INAKTIV: $ALIASNAME ist da...; set Alarm inaktiv&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG INAKTIV&#039; &#039;$ALIASNAME ist da...&#039;; set Alarm inaktiv&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039;&amp;quot;); # Pushover&lt;br /&gt;
 } 		&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;inaktiv&amp;quot;) &amp;amp;&amp;amp; ($GTAG1 eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; $GTAG2 eq &amp;quot;absent&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set Alarm aktiv; set teleBot send ALARMIERUNG AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Alarm aktiv; set Infopush msg &#039;ALARMIERUNG AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039; &#039;&#039; 0 &#039;&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Integration des RESIDENTS-MODUL ===&lt;br /&gt;
&lt;br /&gt;
Der hier beschriebene Code erweitert die Funktionen unter dem Punkt 5.93.&lt;br /&gt;
Das Notify muss daher mit der folgenden Zeile erweitert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_AnwesenheitCheck notify gtag.*.presence:.* { Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;), Anwesenheit_check_resi(&amp;quot;$NAME&amp;quot;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die RESIDENTS Funktion nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### RESIDENTS&lt;br /&gt;
sub Anwesenheit_check_resi($) {&lt;br /&gt;
my ($NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME); # ALIASNAME des GTAGs auslesen&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Als Standard sind alle GTAGs Roommates&lt;br /&gt;
$RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur GTAG Namen der Gäste (Roomguest)&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$ALIASNAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
&lt;br /&gt;
if (ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;absent&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE absent&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
 elsif(ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;present&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE home&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Fenster/Tür. -Kontakt Überwachung ===&lt;br /&gt;
&lt;br /&gt;
Erweiterung für die Überwachung von  Fenster/Tür. -Kontakten. Dazu sind zwei weitere Notifys notwendig die auf die Trigger der Kontakte regagieren&lt;br /&gt;
und so eine weitere Funktion in der 99_myUtils.pm ansprechen. Die Notifys triggern auf Kontakte die mit dem Namen Kontakt* beginnen.&lt;br /&gt;
Sollten die eigenen Fenster/Tür. -Kontakt anderen Namen besitzen, müssen die Skripte dementsprechend angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Kontaktmeldung notify Kontakt.*:contact:.* {Kontakt_Meldung(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Sabotagealarm notify Kontakt.*.sabotageError:.on {Kontakt_Sabotage(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die TÜRKONTAKTE-Meldung nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### TÜRKONTAKTE-Meldung/Zustand&lt;br /&gt;
sub Kontakt_Meldung($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME wurde $EVENT&amp;quot;;&lt;br /&gt;
if (ReadingsVal(&amp;quot;Alarm&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;on&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
fhem(&amp;quot;set teleBot send $ALIASNAME wurde $EVENT&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;$ALIASNAME&#039; &#039;$ALIASNAME wurde $EVENT&#039;&amp;quot;); # Nachricht über Pushover&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### TÜRKONTAKTE-Sabotagealarm&lt;br /&gt;
&lt;br /&gt;
sub Kontakt_Sabotage($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME meldet Sabotagealarm&amp;quot;;&lt;br /&gt;
fhem(&amp;quot;set teleBot send Alarm: $ALIASNAME meldet Sabotagealarm&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;Alarmanlage&#039; &#039;$ALIASNAME meldet Sabotagealarm&#039; &#039;&#039; 2 &#039; &#039; 60 600 &amp;quot;); # Nachricht über Pushover&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zur Benutzung / Fehlerhandling ===&lt;br /&gt;
&lt;br /&gt;
Der Alarm dummy hat den Zustand on:off.  Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert.&lt;br /&gt;
Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden.&lt;br /&gt;
Die Benachrichtigung kann aktuell per &#039;&#039;Telegram&#039;&#039; sowie &#039;&#039;Pushover&#039;&#039; (&#039;&#039;&#039;Achtung mit zweiterem sind Abokosten verbunden!&#039;&#039;&#039;) realisiert werden.&lt;br /&gt;
Diskussion zum Thema im Forum unter: {{Link2Forum|Topic=64080}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Problemlösungen =&lt;br /&gt;
Falls es &#039;&#039;&#039;Probleme beim Starten des Skripts&#039;&#039;&#039; gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | grep lepresenced&lt;br /&gt;
sudo kill &amp;lt;pid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debuglevel lepresenced setzen:&lt;br /&gt;
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}&lt;br /&gt;
&lt;br /&gt;
Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, dass Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden sind durch den nötigen LOG-Eintrag ersetzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur das wichtigste Loggen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_WARNING&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Keinerlei LOG-Einträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_EMERG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;Problemen mit der Batterieüberwachung&#039;&#039;&#039; der Tags kann die Pi Firmeware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden.&lt;br /&gt;
Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:&lt;br /&gt;
&amp;lt;pre&amp;gt;connect: Connection refused (111)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo rpi-update 8521fd34c8f66b6d109acce943f6e25ec93ec005&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehr dazu unter: {{Link2Forum|Topic=56960|Message=589165}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das BT-Device ist ständig &amp;quot;absent&amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Mögliche Lösung kann sein, dass Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivität.&lt;br /&gt;
Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install bluez-hcidump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehler in Logdateien /var/log/syslog und /var/log/kernel&#039;&#039;&#039;&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634211] bt_err_ratelimited: 1 callbacks suppressed&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634231] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:12 raspberrypi kernel: [ 4906.647350] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.532081] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.655564] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene log&#039;s geschrieben. Darunter maßgeblich &amp;quot;syslog&amp;quot; und &amp;quot;kern.log&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend)&lt;br /&gt;
Unterbinden der Einträge durch Anlage eines blocklist Eintrag:&lt;br /&gt;
&lt;br /&gt;
 1. Unter &amp;quot;/etc/rsyslog.d&amp;quot; eine Datei erzeugen mit dem Namen &amp;quot;01-blocklist.conf&amp;quot;&lt;br /&gt;
 2. Inhalt: (Die Ausdrücke in den &amp;quot;&amp;quot; sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die unten stehenden&amp;quot;)&lt;br /&gt;
    :msg,contains,&amp;quot;Bluetooth: hci0 advertising data length corrected&amp;quot; stop&lt;br /&gt;
    :msg,contains,&amp;quot;bt_err_ratelimited:&amp;quot; stop&lt;br /&gt;
 3. Dienst neu starten &amp;quot;sudo service rsyslog restart&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Weiter Infos werden im offiziellen Thema {{Link2Forum|Topic=28753|Message=499184|LinkText=hier}} diskutiert.&lt;br /&gt;
&lt;br /&gt;
Seit Version 0.82 kann es beim Start zu folgenden Meldungen im Log kommen. &lt;br /&gt;
 Sep 06 16:13:45 raspberrypi systemd[1]: Started lepresenced.&lt;br /&gt;
 Sep 06 16:13:45 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: Received &#039;Set scan parameters failed: Input/output error&#039;, ...tting...&lt;br /&gt;
 Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...&lt;br /&gt;
&lt;br /&gt;
Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst indem es sich resettet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moderne iPhones und Android Geräte wechseln zum &amp;quot;deep standby&amp;quot; Modus&#039;&#039;&#039;, und werden dann als &amp;quot;abwesend&amp;quot; gemeldet.&lt;br /&gt;
Mittels einer Funktion, die via hping3 Packete an den Geräte senden, um die &amp;quot;wach&amp;quot; zu halten, und dann die MacAdresse ausliest, kann man dieses Problem umgehen. Mehr im Forum [https://forum.fhem.de/index.php/topic,76342.0.html]&lt;br /&gt;
&lt;br /&gt;
= Versionsänderungen lepresenced =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--Version 0.81 (BasisVersion)&lt;br /&gt;
--Version 0.82 (stable  08/2017)&lt;br /&gt;
  -Neue Kommandozeilenoption &amp;quot;--debug&amp;quot;: Startet lepresenced im Vordergrund und gibt ausführliche Debug-Informationen auf STDOUT aus.&lt;br /&gt;
  -Sanity Check: lepresenced prüft beim Starten die Verfügbarkeit von hciconfig, hcitool und hcidump.&lt;br /&gt;
  -Model: lepresenced übermittelt das Reading model nun als lan-lepresenced. Das erlaubt die Erkennung von lepresenced in der FHEM-Statistik (sofern aktiviert).&lt;br /&gt;
--Version 0.83 (stable  09/2017)&lt;br /&gt;
  - Behebung von Systemstart Fehlern&lt;br /&gt;
  - Weitere Debug-Möglichkeiten. U. a. wird nun mitgezählt, ob hcitool lescan (&amp;quot;legacy&amp;quot;) und hcidump eine identische Zahl an Beacons empfangen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ansprechpartner =&lt;br /&gt;
# {{Link2FU|117|markusbloch }} (Markus) für das PRESENCE-Modul und collectord&lt;br /&gt;
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced &lt;br /&gt;
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27285</id>
		<title>PRESENCE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27285"/>
		<updated>2018-06-29T12:51:50Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* BT-Dongle am PI installieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=73_PRESENCE.pm&lt;br /&gt;
|ModOwner=markusbloch&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lan-ping&#039;&#039;&#039; - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.&lt;br /&gt;
* &#039;&#039;&#039;fritzbox&#039;&#039;&#039; - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)&lt;br /&gt;
* &#039;&#039;&#039; Bluetooth&#039;&#039;&#039;&lt;br /&gt;
:- &#039;&#039;&#039;local-bluetooth&#039;&#039;&#039; - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)&lt;br /&gt;
:- &#039;&#039;&#039;lan-bluetooth&#039;&#039;&#039;   - Das Überwachen von Bluetoothgeräten, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. [[:Kategorie:Raspberry Pi|Raspberry Pi]]) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.&lt;br /&gt;
* &#039;&#039;&#039;function&#039;&#039;&#039; - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)&lt;br /&gt;
* &#039;&#039;&#039;shell-script&#039;&#039;&#039; - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Ping im WLAN/LAN =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die IP-Addresse 192.168.0.30 alle 30&amp;amp;nbsp;Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status &amp;quot;present&amp;quot; (anwesend), ansonsten &amp;quot;absent&amp;quot; (abwesend).&lt;br /&gt;
&lt;br /&gt;
Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30 &#039;&#039;&#039;60&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun würde das Handy alle 60 Sekunden geprüft werden.&lt;br /&gt;
&lt;br /&gt;
Nur wenn bei einem iPhone/iPad die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.&lt;br /&gt;
&lt;br /&gt;
Sollte die Fehlermeldung &lt;br /&gt;
:&amp;lt;code&amp;gt; PRESENCE (Handy) - ping command returned with output: ping: icmp open socket: Operation not permitted &amp;lt;/code&amp;gt; &lt;br /&gt;
im Log auftauchen und lan-ping dadurch nicht funktionieren, liegt ein Berechtigungsproblem vor. Kein Grund den User fhem zu root zu machen!&lt;br /&gt;
Prüfe zu erst als User root ob die Capabilities gesetzt sind.&lt;br /&gt;
:&amp;lt;code&amp;gt;getcap /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Sollte folgendes Ergeben zu Tage fördern.&lt;br /&gt;
:&amp;lt;code&amp;gt;/bin/ping = cap_net_raw+ep&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist dem nicht so, setzen wir die benötigten Capabilities&lt;br /&gt;
:&amp;lt;code&amp;gt;setcap cap_net_raw+ep /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Mehr Informationen zum Thema Capabilities [https://manpages.debian.org/jessie/manpages-de/capabilities.7.de.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.&lt;br /&gt;
&lt;br /&gt;
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt &amp;quot;Heimnetz&amp;quot; auftaucht. &lt;br /&gt;
&lt;br /&gt;
Die erforderliche Definition:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE fritzbox iPhone-4S&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachung mittels Perl-Code =&lt;br /&gt;
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; PRESENCE function {...} [ &amp;lt;check-interval&amp;gt; [ &amp;lt;present-check-interval&amp;gt; ] ]&lt;br /&gt;
&lt;br /&gt;
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.&lt;br /&gt;
&lt;br /&gt;
== Beispiel DHCP Überwachung auf Airport Basestation ==&lt;br /&gt;
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.&lt;br /&gt;
&lt;br /&gt;
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z.&amp;amp;nbsp;B. mit: &amp;lt;code&amp;gt;cpan install use Net::SNMP&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zuerst ist folgender Code in 99_myUtils.pm einzufügen, sollte diese noch nicht vorhanden sein muss diese aus dem Template welches unter Edit Files zu finden ist erzeugt werden.&lt;br /&gt;
&#039;&#039;&#039;Achtung, das ist nicht der komplette Inhalt der 99_myUtils!&#039;&#039;&#039; Das ist nur die einzelne Routine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::SNMP;&lt;br /&gt;
sub&lt;br /&gt;
snmpCheck($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($airport,$client)= @_;&lt;br /&gt;
&lt;br /&gt;
  my $community = &amp;quot;public&amp;quot;;&lt;br /&gt;
  my $host = $airport;&lt;br /&gt;
  my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2&amp;quot;;&lt;br /&gt;
  #my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2.25.1.10.0.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my ( $session, $error ) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
    -hostname =&amp;gt; $host,&lt;br /&gt;
    -community =&amp;gt; $community,&lt;br /&gt;
    -port =&amp;gt; 161,&lt;br /&gt;
    -version =&amp;gt; 1&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if( !defined($session) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
    return &amp;quot;Can&#039;t connect to host $host.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  my @snmpoids = ();&lt;br /&gt;
&lt;br /&gt;
  my $response = $session-&amp;gt;get_next_request($oid);&lt;br /&gt;
  my @nextid = keys %$response;&lt;br /&gt;
  while ( @nextid &amp;amp;&amp;amp; $nextid[0] &amp;amp;&amp;amp; $nextid[0] =~ m/^$oid/ ) {&lt;br /&gt;
    push( @snmpoids, $nextid[0] );&lt;br /&gt;
&lt;br /&gt;
    $response = $session-&amp;gt;get_next_request( $nextid[0] );&lt;br /&gt;
    @nextid = keys %$response;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if( !defined($response = $session-&amp;gt;get_request( @snmpoids ) ) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  foreach my $value (values %$response) {&lt;br /&gt;
    return 1 if( $value eq $client )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich das Mobilgerät so überwachen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define iPhone PRESENCE function {snmpCheck(&amp;quot;10.0.1.1&amp;quot;,&amp;quot;0x44d77429f35c&amp;quot;)} 30 30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwesenheitserkennung mittels UniFi Controller ==&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung bei Geräten in Verbindung mit UniFi-Produkten funktioniert selbst dann, wenn sich die Geräte im PowerSave-Modus befinden. &lt;br /&gt;
&lt;br /&gt;
Beachte: Die Geräte werden erst ungefähr nach 5 Minuten, nachdem das Gerät das WLAN verlassen hat als disconnected angezeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE function {ReadingsVal(&amp;quot;&amp;lt;UniFi&amp;gt;&amp;quot;,&amp;quot;&amp;lt;NamedDevice&amp;gt;&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;connected&amp;quot; ? 1:0}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Events =&lt;br /&gt;
Der Vorteil gegenüber der Function-Variante ist, dass diese Variante ohne Blocking.pm-Overhead direkt ausgeführt werden kann und in &amp;quot;Echtzeit&amp;quot; abläuft (siehe {{Link2Forum|Topic=40287|Message=562823}}).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Bluetooth =&lt;br /&gt;
== Vorbereitung und Informationen ==&lt;br /&gt;
=== Getestete Hardware/Software ===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie (interner BT-Controller)&lt;br /&gt;
* &#039;&#039;&#039;BT-Dongle&#039;&#039;&#039; - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano &amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt &#039;&#039;LowEnergy&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;BT-TAG&#039;&#039;&#039; - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo&lt;br /&gt;
&lt;br /&gt;
=== BT-Dongle am RaspberryPI installieren ===&lt;br /&gt;
Um den BT-Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am RaspberryPI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debian nachinstalliert werden.&lt;br /&gt;
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install bluetooth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach erfolgreicher Installation der Pakete sollte der RaspberryPI neu gestartet werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Reboot bitte das Log des RaspberryPI auf folgende Einträge prüfen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773748] NET: Registered protocol family 31&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773765] Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773797] Bluetooth: HCI socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773821] Bluetooth: L2CAP socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773890] Bluetooth: SCO socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.797531] usbcore: registered new interface driver btusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sobald der BT-Dongle erkannt wurde &#039;&#039;leuchtet&#039;&#039; (wenn vorhanden) auch die &#039;&#039;blaue/gelbe&#039;&#039; LED am Dongle auf.&lt;br /&gt;
&lt;br /&gt;
=== BT-Tags aktivieren ===&lt;br /&gt;
Jetzt kann der BT-Tag aktiviert werden. Bei einigen Tags muss dafür die &#039;&#039;&#039;Batteriesicherung&#039;&#039;&#039; gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Einen Tag wird mit folgendem Befehl auf der Konsole gesucht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hcitool lescan&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
LE Scan ...&lt;br /&gt;
7C:2F:80:A1:XA:XD (unknown)&lt;br /&gt;
7C:2F:80:A1:XA:XD Gigaset G-tag&lt;br /&gt;
7C:2F:80:A1:X4:X1 (unknown)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Übersicht über die möglichen Befehle von hcitool gibt es mit der Eingabe von:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo hcitool&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
hcitool - HCI Tool ver 5.23&lt;br /&gt;
Usage:&lt;br /&gt;
        hcitool [options] &amp;lt;command&amp;gt; [command parameters]&lt;br /&gt;
Options:&lt;br /&gt;
        --help  Display help&lt;br /&gt;
        -i dev  HCI device&lt;br /&gt;
Commands:&lt;br /&gt;
        dev     Display local devices&lt;br /&gt;
        inq     Inquire remote devices&lt;br /&gt;
        scan    Scan for remote devices&lt;br /&gt;
        name    Get name from remote device&lt;br /&gt;
        info    Get information from remote device&lt;br /&gt;
        spinq   Start periodic inquiry&lt;br /&gt;
        epinq   Exit periodic inquiry&lt;br /&gt;
        cmd     Submit arbitrary HCI commands&lt;br /&gt;
        con     Display active connections&lt;br /&gt;
        cc      Create connection to remote device&lt;br /&gt;
        dc      Disconnect from remote device&lt;br /&gt;
        sr      Switch master/slave role&lt;br /&gt;
        cpt     Change connection packet type&lt;br /&gt;
        rssi    Display connection RSSI&lt;br /&gt;
        lq      Display link quality&lt;br /&gt;
        tpl     Display transmit power level&lt;br /&gt;
        afh     Display AFH channel map&lt;br /&gt;
        lp      Set/display link policy settings&lt;br /&gt;
        lst     Set/display link supervision timeout&lt;br /&gt;
        auth    Request authentication&lt;br /&gt;
        enc     Set connection encryption&lt;br /&gt;
        key     Change connection link key&lt;br /&gt;
        clkoff  Read clock offset&lt;br /&gt;
        clock   Read local or remote clock&lt;br /&gt;
        lescan  Start LE scan&lt;br /&gt;
        lewladd Add device to LE White List&lt;br /&gt;
        lewlrm  Remove device from LE White List&lt;br /&gt;
        lewlsz  Read size of LE White List&lt;br /&gt;
        lewlclr Clear LE White list&lt;br /&gt;
        lecc    Create a LE Connection&lt;br /&gt;
        ledc    Disconnect a LE Connection&lt;br /&gt;
        lecup   LE Connection Update &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls beim SCAN kein Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des PI notwendig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hciconfig hci0 down&lt;br /&gt;
sudo hciconfig hci0 up&lt;br /&gt;
sudo hcitool dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch den FHEM Server direkt ==&lt;br /&gt;
[[Datei:Bluetooth-Adresse-iPhone.png|thumb|Bluetooth-Adresse eines iPhones]]&lt;br /&gt;
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.&lt;br /&gt;
&lt;br /&gt;
Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.&lt;br /&gt;
&lt;br /&gt;
Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der [[Konfiguration]] benötigt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord) ==&lt;br /&gt;
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]&lt;br /&gt;
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.&lt;br /&gt;
&lt;br /&gt;
Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Programm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Unterschied presenced / lepresenced / collectord ===&lt;br /&gt;
presenced und lepresenced sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced und lepresenced ist, dass lepresenced insbesondere für [https://de.wikipedia.org/wiki/Bluetooth_Low_Energy Bluetooth-LE-Devices] ist und presenced für &amp;quot;normale&amp;quot; Bluetooth-Geräte. &lt;br /&gt;
&lt;br /&gt;
collectord wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben. Sofern alle Räume einen Empfangspegel (RSSI) ermitteln können, wird bei mehreren anwesenden Räumen der Raum mit dem besten Empfangspegel selektiert (siehe {{Link2Forum|Topic=54482}}).&lt;br /&gt;
&lt;br /&gt;
=== Installation von (le)presenced ===&lt;br /&gt;
Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritte gehen jedoch auch mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket.&lt;br /&gt;
Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeitshalber wird sie aber aufgeführt.&lt;br /&gt;
&lt;br /&gt;
===== Installation per .deb-Paket =====&lt;br /&gt;
&lt;br /&gt;
Die bevorzugte Variante ist die Installation von lepresenced durch die passenden .deb Pakete.&lt;br /&gt;
{{Randnotiz|RNText=Bei einem Upgrade einer älteren Version reicht es, das neue .deb Paket mit&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo dpkg -i lepresenced-X.XX-X.deb&amp;lt;/code&amp;gt;&lt;br /&gt;
zu aktualisieren}} &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.Variante:&#039;&#039;&#039;&lt;br /&gt;
Herunterladen der aktuellen lepresenced-0.83-3.deb (Stand August 2017) Datei über den Webbrowser &lt;br /&gt;
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/ SVN-Repository]. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Download in other formats:&lt;br /&gt;
    Original Format &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
anklicken und die Datei herunterladen.&lt;br /&gt;
Die Datei kann jetzt auf den RPi kopiert und mit folgenden Befehlen ausgeführt werden (ggf. Berechtigungen anpassen). &lt;br /&gt;
&lt;br /&gt;
Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)&lt;br /&gt;
 https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.Variante:&#039;&#039;&#039; (zu Verwenden, wenn es Probleme bei Variante 1 gibt)&lt;br /&gt;
Herunterladen aus dem fhem contrib Verzeichnis:&lt;br /&gt;
Hierzu muss das contrib auf dem aktuellen Stand sein. Dazu wird die Installation von subversion (normal bereits vorhanden) benötigt.&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install subversion&lt;br /&gt;
&lt;br /&gt;
Danach kann per &lt;br /&gt;
 sudo svn checkout https://svn.fhem.de/fhem/trunk/fhem/contrib svnrepo&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Repository auf den Pi heruntergeladen werden. Danach sollte im gewählten Verzeichnis die eingecheckten Dateien verfügbar sein.&lt;br /&gt;
 /opt/fhem/svnrepo/PRESENCE/deb  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Installation der Variante 1 oder 2 &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Egal welche Variante gewählt wurde, nun kann mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;: Das &#039;&#039;&#039;Paket&#039;&#039;&#039; hat eine ca. Größe von &#039;&#039;&#039;6,5Kb&#039;&#039;&#039;. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird.&lt;br /&gt;
Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich &amp;quot;Download in other formats&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get -f install&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Installation sollte am Ende ein [ ok ] Starting lepresenced (via systemctl): lepresenced.service. ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paketlisten werden gelesen... Fertig&lt;br /&gt;
Abhängigkeitsbaum wird aufgebaut.       &lt;br /&gt;
Statusinformationen werden eingelesen.... Fertig&lt;br /&gt;
Abhängigkeiten werden korrigiert ... Fertig&lt;br /&gt;
Die folgenden zusätzlichen Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
Die folgenden NEUEN Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.&lt;br /&gt;
1 nicht vollständig installiert oder entfernt.&lt;br /&gt;
Es müssen 157 kB an Archiven heruntergeladen werden.&lt;br /&gt;
Nach dieser Operation werden 490 kB Plattenplatz zusätzlich benutzt.&lt;br /&gt;
Möchten Sie fortfahren? [J/n]&lt;br /&gt;
Holen: 1 http://archive.raspberrypi.org/debian/ jessie/main bluez-hcidump armhf 5.23-2+rpi2 [157 kB]&lt;br /&gt;
Es wurden 157 kB in 0 s geholt (921 kB/s).&lt;br /&gt;
Vormals nicht ausgewähltes Paket bluez-hcidump wird gewählt.&lt;br /&gt;
(Lese Datenbank ... 42033 Dateien und Verzeichnisse sind derzeit installiert.)&lt;br /&gt;
Vorbereitung zum Entpacken von .../bluez-hcidump_5.23-2+rpi2_armhf.deb ...&lt;br /&gt;
Entpacken von bluez-hcidump (5.23-2+rpi2) ...&lt;br /&gt;
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...&lt;br /&gt;
bluez-hcidump (5.23-2+rpi2) wird eingerichtet ...&lt;br /&gt;
lepresenced (0.82-1) wird eingerichtet ...&lt;br /&gt;
[ ok ] Starting lepresenced (via systemctl): lepresenced.service.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.Variante:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante wird das aktuellste lepresenced Skript aus github heruntergeladen. Das bedeutet, dass jegliche Konfiguration wie automatischer Start, Berechtigungen etc. &lt;br /&gt;
manuell konfiguriert werden muss. Diese Variante eignet sich nur für diejenigen, die keine .deb-Pakete installieren wollen/können oder die genau Wissen, was sie tun!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/PRESENCE/lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur &amp;quot;Installation&amp;quot; des Skripts folgendermaßen vorgehen:&lt;br /&gt;
Unter /fhem manuell den Ordner „script“ anlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir script&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Datei lepresenced reinkopieren und ausführbar machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod +x /opt/fhem/script/lepresenced&lt;br /&gt;
sudo chgrp -cR dialout lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Skript erstmalig starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt beim Starten des Skript eine Fehlermeldung, müssen die Abhängigkeiten aufgelöst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Can&#039;t locate Net/Server/Daemonize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 / usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /opt/fhem/lepresenced line 17.&lt;br /&gt;
BEGIN failed--compilation aborted at /opt/fhem/lepresenced line 17.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um die Abhängigkeiten aufzulösen muss folgendes nachinstalliert werden und anschließend ein Reboot durchgeführt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libnet-server-*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Einrichtung eines Bluetooth-Geräts über FHEM =====&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration eines BT-Geräts in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der zum Beispiel ein G-Tag dem FHEM-Server bekannt gemacht werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden&lt;br /&gt;
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist den angegeben Port zu unterscheiden. Für presenced muss der Port 5111 genommen werden, für lepresenced der Port 5333.&#039;&#039;&#039;&lt;br /&gt;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
Diese Variante sollte eingesetzt werden, wenn nur ein Pi nach Bluetooth-Geräten sucht. Möchte man mehr als ein Gerät nutzen um zum Beispiel eine größere Fläche abzudecken so muss mit collectored gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alle Räume gemeinsam ansprechen mittels collectord ===&lt;br /&gt;
Um zwei presenced- oder lepresenced Installationen zu verbinden wird der collectord Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Presence_Collectord_Uebersicht.jpg|200px|thumb|left|Schematische Darstellung Presence und Collectord, Danke an dtavb]]&lt;br /&gt;
Auf Basis folgender Skizze wird die Einrichtung und der Betrieb der Anwesenheitserkennung und Überwachung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mit dem PRESENCE-Modul sowie dem Skript (.deb-Paket) lepresenced beschrieben. Zusätzlich wird für die Verbindung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mehrere lepresenced Instanzen der collectord verwendet.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.&lt;br /&gt;
{{NeuerTextBlock}}&lt;br /&gt;
&lt;br /&gt;
==== Aufbau ====&lt;br /&gt;
; RPi1 (Hauptinstanz): &lt;br /&gt;
: FHEM Installation&lt;br /&gt;
: presence/lepresenced Installation &lt;br /&gt;
: collectord installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
; RPi2 (Zweitsystem): &lt;br /&gt;
: FHEM installation&lt;br /&gt;
: presence/lepresenced Installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Installation per .deb-Paket ====&lt;br /&gt;
collectord wird heruntergeladen und installiert:&lt;br /&gt;
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.8.deb (Stand Januar 2018)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i collectord-1.8.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord. Weitere Einstellungen können unter /etc/default/collectord vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration auf Shellebene ==== &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo vi /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datei muss jetzt nach folgender Vorlage angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# room definition&lt;br /&gt;
#[room-name]              # name of the room&lt;br /&gt;
#address=192.168.0.10     # ip-address or hostname&lt;br /&gt;
#port=5111                # tcp port which should be used (5111 is default)&lt;br /&gt;
#presence_timeout=120     # timeout in seconds for each check when devices are present&lt;br /&gt;
#absence_timeout=20       # timeout in secondsfor each check when devices are absent&lt;br /&gt;
&lt;br /&gt;
[RPi1] 			          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=127.0.0.1 	          # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&lt;br /&gt;
[RPi2]  		          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=192.168.178.127	          # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
* Es dürfen keine [Namen] mit Leerzeichen verwendet werden&lt;br /&gt;
* Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration in FHEM ==== &lt;br /&gt;
;RPi1&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60           &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222)&#039;&#039;&lt;br /&gt;
;RPi2&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60     &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222 - die IP-Adresse von die von RPi1)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration kann der Daemon gestartet werden.&lt;br /&gt;
Sobald das Bluetoothgerät irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort &lt;br /&gt;
an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading &amp;quot;rooms&amp;quot; des jeweiligen BT-Gerätes dargestellt.&lt;br /&gt;
&lt;br /&gt;
Zum testen sollte collectord einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectord prüfen kann, dieser steht in der Zeile &amp;lt;pre&amp;gt;created socket on 0.0.0.0 with port 5222&amp;lt;/pre&amp;gt; und man sehen kann, ob der collectord richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -vv -c /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Ausgabe sieht wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2017-04-02 17:52:55 - =================================================&lt;br /&gt;
2017-04-02 17:52:55 - started with PID 15554&lt;br /&gt;
2017-04-02 17:52:55 - reading configuration file&lt;br /&gt;
2017-04-02 17:52:55 - no config errors found&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5222&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656&lt;br /&gt;
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 2 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48662&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48664&lt;br /&gt;
2017-04-02 17:53:20 - created thread 3 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 4 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 5 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 6 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51638&lt;br /&gt;
2017-04-02 17:53:22 - created thread 7 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - created thread 8 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51640&lt;br /&gt;
2017-04-02 17:53:22 - created thread 9 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:23 - created thread 10 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:29 - new connection from 192.168.xxx.xxx:51642&lt;br /&gt;
2017-04-02 17:53:29 - created thread 11 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
2017-04-02 17:53:29 - created thread 12 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading &amp;quot;rooms&amp;quot; mit dem Wert der erkannten PRESENCE-Installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verhalten presence timeout im zusammenhang mit dem Attribut &amp;quot;absenceThreshold&amp;quot; der PRESENCE Konfiguration in FHEM&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der collectord.conf sind &amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt; für den jeweiligen Raum konfiguriert.&lt;br /&gt;
Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.&lt;br /&gt;
&lt;br /&gt;
In der PRESENCE-Definition kann man ebenfalls ein &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; setzen. Sobald sich der Zustand ändert, wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss. Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand. Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.&lt;br /&gt;
&lt;br /&gt;
Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Reading &amp;quot;room&amp;quot; bei einer PRESENCE Definition und der Zusammenhang zu collectord&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der collectord (ab Version 1.8) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das &amp;quot;room&amp;quot;-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.&lt;br /&gt;
&lt;br /&gt;
====  Automatischer Start ====&lt;br /&gt;
Wenn der collectord per .deb Paket installiert wurde, startet er automatisch bei einem Reboot mit (via systemd/init-Skript).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Collectord wird standardmäßig mit dem Port 5222 gestartet. Um diese anzupassen sind zwei Schritte notwendig:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;1.)&#039;&#039;&#039; Anpassen der /usr/bin/collectord &lt;br /&gt;
    Hier bitte den Parameter my $opt_p von 5222 auf 5XXX abändern.&lt;br /&gt;
&lt;br /&gt;
Da der collectord mittlerweile per systemd beim reboot des RPi gestarte wird muss auch diese Konfiguration auf den neuen Port angepasst werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2.)&#039;&#039;&#039; Anpassen der /etc/default/collectord&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# collectord startup defaults:&lt;br /&gt;
# The TCP port collectord will listen for incoming connections (default: 5222)&lt;br /&gt;
PORT=5111&lt;br /&gt;
# The location of the configuration file (default: /etc/collectord.conf&lt;br /&gt;
CFGFILE=/etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manuell starten als Daemon (Parameter &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;) mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batterieüberwachung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung mit dem Modul BleTagBattery ===&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=74_BleTagBattery&lt;br /&gt;
|ModOwner=mumpitzstuff&lt;br /&gt;
}}&lt;br /&gt;
Mit dem Modul BleTagBattery - können die Batteriestati aller BT-LE Devices gelesen werden.&lt;br /&gt;
Es wird das batteryLevel und battery angelegt welches als BT-LE Tags an einer PRESENCE-Installation registriert wurden.&lt;br /&gt;
&lt;br /&gt;
Vorraussetzung und Installation:&lt;br /&gt;
&lt;br /&gt;
Bluez und Gattool&lt;br /&gt;
 sudo apt-get install bluez&lt;br /&gt;
&lt;br /&gt;
Das Gattool ist in den Installationen von Bluez inbegriffen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinzufügen des githup für das Modul&lt;br /&gt;
 update add http://raw.githubusercontent.com/mumpitzstuff/fhem-BleTagBattery/master/controls_bletagbattery.txt&lt;br /&gt;
 update all&lt;br /&gt;
 restart fhem: shutdown restart&lt;br /&gt;
 BT-LE tags muss an einer PRESENCE-Installation des type &amp;quot;lan-bluetooth&amp;quot; registriert sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart von FHEM kann das Modul definiert werden:&lt;br /&gt;
 define a new device: define &amp;lt;name of device&amp;gt; BleTagBattery&lt;br /&gt;
&lt;br /&gt;
Das Modul versucht in der Standardkonfiguration alle 6 Stunden die BT-LE Devices zu erreichen und das Reading batteryLevel und battery zu aktualisieren.&lt;br /&gt;
Das Update kann auch manuell mit dem folgenden Befehl erzwungen werden&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;name of device&amp;gt; statusRequest.&lt;br /&gt;
&lt;br /&gt;
Weiter Informationen und Disskussionen können dem eigentlichen [https://forum.fhem.de/index.php?topic=68104.0 Forumsbeitrag] entnommen werden,&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (aktuell nur G-Tags) ===&lt;br /&gt;
&lt;br /&gt;
Leider überträgt der G-Tag nach der Einrichtung als Device in FHEM kein Reading mit seinem aktuellen Batteriestatus.&lt;br /&gt;
Dem wurde mit Hilfe des Forum Abhilfe geschaffen.&lt;br /&gt;
Im Folgenden wird erläutert wie die Batterieüberwachung eingerichtet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
bc - Basiscalculator [https://packages.debian.org/de/sid/bc Bc-Paket]&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install bc &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen eines Shellskript auf dem Raspberry System. &lt;br /&gt;
Die Parameter &amp;lt;&amp;lt;MAC-Adresse&amp;gt;&amp;gt; und &amp;lt;&amp;lt;TagName&amp;gt;&amp;gt; müssen durch die Werte des auszulesenden G-Tags ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
stringZ=$(sudo gatttool -b 5C:2B:80:C1:14:41 --char-read --handle=0x001b)&lt;br /&gt;
stringZ=${stringZ:33:2}&lt;br /&gt;
stringZ=$(echo &amp;quot;$stringZ&amp;quot; | tr a-f A-F)&lt;br /&gt;
decimal=$(echo &amp;quot;ibase=16; $stringZ&amp;quot; | bc)&lt;br /&gt;
perl /opt/fhem/fhem.pl 7072 &amp;quot;setreading MeinGtag Batterie $decimal&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dem Device in FHEM (hier MeinGtag) ein userReading mit dem Namen &#039;&#039;&#039;Batterie&#039;&#039;&#039; hinzufügen.&lt;br /&gt;
Das Shellskript mit folgendem Befehl starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./GtagBatterie.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist hierbei,&#039;&#039;&#039; dass Skript mit &amp;quot;./&amp;quot; und nicht mit &amp;quot;sh&amp;quot; aufzurufen. Beim Aufruf mit &amp;quot;sh GtagBatterie.sh&amp;quot; produziert es einen Fehler&lt;br /&gt;
&amp;lt;pre&amp;gt;GtagBatterie.sh: 3: GtagBatterie.sh: Bad substitution &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Reading wird auf den ausgelesenen Wert der Batterie gesetzt. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Es sollte für jeden G-Tag ein eigenes Skript abgelegt werden. Das Skript kann per crontab oder fhem Kommando (system) regelmäßig aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (alle Devices vom Typ &amp;quot;MODE=lan-bluetooth&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
Es gibt eine weitere Möglichkeit um den Batteriestatus von LE Devices abzurufen und in FHEM als Reading darzustellen.&lt;br /&gt;
Dabei wird der Batteriezustand für alle LE Devices, die bereits in FHEM konfiguriert sind und per lepresenced überwacht werden, automatisch in einem shell-Script ermittelt.&lt;br /&gt;
Näheres dazu im Forumartikel {{Link2Forum|Topic=56960|LinkText=Erweiterung: Anwesenheitserkennung/Batterieüberwachung}}.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Automatische Ermittlung aller in FHEM konfigurierten LE Devices&lt;br /&gt;
* Möglichkeit, diese Devices alternativ manuell im Script einzutragen&lt;br /&gt;
* Es werden nur Devices abgefragt, die im Status &amp;quot;present&amp;quot; sind, also mit ziemlicher Sicherheit auch verfügbar sind&lt;br /&gt;
* Ein eventuell auf dem FHEM telnet-Port gesetztes Passwort kann im Script hinterlegt werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionierendes lepresenced&#039;&#039;&#039; - siehe [[Anwesenheitserkennung#Anleitung_f.C3.BCr_ein_LE_Device_.28z.B._Gtags.2CPebbles_etc..29|Anleitung für ein LE Device (z.B. Gtags,Pebbles etc.)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;socat&#039;&#039;&#039; - TCP port forwarder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install socat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gawk&#039;&#039;&#039; - Zum extrahieren der Daten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install gawk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gatttool&#039;&#039;&#039; - Bestandteil von bluez &lt;br /&gt;
&lt;br /&gt;
gatttool ist auf den meisten Distributionen im bluez-Paket, allerdings nicht bei Opensuse. Dort muss man das Sourcepaket von bluez installieren und selbst kompilieren.&lt;br /&gt;
gatttool sollte dann nach /usr/bin oder /usr/local/bin kopiert werden,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den notwendigen Erweiterungen werden für die Ausführung von gatttool &#039;&#039;&#039;Root-Rechte benötigt&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Das Script selbst gibt es hier: [https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery lebattery]&lt;br /&gt;
&lt;br /&gt;
Am Besten unter /opt/fhem/script/lebattery speichern und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo su -&lt;br /&gt;
mkdir /opt/fhem/script&lt;br /&gt;
cd /opt/fhem/script&lt;br /&gt;
wget https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery&lt;br /&gt;
chmod 755 lebattery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Bedarf können im Script noch die folgenden 3 Parameter angepasst werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# If allowed_telnetPort is protected by a password, add the password here&lt;br /&gt;
TELNETPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
# Attribute for batterylevel in FHEM&lt;br /&gt;
ATTRIBUT=&amp;quot;batterylevel&amp;quot;&lt;br /&gt;
# Use this, if you dont want the script to determine the tags on its own&lt;br /&gt;
LETAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript wird dann unter root folgendermaßen gestartet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/fhem/script/lebattery -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe des Skripts, wenn es mit dem Verbose Parameter -v gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Beide Devices sind vom Typ NUT mini, das Device mit dem FHEM-Namen &#039;&#039;&#039;nut_Micky&#039;&#039;&#039; ist im Status &#039;&#039;&#039;absent&#039;&#039;&#039;. Das zweite Device ist im Status &#039;&#039;&#039;present&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Determining address for nut_Micky ...&lt;br /&gt;
nut_Micky is in state absent, no further action required&lt;br /&gt;
&lt;br /&gt;
Determining address for nut_Test ...&lt;br /&gt;
Fetching batterylevel for nut_Test (F3:44:04:81:54:89) ...&lt;br /&gt;
Setting batterylevel for nut_Test to 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mein crontab-Eintrag (User root) sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3 3  * * * /opt/fhem/script/lebattery -v &amp;gt;/opt/fhem/script/lebattery.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird jeden Morgen um 3 Minuten nach 3 Uhr der Zustand der Batterien aller Devices ermittelt und in FHEM abgespeichert.&amp;lt;br&amp;gt; &lt;br /&gt;
Bevor man das mit crontab macht, sollte man allerdings zunächst sicher stellen, dass es auch ohne crontab funktioniert....&lt;br /&gt;
&lt;br /&gt;
Bei Problemen kann man auch erstmal schauen, ob das mit dem gattool überhaupt funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gatttool -t &amp;lt;Typ&amp;gt; -b &amp;lt;MAC-Adresse&amp;gt; --char-read --uuid 0x2a19&lt;br /&gt;
&lt;br /&gt;
handle: 0x0017 	 value: 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In diesem Fall hat die Batterie noch 100% (hex 64).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Typ ist abhängig vom Hersteller und kann public (G-Tags) bzw. random (Nut) sein. Im Zweifelsfall beides ausprobieren.&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
==  Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags ==&lt;br /&gt;
Ein Skript zur Nutzung der Gigaset G-TAGs zur Alarmierung bei öffnen und schließen von Türen und zur Anwesenheitserkennung, um die Alarmierung zu aktivieren bzw. deaktivieren. &lt;br /&gt;
Es kann verwendet werden um die Anwesenheit von mehrern Personen im Haushalt zu erkennen. Dabei wird eingeschränkt, dass nur bestimmte Personen die Alarmierung aktivieren können ( Eltern/Kind -Beziehung ).&lt;br /&gt;
Des Weiteren werden im Beispiel die Eltern benachrichtigt wenn eins der Kinder das Haus verlässt und die Eltern nicht anwesend sind.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Namen der G-Tags in den Skripten bitte anpassen!}}&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;Notify&#039;&#039; und die &#039;&#039;RESIDENTS-Erweiterung&#039;&#039; wird ein Dummy benötigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm dummy&lt;br /&gt;
attr Alarm devStateIcon aktiv:secur_locked@red inaktiv:secur_open@lightgreen&lt;br /&gt;
attr Alarm eventMap on:aktiv off:inaktiv&lt;br /&gt;
attr Alarm setList on off&lt;br /&gt;
attr Alarm webCmd aktiv:inaktiv&lt;br /&gt;
attr Alarm room Alarm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtag.*.presence:.* {Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code für die 99_myUtils.pm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### GTAG ANWESENHEITS CHECK&lt;br /&gt;
sub Anwesenheit_check($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
&lt;br /&gt;
# gtag_rot	-	Alias Marco&lt;br /&gt;
# gtag_schwarz	-	Alias Ulli&lt;br /&gt;
# gtag_gruen	-	Alias Frida&lt;br /&gt;
# gtag_orange	-	Alias Hannah&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Alle GTAGs sind Standardmäßig Residents Roommate&lt;br /&gt;
# $RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur Gäste (Roomguest) Auskommentiert, da ich es so nicht brauche&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$NAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
my $ALIASNAME = AttrVal($ROOMMATE,&#039;alias&#039;,$ROOMMATE); # ALIAS des Roommates auslesen&lt;br /&gt;
&lt;br /&gt;
my $GTAG1 = Value(&#039;gtag_rot&#039;); # ELTERN&lt;br /&gt;
my $GTAG2 = Value(&#039;gtag_schwarz&#039;); # ELTERN&lt;br /&gt;
&lt;br /&gt;
my $STATUS = &amp;quot;wahrscheinlich gerade los&amp;quot;;&lt;br /&gt;
$STATUS = &amp;quot;anwesend&amp;quot; if ($EVENT eq &amp;quot;present&amp;quot;); # Status: anwesend&lt;br /&gt;
$STATUS = &amp;quot;unterwegs&amp;quot; if ($EVENT eq &amp;quot;absent&amp;quot;); # Status: unterwegs&lt;br /&gt;
&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME ist $STATUS.&amp;quot;; # LOG Eintrag erzeugen&lt;br /&gt;
&lt;br /&gt;
if (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME ist da...&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME ist da...&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_rot&amp;quot; xor $NAME eq &amp;quot;gtag_schwarz&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG INAKTIV: $ALIASNAME ist da...; set Alarm inaktiv&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG INAKTIV&#039; &#039;$ALIASNAME ist da...&#039;; set Alarm inaktiv&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039;&amp;quot;); # Pushover&lt;br /&gt;
 } 		&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;inaktiv&amp;quot;) &amp;amp;&amp;amp; ($GTAG1 eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; $GTAG2 eq &amp;quot;absent&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set Alarm aktiv; set teleBot send ALARMIERUNG AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Alarm aktiv; set Infopush msg &#039;ALARMIERUNG AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039; &#039;&#039; 0 &#039;&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Integration des RESIDENTS-MODUL ===&lt;br /&gt;
&lt;br /&gt;
Der hier beschriebene Code erweitert die Funktionen unter dem Punkt 5.93.&lt;br /&gt;
Das Notify muss daher mit der folgenden Zeile erweitert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_AnwesenheitCheck notify gtag.*.presence:.* { Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;), Anwesenheit_check_resi(&amp;quot;$NAME&amp;quot;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die RESIDENTS Funktion nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### RESIDENTS&lt;br /&gt;
sub Anwesenheit_check_resi($) {&lt;br /&gt;
my ($NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME); # ALIASNAME des GTAGs auslesen&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Als Standard sind alle GTAGs Roommates&lt;br /&gt;
$RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur GTAG Namen der Gäste (Roomguest)&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$ALIASNAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
&lt;br /&gt;
if (ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;absent&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE absent&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
 elsif(ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;present&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE home&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Fenster/Tür. -Kontakt Überwachung ===&lt;br /&gt;
&lt;br /&gt;
Erweiterung für die Überwachung von  Fenster/Tür. -Kontakten. Dazu sind zwei weitere Notifys notwendig die auf die Trigger der Kontakte regagieren&lt;br /&gt;
und so eine weitere Funktion in der 99_myUtils.pm ansprechen. Die Notifys triggern auf Kontakte die mit dem Namen Kontakt* beginnen.&lt;br /&gt;
Sollten die eigenen Fenster/Tür. -Kontakt anderen Namen besitzen, müssen die Skripte dementsprechend angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Kontaktmeldung notify Kontakt.*:contact:.* {Kontakt_Meldung(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Sabotagealarm notify Kontakt.*.sabotageError:.on {Kontakt_Sabotage(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die TÜRKONTAKTE-Meldung nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### TÜRKONTAKTE-Meldung/Zustand&lt;br /&gt;
sub Kontakt_Meldung($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME wurde $EVENT&amp;quot;;&lt;br /&gt;
if (ReadingsVal(&amp;quot;Alarm&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;on&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
fhem(&amp;quot;set teleBot send $ALIASNAME wurde $EVENT&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;$ALIASNAME&#039; &#039;$ALIASNAME wurde $EVENT&#039;&amp;quot;); # Nachricht über Pushover&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### TÜRKONTAKTE-Sabotagealarm&lt;br /&gt;
&lt;br /&gt;
sub Kontakt_Sabotage($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME meldet Sabotagealarm&amp;quot;;&lt;br /&gt;
fhem(&amp;quot;set teleBot send Alarm: $ALIASNAME meldet Sabotagealarm&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;Alarmanlage&#039; &#039;$ALIASNAME meldet Sabotagealarm&#039; &#039;&#039; 2 &#039; &#039; 60 600 &amp;quot;); # Nachricht über Pushover&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zur Benutzung / Fehlerhandling ===&lt;br /&gt;
&lt;br /&gt;
Der Alarm dummy hat den Zustand on:off.  Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert.&lt;br /&gt;
Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden.&lt;br /&gt;
Die Benachrichtigung kann aktuell per &#039;&#039;Telegram&#039;&#039; sowie &#039;&#039;Pushover&#039;&#039; (&#039;&#039;&#039;Achtung mit zweiterem sind Abokosten verbunden!&#039;&#039;&#039;) realisiert werden.&lt;br /&gt;
Diskussion zum Thema im Forum unter: {{Link2Forum|Topic=64080}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Problemlösungen =&lt;br /&gt;
Falls es &#039;&#039;&#039;Probleme beim Starten des Skripts&#039;&#039;&#039; gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | grep lepresenced&lt;br /&gt;
sudo kill &amp;lt;pid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debuglevel lepresenced setzen:&lt;br /&gt;
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}&lt;br /&gt;
&lt;br /&gt;
Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, dass Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden sind durch den nötigen LOG-Eintrag ersetzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur das wichtigste Loggen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_WARNING&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Keinerlei LOG-Einträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_EMERG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;Problemen mit der Batterieüberwachung&#039;&#039;&#039; der Tags kann die Pi Firmeware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden.&lt;br /&gt;
Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:&lt;br /&gt;
&amp;lt;pre&amp;gt;connect: Connection refused (111)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo rpi-update 8521fd34c8f66b6d109acce943f6e25ec93ec005&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehr dazu unter: {{Link2Forum|Topic=56960|Message=589165}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das BT-Device ist ständig &amp;quot;absent&amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Mögliche Lösung kann sein, dass Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivität.&lt;br /&gt;
Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install bluez-hcidump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehler in Logdateien /var/log/syslog und /var/log/kernel&#039;&#039;&#039;&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634211] bt_err_ratelimited: 1 callbacks suppressed&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634231] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:12 raspberrypi kernel: [ 4906.647350] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.532081] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.655564] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene log&#039;s geschrieben. Darunter maßgeblich &amp;quot;syslog&amp;quot; und &amp;quot;kern.log&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend)&lt;br /&gt;
Unterbinden der Einträge durch Anlage eines blocklist Eintrag:&lt;br /&gt;
&lt;br /&gt;
 1. Unter &amp;quot;/etc/rsyslog.d&amp;quot; eine Datei erzeugen mit dem Namen &amp;quot;01-blocklist.conf&amp;quot;&lt;br /&gt;
 2. Inhalt: (Die Ausdrücke in den &amp;quot;&amp;quot; sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die unten stehenden&amp;quot;)&lt;br /&gt;
    :msg,contains,&amp;quot;Bluetooth: hci0 advertising data length corrected&amp;quot; stop&lt;br /&gt;
    :msg,contains,&amp;quot;bt_err_ratelimited:&amp;quot; stop&lt;br /&gt;
 3. Dienst neu starten &amp;quot;sudo service rsyslog restart&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Weiter Infos werden im offiziellen Thema {{Link2Forum|Topic=28753|Message=499184|LinkText=hier}} diskutiert.&lt;br /&gt;
&lt;br /&gt;
Seit Version 0.82 kann es beim Start zu folgenden Meldungen im Log kommen. &lt;br /&gt;
 Sep 06 16:13:45 raspberrypi systemd[1]: Started lepresenced.&lt;br /&gt;
 Sep 06 16:13:45 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: Received &#039;Set scan parameters failed: Input/output error&#039;, ...tting...&lt;br /&gt;
 Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...&lt;br /&gt;
&lt;br /&gt;
Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst indem es sich resettet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moderne iPhones und Android Geräte wechseln zum &amp;quot;deep standby&amp;quot; Modus&#039;&#039;&#039;, und werden dann als &amp;quot;abwesend&amp;quot; gemeldet.&lt;br /&gt;
Mittels einer Funktion, die via hping3 Packete an den Geräte senden, um die &amp;quot;wach&amp;quot; zu halten, und dann die MacAdresse ausliest, kann man dieses Problem umgehen. Mehr im Forum [https://forum.fhem.de/index.php/topic,76342.0.html]&lt;br /&gt;
&lt;br /&gt;
= Versionsänderungen lepresenced =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--Version 0.81 (BasisVersion)&lt;br /&gt;
--Version 0.82 (stable  08/2017)&lt;br /&gt;
  -Neue Kommandozeilenoption &amp;quot;--debug&amp;quot;: Startet lepresenced im Vordergrund und gibt ausführliche Debug-Informationen auf STDOUT aus.&lt;br /&gt;
  -Sanity Check: lepresenced prüft beim Starten die Verfügbarkeit von hciconfig, hcitool und hcidump.&lt;br /&gt;
  -Model: lepresenced übermittelt das Reading model nun als lan-lepresenced. Das erlaubt die Erkennung von lepresenced in der FHEM-Statistik (sofern aktiviert).&lt;br /&gt;
--Version 0.83 (stable  09/2017)&lt;br /&gt;
  - Behebung von Systemstart Fehlern&lt;br /&gt;
  - Weitere Debug-Möglichkeiten. U. a. wird nun mitgezählt, ob hcitool lescan (&amp;quot;legacy&amp;quot;) und hcidump eine identische Zahl an Beacons empfangen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ansprechpartner =&lt;br /&gt;
# {{Link2FU|117|markusbloch }} (Markus) für das PRESENCE-Modul und collectord&lt;br /&gt;
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced &lt;br /&gt;
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27284</id>
		<title>PRESENCE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27284"/>
		<updated>2018-06-29T12:51:11Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* BT-Dongle am PI installieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=73_PRESENCE.pm&lt;br /&gt;
|ModOwner=markusbloch&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lan-ping&#039;&#039;&#039; - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.&lt;br /&gt;
* &#039;&#039;&#039;fritzbox&#039;&#039;&#039; - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)&lt;br /&gt;
* &#039;&#039;&#039; Bluetooth&#039;&#039;&#039;&lt;br /&gt;
:- &#039;&#039;&#039;local-bluetooth&#039;&#039;&#039; - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)&lt;br /&gt;
:- &#039;&#039;&#039;lan-bluetooth&#039;&#039;&#039;   - Das Überwachen von Bluetoothgeräten, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. [[:Kategorie:Raspberry Pi|Raspberry Pi]]) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.&lt;br /&gt;
* &#039;&#039;&#039;function&#039;&#039;&#039; - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)&lt;br /&gt;
* &#039;&#039;&#039;shell-script&#039;&#039;&#039; - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Ping im WLAN/LAN =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die IP-Addresse 192.168.0.30 alle 30&amp;amp;nbsp;Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status &amp;quot;present&amp;quot; (anwesend), ansonsten &amp;quot;absent&amp;quot; (abwesend).&lt;br /&gt;
&lt;br /&gt;
Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30 &#039;&#039;&#039;60&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun würde das Handy alle 60 Sekunden geprüft werden.&lt;br /&gt;
&lt;br /&gt;
Nur wenn bei einem iPhone/iPad die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.&lt;br /&gt;
&lt;br /&gt;
Sollte die Fehlermeldung &lt;br /&gt;
:&amp;lt;code&amp;gt; PRESENCE (Handy) - ping command returned with output: ping: icmp open socket: Operation not permitted &amp;lt;/code&amp;gt; &lt;br /&gt;
im Log auftauchen und lan-ping dadurch nicht funktionieren, liegt ein Berechtigungsproblem vor. Kein Grund den User fhem zu root zu machen!&lt;br /&gt;
Prüfe zu erst als User root ob die Capabilities gesetzt sind.&lt;br /&gt;
:&amp;lt;code&amp;gt;getcap /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Sollte folgendes Ergeben zu Tage fördern.&lt;br /&gt;
:&amp;lt;code&amp;gt;/bin/ping = cap_net_raw+ep&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist dem nicht so, setzen wir die benötigten Capabilities&lt;br /&gt;
:&amp;lt;code&amp;gt;setcap cap_net_raw+ep /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Mehr Informationen zum Thema Capabilities [https://manpages.debian.org/jessie/manpages-de/capabilities.7.de.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.&lt;br /&gt;
&lt;br /&gt;
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt &amp;quot;Heimnetz&amp;quot; auftaucht. &lt;br /&gt;
&lt;br /&gt;
Die erforderliche Definition:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE fritzbox iPhone-4S&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachung mittels Perl-Code =&lt;br /&gt;
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; PRESENCE function {...} [ &amp;lt;check-interval&amp;gt; [ &amp;lt;present-check-interval&amp;gt; ] ]&lt;br /&gt;
&lt;br /&gt;
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.&lt;br /&gt;
&lt;br /&gt;
== Beispiel DHCP Überwachung auf Airport Basestation ==&lt;br /&gt;
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.&lt;br /&gt;
&lt;br /&gt;
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z.&amp;amp;nbsp;B. mit: &amp;lt;code&amp;gt;cpan install use Net::SNMP&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zuerst ist folgender Code in 99_myUtils.pm einzufügen, sollte diese noch nicht vorhanden sein muss diese aus dem Template welches unter Edit Files zu finden ist erzeugt werden.&lt;br /&gt;
&#039;&#039;&#039;Achtung, das ist nicht der komplette Inhalt der 99_myUtils!&#039;&#039;&#039; Das ist nur die einzelne Routine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::SNMP;&lt;br /&gt;
sub&lt;br /&gt;
snmpCheck($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($airport,$client)= @_;&lt;br /&gt;
&lt;br /&gt;
  my $community = &amp;quot;public&amp;quot;;&lt;br /&gt;
  my $host = $airport;&lt;br /&gt;
  my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2&amp;quot;;&lt;br /&gt;
  #my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2.25.1.10.0.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my ( $session, $error ) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
    -hostname =&amp;gt; $host,&lt;br /&gt;
    -community =&amp;gt; $community,&lt;br /&gt;
    -port =&amp;gt; 161,&lt;br /&gt;
    -version =&amp;gt; 1&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if( !defined($session) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
    return &amp;quot;Can&#039;t connect to host $host.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  my @snmpoids = ();&lt;br /&gt;
&lt;br /&gt;
  my $response = $session-&amp;gt;get_next_request($oid);&lt;br /&gt;
  my @nextid = keys %$response;&lt;br /&gt;
  while ( @nextid &amp;amp;&amp;amp; $nextid[0] &amp;amp;&amp;amp; $nextid[0] =~ m/^$oid/ ) {&lt;br /&gt;
    push( @snmpoids, $nextid[0] );&lt;br /&gt;
&lt;br /&gt;
    $response = $session-&amp;gt;get_next_request( $nextid[0] );&lt;br /&gt;
    @nextid = keys %$response;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if( !defined($response = $session-&amp;gt;get_request( @snmpoids ) ) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  foreach my $value (values %$response) {&lt;br /&gt;
    return 1 if( $value eq $client )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich das Mobilgerät so überwachen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define iPhone PRESENCE function {snmpCheck(&amp;quot;10.0.1.1&amp;quot;,&amp;quot;0x44d77429f35c&amp;quot;)} 30 30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwesenheitserkennung mittels UniFi Controller ==&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung bei Geräten in Verbindung mit UniFi-Produkten funktioniert selbst dann, wenn sich die Geräte im PowerSave-Modus befinden. &lt;br /&gt;
&lt;br /&gt;
Beachte: Die Geräte werden erst ungefähr nach 5 Minuten, nachdem das Gerät das WLAN verlassen hat als disconnected angezeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE function {ReadingsVal(&amp;quot;&amp;lt;UniFi&amp;gt;&amp;quot;,&amp;quot;&amp;lt;NamedDevice&amp;gt;&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;connected&amp;quot; ? 1:0}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Events =&lt;br /&gt;
Der Vorteil gegenüber der Function-Variante ist, dass diese Variante ohne Blocking.pm-Overhead direkt ausgeführt werden kann und in &amp;quot;Echtzeit&amp;quot; abläuft (siehe {{Link2Forum|Topic=40287|Message=562823}}).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Bluetooth =&lt;br /&gt;
== Vorbereitung und Informationen ==&lt;br /&gt;
=== Getestete Hardware/Software ===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie (interner BT-Controller)&lt;br /&gt;
* &#039;&#039;&#039;BT-Dongle&#039;&#039;&#039; - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano &amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt &#039;&#039;LowEnergy&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;BT-TAG&#039;&#039;&#039; - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo&lt;br /&gt;
&lt;br /&gt;
=== BT-Dongle am PI installieren ===&lt;br /&gt;
Um den BT-Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am RaspberryPI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debian nachinstalliert werden.&lt;br /&gt;
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install bluetooth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach erfolgreicher Installation der Pakete sollte der RaspberryPI neu gestartet werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Reboot bitte das Log des RaspberryPI auf folgende Einträge prüfen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773748] NET: Registered protocol family 31&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773765] Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773797] Bluetooth: HCI socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773821] Bluetooth: L2CAP socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773890] Bluetooth: SCO socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.797531] usbcore: registered new interface driver btusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sobald der BT-Dongle erkannt wurde &#039;&#039;leuchtet&#039;&#039; (wenn vorhanden) auch die &#039;&#039;blaue/gelbe&#039;&#039; LED am Dongle auf.&lt;br /&gt;
&lt;br /&gt;
=== BT-Tags aktivieren ===&lt;br /&gt;
Jetzt kann der BT-Tag aktiviert werden. Bei einigen Tags muss dafür die &#039;&#039;&#039;Batteriesicherung&#039;&#039;&#039; gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Einen Tag wird mit folgendem Befehl auf der Konsole gesucht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hcitool lescan&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
LE Scan ...&lt;br /&gt;
7C:2F:80:A1:XA:XD (unknown)&lt;br /&gt;
7C:2F:80:A1:XA:XD Gigaset G-tag&lt;br /&gt;
7C:2F:80:A1:X4:X1 (unknown)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Übersicht über die möglichen Befehle von hcitool gibt es mit der Eingabe von:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo hcitool&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
hcitool - HCI Tool ver 5.23&lt;br /&gt;
Usage:&lt;br /&gt;
        hcitool [options] &amp;lt;command&amp;gt; [command parameters]&lt;br /&gt;
Options:&lt;br /&gt;
        --help  Display help&lt;br /&gt;
        -i dev  HCI device&lt;br /&gt;
Commands:&lt;br /&gt;
        dev     Display local devices&lt;br /&gt;
        inq     Inquire remote devices&lt;br /&gt;
        scan    Scan for remote devices&lt;br /&gt;
        name    Get name from remote device&lt;br /&gt;
        info    Get information from remote device&lt;br /&gt;
        spinq   Start periodic inquiry&lt;br /&gt;
        epinq   Exit periodic inquiry&lt;br /&gt;
        cmd     Submit arbitrary HCI commands&lt;br /&gt;
        con     Display active connections&lt;br /&gt;
        cc      Create connection to remote device&lt;br /&gt;
        dc      Disconnect from remote device&lt;br /&gt;
        sr      Switch master/slave role&lt;br /&gt;
        cpt     Change connection packet type&lt;br /&gt;
        rssi    Display connection RSSI&lt;br /&gt;
        lq      Display link quality&lt;br /&gt;
        tpl     Display transmit power level&lt;br /&gt;
        afh     Display AFH channel map&lt;br /&gt;
        lp      Set/display link policy settings&lt;br /&gt;
        lst     Set/display link supervision timeout&lt;br /&gt;
        auth    Request authentication&lt;br /&gt;
        enc     Set connection encryption&lt;br /&gt;
        key     Change connection link key&lt;br /&gt;
        clkoff  Read clock offset&lt;br /&gt;
        clock   Read local or remote clock&lt;br /&gt;
        lescan  Start LE scan&lt;br /&gt;
        lewladd Add device to LE White List&lt;br /&gt;
        lewlrm  Remove device from LE White List&lt;br /&gt;
        lewlsz  Read size of LE White List&lt;br /&gt;
        lewlclr Clear LE White list&lt;br /&gt;
        lecc    Create a LE Connection&lt;br /&gt;
        ledc    Disconnect a LE Connection&lt;br /&gt;
        lecup   LE Connection Update &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls beim SCAN kein Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des PI notwendig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hciconfig hci0 down&lt;br /&gt;
sudo hciconfig hci0 up&lt;br /&gt;
sudo hcitool dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch den FHEM Server direkt ==&lt;br /&gt;
[[Datei:Bluetooth-Adresse-iPhone.png|thumb|Bluetooth-Adresse eines iPhones]]&lt;br /&gt;
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.&lt;br /&gt;
&lt;br /&gt;
Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.&lt;br /&gt;
&lt;br /&gt;
Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der [[Konfiguration]] benötigt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord) ==&lt;br /&gt;
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]&lt;br /&gt;
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.&lt;br /&gt;
&lt;br /&gt;
Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Programm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Unterschied presenced / lepresenced / collectord ===&lt;br /&gt;
presenced und lepresenced sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced und lepresenced ist, dass lepresenced insbesondere für [https://de.wikipedia.org/wiki/Bluetooth_Low_Energy Bluetooth-LE-Devices] ist und presenced für &amp;quot;normale&amp;quot; Bluetooth-Geräte. &lt;br /&gt;
&lt;br /&gt;
collectord wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben. Sofern alle Räume einen Empfangspegel (RSSI) ermitteln können, wird bei mehreren anwesenden Räumen der Raum mit dem besten Empfangspegel selektiert (siehe {{Link2Forum|Topic=54482}}).&lt;br /&gt;
&lt;br /&gt;
=== Installation von (le)presenced ===&lt;br /&gt;
Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritte gehen jedoch auch mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket.&lt;br /&gt;
Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeitshalber wird sie aber aufgeführt.&lt;br /&gt;
&lt;br /&gt;
===== Installation per .deb-Paket =====&lt;br /&gt;
&lt;br /&gt;
Die bevorzugte Variante ist die Installation von lepresenced durch die passenden .deb Pakete.&lt;br /&gt;
{{Randnotiz|RNText=Bei einem Upgrade einer älteren Version reicht es, das neue .deb Paket mit&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo dpkg -i lepresenced-X.XX-X.deb&amp;lt;/code&amp;gt;&lt;br /&gt;
zu aktualisieren}} &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.Variante:&#039;&#039;&#039;&lt;br /&gt;
Herunterladen der aktuellen lepresenced-0.83-3.deb (Stand August 2017) Datei über den Webbrowser &lt;br /&gt;
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/ SVN-Repository]. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Download in other formats:&lt;br /&gt;
    Original Format &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
anklicken und die Datei herunterladen.&lt;br /&gt;
Die Datei kann jetzt auf den RPi kopiert und mit folgenden Befehlen ausgeführt werden (ggf. Berechtigungen anpassen). &lt;br /&gt;
&lt;br /&gt;
Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)&lt;br /&gt;
 https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.Variante:&#039;&#039;&#039; (zu Verwenden, wenn es Probleme bei Variante 1 gibt)&lt;br /&gt;
Herunterladen aus dem fhem contrib Verzeichnis:&lt;br /&gt;
Hierzu muss das contrib auf dem aktuellen Stand sein. Dazu wird die Installation von subversion (normal bereits vorhanden) benötigt.&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install subversion&lt;br /&gt;
&lt;br /&gt;
Danach kann per &lt;br /&gt;
 sudo svn checkout https://svn.fhem.de/fhem/trunk/fhem/contrib svnrepo&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Repository auf den Pi heruntergeladen werden. Danach sollte im gewählten Verzeichnis die eingecheckten Dateien verfügbar sein.&lt;br /&gt;
 /opt/fhem/svnrepo/PRESENCE/deb  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Installation der Variante 1 oder 2 &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Egal welche Variante gewählt wurde, nun kann mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;: Das &#039;&#039;&#039;Paket&#039;&#039;&#039; hat eine ca. Größe von &#039;&#039;&#039;6,5Kb&#039;&#039;&#039;. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird.&lt;br /&gt;
Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich &amp;quot;Download in other formats&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get -f install&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Installation sollte am Ende ein [ ok ] Starting lepresenced (via systemctl): lepresenced.service. ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paketlisten werden gelesen... Fertig&lt;br /&gt;
Abhängigkeitsbaum wird aufgebaut.       &lt;br /&gt;
Statusinformationen werden eingelesen.... Fertig&lt;br /&gt;
Abhängigkeiten werden korrigiert ... Fertig&lt;br /&gt;
Die folgenden zusätzlichen Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
Die folgenden NEUEN Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.&lt;br /&gt;
1 nicht vollständig installiert oder entfernt.&lt;br /&gt;
Es müssen 157 kB an Archiven heruntergeladen werden.&lt;br /&gt;
Nach dieser Operation werden 490 kB Plattenplatz zusätzlich benutzt.&lt;br /&gt;
Möchten Sie fortfahren? [J/n]&lt;br /&gt;
Holen: 1 http://archive.raspberrypi.org/debian/ jessie/main bluez-hcidump armhf 5.23-2+rpi2 [157 kB]&lt;br /&gt;
Es wurden 157 kB in 0 s geholt (921 kB/s).&lt;br /&gt;
Vormals nicht ausgewähltes Paket bluez-hcidump wird gewählt.&lt;br /&gt;
(Lese Datenbank ... 42033 Dateien und Verzeichnisse sind derzeit installiert.)&lt;br /&gt;
Vorbereitung zum Entpacken von .../bluez-hcidump_5.23-2+rpi2_armhf.deb ...&lt;br /&gt;
Entpacken von bluez-hcidump (5.23-2+rpi2) ...&lt;br /&gt;
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...&lt;br /&gt;
bluez-hcidump (5.23-2+rpi2) wird eingerichtet ...&lt;br /&gt;
lepresenced (0.82-1) wird eingerichtet ...&lt;br /&gt;
[ ok ] Starting lepresenced (via systemctl): lepresenced.service.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.Variante:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante wird das aktuellste lepresenced Skript aus github heruntergeladen. Das bedeutet, dass jegliche Konfiguration wie automatischer Start, Berechtigungen etc. &lt;br /&gt;
manuell konfiguriert werden muss. Diese Variante eignet sich nur für diejenigen, die keine .deb-Pakete installieren wollen/können oder die genau Wissen, was sie tun!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/PRESENCE/lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur &amp;quot;Installation&amp;quot; des Skripts folgendermaßen vorgehen:&lt;br /&gt;
Unter /fhem manuell den Ordner „script“ anlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir script&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Datei lepresenced reinkopieren und ausführbar machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod +x /opt/fhem/script/lepresenced&lt;br /&gt;
sudo chgrp -cR dialout lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Skript erstmalig starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt beim Starten des Skript eine Fehlermeldung, müssen die Abhängigkeiten aufgelöst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Can&#039;t locate Net/Server/Daemonize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 / usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /opt/fhem/lepresenced line 17.&lt;br /&gt;
BEGIN failed--compilation aborted at /opt/fhem/lepresenced line 17.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um die Abhängigkeiten aufzulösen muss folgendes nachinstalliert werden und anschließend ein Reboot durchgeführt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libnet-server-*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Einrichtung eines Bluetooth-Geräts über FHEM =====&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration eines BT-Geräts in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der zum Beispiel ein G-Tag dem FHEM-Server bekannt gemacht werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden&lt;br /&gt;
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist den angegeben Port zu unterscheiden. Für presenced muss der Port 5111 genommen werden, für lepresenced der Port 5333.&#039;&#039;&#039;&lt;br /&gt;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
Diese Variante sollte eingesetzt werden, wenn nur ein Pi nach Bluetooth-Geräten sucht. Möchte man mehr als ein Gerät nutzen um zum Beispiel eine größere Fläche abzudecken so muss mit collectored gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alle Räume gemeinsam ansprechen mittels collectord ===&lt;br /&gt;
Um zwei presenced- oder lepresenced Installationen zu verbinden wird der collectord Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Presence_Collectord_Uebersicht.jpg|200px|thumb|left|Schematische Darstellung Presence und Collectord, Danke an dtavb]]&lt;br /&gt;
Auf Basis folgender Skizze wird die Einrichtung und der Betrieb der Anwesenheitserkennung und Überwachung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mit dem PRESENCE-Modul sowie dem Skript (.deb-Paket) lepresenced beschrieben. Zusätzlich wird für die Verbindung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mehrere lepresenced Instanzen der collectord verwendet.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.&lt;br /&gt;
{{NeuerTextBlock}}&lt;br /&gt;
&lt;br /&gt;
==== Aufbau ====&lt;br /&gt;
; RPi1 (Hauptinstanz): &lt;br /&gt;
: FHEM Installation&lt;br /&gt;
: presence/lepresenced Installation &lt;br /&gt;
: collectord installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
; RPi2 (Zweitsystem): &lt;br /&gt;
: FHEM installation&lt;br /&gt;
: presence/lepresenced Installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Installation per .deb-Paket ====&lt;br /&gt;
collectord wird heruntergeladen und installiert:&lt;br /&gt;
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.8.deb (Stand Januar 2018)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i collectord-1.8.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord. Weitere Einstellungen können unter /etc/default/collectord vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration auf Shellebene ==== &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo vi /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datei muss jetzt nach folgender Vorlage angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# room definition&lt;br /&gt;
#[room-name]              # name of the room&lt;br /&gt;
#address=192.168.0.10     # ip-address or hostname&lt;br /&gt;
#port=5111                # tcp port which should be used (5111 is default)&lt;br /&gt;
#presence_timeout=120     # timeout in seconds for each check when devices are present&lt;br /&gt;
#absence_timeout=20       # timeout in secondsfor each check when devices are absent&lt;br /&gt;
&lt;br /&gt;
[RPi1] 			          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=127.0.0.1 	          # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&lt;br /&gt;
[RPi2]  		          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=192.168.178.127	          # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
* Es dürfen keine [Namen] mit Leerzeichen verwendet werden&lt;br /&gt;
* Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration in FHEM ==== &lt;br /&gt;
;RPi1&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60           &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222)&#039;&#039;&lt;br /&gt;
;RPi2&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60     &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222 - die IP-Adresse von die von RPi1)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration kann der Daemon gestartet werden.&lt;br /&gt;
Sobald das Bluetoothgerät irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort &lt;br /&gt;
an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading &amp;quot;rooms&amp;quot; des jeweiligen BT-Gerätes dargestellt.&lt;br /&gt;
&lt;br /&gt;
Zum testen sollte collectord einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectord prüfen kann, dieser steht in der Zeile &amp;lt;pre&amp;gt;created socket on 0.0.0.0 with port 5222&amp;lt;/pre&amp;gt; und man sehen kann, ob der collectord richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -vv -c /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Ausgabe sieht wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2017-04-02 17:52:55 - =================================================&lt;br /&gt;
2017-04-02 17:52:55 - started with PID 15554&lt;br /&gt;
2017-04-02 17:52:55 - reading configuration file&lt;br /&gt;
2017-04-02 17:52:55 - no config errors found&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5222&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656&lt;br /&gt;
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 2 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48662&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48664&lt;br /&gt;
2017-04-02 17:53:20 - created thread 3 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 4 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 5 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 6 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51638&lt;br /&gt;
2017-04-02 17:53:22 - created thread 7 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - created thread 8 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51640&lt;br /&gt;
2017-04-02 17:53:22 - created thread 9 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:23 - created thread 10 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:29 - new connection from 192.168.xxx.xxx:51642&lt;br /&gt;
2017-04-02 17:53:29 - created thread 11 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
2017-04-02 17:53:29 - created thread 12 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading &amp;quot;rooms&amp;quot; mit dem Wert der erkannten PRESENCE-Installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verhalten presence timeout im zusammenhang mit dem Attribut &amp;quot;absenceThreshold&amp;quot; der PRESENCE Konfiguration in FHEM&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der collectord.conf sind &amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt; für den jeweiligen Raum konfiguriert.&lt;br /&gt;
Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.&lt;br /&gt;
&lt;br /&gt;
In der PRESENCE-Definition kann man ebenfalls ein &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; setzen. Sobald sich der Zustand ändert, wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss. Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand. Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.&lt;br /&gt;
&lt;br /&gt;
Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Reading &amp;quot;room&amp;quot; bei einer PRESENCE Definition und der Zusammenhang zu collectord&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der collectord (ab Version 1.8) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das &amp;quot;room&amp;quot;-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.&lt;br /&gt;
&lt;br /&gt;
====  Automatischer Start ====&lt;br /&gt;
Wenn der collectord per .deb Paket installiert wurde, startet er automatisch bei einem Reboot mit (via systemd/init-Skript).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Collectord wird standardmäßig mit dem Port 5222 gestartet. Um diese anzupassen sind zwei Schritte notwendig:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;1.)&#039;&#039;&#039; Anpassen der /usr/bin/collectord &lt;br /&gt;
    Hier bitte den Parameter my $opt_p von 5222 auf 5XXX abändern.&lt;br /&gt;
&lt;br /&gt;
Da der collectord mittlerweile per systemd beim reboot des RPi gestarte wird muss auch diese Konfiguration auf den neuen Port angepasst werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2.)&#039;&#039;&#039; Anpassen der /etc/default/collectord&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# collectord startup defaults:&lt;br /&gt;
# The TCP port collectord will listen for incoming connections (default: 5222)&lt;br /&gt;
PORT=5111&lt;br /&gt;
# The location of the configuration file (default: /etc/collectord.conf&lt;br /&gt;
CFGFILE=/etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manuell starten als Daemon (Parameter &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;) mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batterieüberwachung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung mit dem Modul BleTagBattery ===&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=74_BleTagBattery&lt;br /&gt;
|ModOwner=mumpitzstuff&lt;br /&gt;
}}&lt;br /&gt;
Mit dem Modul BleTagBattery - können die Batteriestati aller BT-LE Devices gelesen werden.&lt;br /&gt;
Es wird das batteryLevel und battery angelegt welches als BT-LE Tags an einer PRESENCE-Installation registriert wurden.&lt;br /&gt;
&lt;br /&gt;
Vorraussetzung und Installation:&lt;br /&gt;
&lt;br /&gt;
Bluez und Gattool&lt;br /&gt;
 sudo apt-get install bluez&lt;br /&gt;
&lt;br /&gt;
Das Gattool ist in den Installationen von Bluez inbegriffen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinzufügen des githup für das Modul&lt;br /&gt;
 update add http://raw.githubusercontent.com/mumpitzstuff/fhem-BleTagBattery/master/controls_bletagbattery.txt&lt;br /&gt;
 update all&lt;br /&gt;
 restart fhem: shutdown restart&lt;br /&gt;
 BT-LE tags muss an einer PRESENCE-Installation des type &amp;quot;lan-bluetooth&amp;quot; registriert sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart von FHEM kann das Modul definiert werden:&lt;br /&gt;
 define a new device: define &amp;lt;name of device&amp;gt; BleTagBattery&lt;br /&gt;
&lt;br /&gt;
Das Modul versucht in der Standardkonfiguration alle 6 Stunden die BT-LE Devices zu erreichen und das Reading batteryLevel und battery zu aktualisieren.&lt;br /&gt;
Das Update kann auch manuell mit dem folgenden Befehl erzwungen werden&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;name of device&amp;gt; statusRequest.&lt;br /&gt;
&lt;br /&gt;
Weiter Informationen und Disskussionen können dem eigentlichen [https://forum.fhem.de/index.php?topic=68104.0 Forumsbeitrag] entnommen werden,&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (aktuell nur G-Tags) ===&lt;br /&gt;
&lt;br /&gt;
Leider überträgt der G-Tag nach der Einrichtung als Device in FHEM kein Reading mit seinem aktuellen Batteriestatus.&lt;br /&gt;
Dem wurde mit Hilfe des Forum Abhilfe geschaffen.&lt;br /&gt;
Im Folgenden wird erläutert wie die Batterieüberwachung eingerichtet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
bc - Basiscalculator [https://packages.debian.org/de/sid/bc Bc-Paket]&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install bc &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen eines Shellskript auf dem Raspberry System. &lt;br /&gt;
Die Parameter &amp;lt;&amp;lt;MAC-Adresse&amp;gt;&amp;gt; und &amp;lt;&amp;lt;TagName&amp;gt;&amp;gt; müssen durch die Werte des auszulesenden G-Tags ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
stringZ=$(sudo gatttool -b 5C:2B:80:C1:14:41 --char-read --handle=0x001b)&lt;br /&gt;
stringZ=${stringZ:33:2}&lt;br /&gt;
stringZ=$(echo &amp;quot;$stringZ&amp;quot; | tr a-f A-F)&lt;br /&gt;
decimal=$(echo &amp;quot;ibase=16; $stringZ&amp;quot; | bc)&lt;br /&gt;
perl /opt/fhem/fhem.pl 7072 &amp;quot;setreading MeinGtag Batterie $decimal&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dem Device in FHEM (hier MeinGtag) ein userReading mit dem Namen &#039;&#039;&#039;Batterie&#039;&#039;&#039; hinzufügen.&lt;br /&gt;
Das Shellskript mit folgendem Befehl starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./GtagBatterie.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist hierbei,&#039;&#039;&#039; dass Skript mit &amp;quot;./&amp;quot; und nicht mit &amp;quot;sh&amp;quot; aufzurufen. Beim Aufruf mit &amp;quot;sh GtagBatterie.sh&amp;quot; produziert es einen Fehler&lt;br /&gt;
&amp;lt;pre&amp;gt;GtagBatterie.sh: 3: GtagBatterie.sh: Bad substitution &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Reading wird auf den ausgelesenen Wert der Batterie gesetzt. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Es sollte für jeden G-Tag ein eigenes Skript abgelegt werden. Das Skript kann per crontab oder fhem Kommando (system) regelmäßig aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (alle Devices vom Typ &amp;quot;MODE=lan-bluetooth&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
Es gibt eine weitere Möglichkeit um den Batteriestatus von LE Devices abzurufen und in FHEM als Reading darzustellen.&lt;br /&gt;
Dabei wird der Batteriezustand für alle LE Devices, die bereits in FHEM konfiguriert sind und per lepresenced überwacht werden, automatisch in einem shell-Script ermittelt.&lt;br /&gt;
Näheres dazu im Forumartikel {{Link2Forum|Topic=56960|LinkText=Erweiterung: Anwesenheitserkennung/Batterieüberwachung}}.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Automatische Ermittlung aller in FHEM konfigurierten LE Devices&lt;br /&gt;
* Möglichkeit, diese Devices alternativ manuell im Script einzutragen&lt;br /&gt;
* Es werden nur Devices abgefragt, die im Status &amp;quot;present&amp;quot; sind, also mit ziemlicher Sicherheit auch verfügbar sind&lt;br /&gt;
* Ein eventuell auf dem FHEM telnet-Port gesetztes Passwort kann im Script hinterlegt werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionierendes lepresenced&#039;&#039;&#039; - siehe [[Anwesenheitserkennung#Anleitung_f.C3.BCr_ein_LE_Device_.28z.B._Gtags.2CPebbles_etc..29|Anleitung für ein LE Device (z.B. Gtags,Pebbles etc.)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;socat&#039;&#039;&#039; - TCP port forwarder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install socat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gawk&#039;&#039;&#039; - Zum extrahieren der Daten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install gawk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gatttool&#039;&#039;&#039; - Bestandteil von bluez &lt;br /&gt;
&lt;br /&gt;
gatttool ist auf den meisten Distributionen im bluez-Paket, allerdings nicht bei Opensuse. Dort muss man das Sourcepaket von bluez installieren und selbst kompilieren.&lt;br /&gt;
gatttool sollte dann nach /usr/bin oder /usr/local/bin kopiert werden,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den notwendigen Erweiterungen werden für die Ausführung von gatttool &#039;&#039;&#039;Root-Rechte benötigt&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Das Script selbst gibt es hier: [https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery lebattery]&lt;br /&gt;
&lt;br /&gt;
Am Besten unter /opt/fhem/script/lebattery speichern und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo su -&lt;br /&gt;
mkdir /opt/fhem/script&lt;br /&gt;
cd /opt/fhem/script&lt;br /&gt;
wget https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery&lt;br /&gt;
chmod 755 lebattery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Bedarf können im Script noch die folgenden 3 Parameter angepasst werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# If allowed_telnetPort is protected by a password, add the password here&lt;br /&gt;
TELNETPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
# Attribute for batterylevel in FHEM&lt;br /&gt;
ATTRIBUT=&amp;quot;batterylevel&amp;quot;&lt;br /&gt;
# Use this, if you dont want the script to determine the tags on its own&lt;br /&gt;
LETAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript wird dann unter root folgendermaßen gestartet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/fhem/script/lebattery -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe des Skripts, wenn es mit dem Verbose Parameter -v gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Beide Devices sind vom Typ NUT mini, das Device mit dem FHEM-Namen &#039;&#039;&#039;nut_Micky&#039;&#039;&#039; ist im Status &#039;&#039;&#039;absent&#039;&#039;&#039;. Das zweite Device ist im Status &#039;&#039;&#039;present&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Determining address for nut_Micky ...&lt;br /&gt;
nut_Micky is in state absent, no further action required&lt;br /&gt;
&lt;br /&gt;
Determining address for nut_Test ...&lt;br /&gt;
Fetching batterylevel for nut_Test (F3:44:04:81:54:89) ...&lt;br /&gt;
Setting batterylevel for nut_Test to 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mein crontab-Eintrag (User root) sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3 3  * * * /opt/fhem/script/lebattery -v &amp;gt;/opt/fhem/script/lebattery.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird jeden Morgen um 3 Minuten nach 3 Uhr der Zustand der Batterien aller Devices ermittelt und in FHEM abgespeichert.&amp;lt;br&amp;gt; &lt;br /&gt;
Bevor man das mit crontab macht, sollte man allerdings zunächst sicher stellen, dass es auch ohne crontab funktioniert....&lt;br /&gt;
&lt;br /&gt;
Bei Problemen kann man auch erstmal schauen, ob das mit dem gattool überhaupt funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gatttool -t &amp;lt;Typ&amp;gt; -b &amp;lt;MAC-Adresse&amp;gt; --char-read --uuid 0x2a19&lt;br /&gt;
&lt;br /&gt;
handle: 0x0017 	 value: 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In diesem Fall hat die Batterie noch 100% (hex 64).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Typ ist abhängig vom Hersteller und kann public (G-Tags) bzw. random (Nut) sein. Im Zweifelsfall beides ausprobieren.&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
==  Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags ==&lt;br /&gt;
Ein Skript zur Nutzung der Gigaset G-TAGs zur Alarmierung bei öffnen und schließen von Türen und zur Anwesenheitserkennung, um die Alarmierung zu aktivieren bzw. deaktivieren. &lt;br /&gt;
Es kann verwendet werden um die Anwesenheit von mehrern Personen im Haushalt zu erkennen. Dabei wird eingeschränkt, dass nur bestimmte Personen die Alarmierung aktivieren können ( Eltern/Kind -Beziehung ).&lt;br /&gt;
Des Weiteren werden im Beispiel die Eltern benachrichtigt wenn eins der Kinder das Haus verlässt und die Eltern nicht anwesend sind.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Namen der G-Tags in den Skripten bitte anpassen!}}&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;Notify&#039;&#039; und die &#039;&#039;RESIDENTS-Erweiterung&#039;&#039; wird ein Dummy benötigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm dummy&lt;br /&gt;
attr Alarm devStateIcon aktiv:secur_locked@red inaktiv:secur_open@lightgreen&lt;br /&gt;
attr Alarm eventMap on:aktiv off:inaktiv&lt;br /&gt;
attr Alarm setList on off&lt;br /&gt;
attr Alarm webCmd aktiv:inaktiv&lt;br /&gt;
attr Alarm room Alarm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtag.*.presence:.* {Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code für die 99_myUtils.pm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### GTAG ANWESENHEITS CHECK&lt;br /&gt;
sub Anwesenheit_check($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
&lt;br /&gt;
# gtag_rot	-	Alias Marco&lt;br /&gt;
# gtag_schwarz	-	Alias Ulli&lt;br /&gt;
# gtag_gruen	-	Alias Frida&lt;br /&gt;
# gtag_orange	-	Alias Hannah&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Alle GTAGs sind Standardmäßig Residents Roommate&lt;br /&gt;
# $RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur Gäste (Roomguest) Auskommentiert, da ich es so nicht brauche&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$NAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
my $ALIASNAME = AttrVal($ROOMMATE,&#039;alias&#039;,$ROOMMATE); # ALIAS des Roommates auslesen&lt;br /&gt;
&lt;br /&gt;
my $GTAG1 = Value(&#039;gtag_rot&#039;); # ELTERN&lt;br /&gt;
my $GTAG2 = Value(&#039;gtag_schwarz&#039;); # ELTERN&lt;br /&gt;
&lt;br /&gt;
my $STATUS = &amp;quot;wahrscheinlich gerade los&amp;quot;;&lt;br /&gt;
$STATUS = &amp;quot;anwesend&amp;quot; if ($EVENT eq &amp;quot;present&amp;quot;); # Status: anwesend&lt;br /&gt;
$STATUS = &amp;quot;unterwegs&amp;quot; if ($EVENT eq &amp;quot;absent&amp;quot;); # Status: unterwegs&lt;br /&gt;
&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME ist $STATUS.&amp;quot;; # LOG Eintrag erzeugen&lt;br /&gt;
&lt;br /&gt;
if (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME ist da...&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME ist da...&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_rot&amp;quot; xor $NAME eq &amp;quot;gtag_schwarz&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG INAKTIV: $ALIASNAME ist da...; set Alarm inaktiv&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG INAKTIV&#039; &#039;$ALIASNAME ist da...&#039;; set Alarm inaktiv&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039;&amp;quot;); # Pushover&lt;br /&gt;
 } 		&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;inaktiv&amp;quot;) &amp;amp;&amp;amp; ($GTAG1 eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; $GTAG2 eq &amp;quot;absent&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set Alarm aktiv; set teleBot send ALARMIERUNG AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Alarm aktiv; set Infopush msg &#039;ALARMIERUNG AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039; &#039;&#039; 0 &#039;&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Integration des RESIDENTS-MODUL ===&lt;br /&gt;
&lt;br /&gt;
Der hier beschriebene Code erweitert die Funktionen unter dem Punkt 5.93.&lt;br /&gt;
Das Notify muss daher mit der folgenden Zeile erweitert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_AnwesenheitCheck notify gtag.*.presence:.* { Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;), Anwesenheit_check_resi(&amp;quot;$NAME&amp;quot;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die RESIDENTS Funktion nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### RESIDENTS&lt;br /&gt;
sub Anwesenheit_check_resi($) {&lt;br /&gt;
my ($NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME); # ALIASNAME des GTAGs auslesen&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Als Standard sind alle GTAGs Roommates&lt;br /&gt;
$RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur GTAG Namen der Gäste (Roomguest)&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$ALIASNAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
&lt;br /&gt;
if (ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;absent&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE absent&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
 elsif(ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;present&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE home&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Fenster/Tür. -Kontakt Überwachung ===&lt;br /&gt;
&lt;br /&gt;
Erweiterung für die Überwachung von  Fenster/Tür. -Kontakten. Dazu sind zwei weitere Notifys notwendig die auf die Trigger der Kontakte regagieren&lt;br /&gt;
und so eine weitere Funktion in der 99_myUtils.pm ansprechen. Die Notifys triggern auf Kontakte die mit dem Namen Kontakt* beginnen.&lt;br /&gt;
Sollten die eigenen Fenster/Tür. -Kontakt anderen Namen besitzen, müssen die Skripte dementsprechend angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Kontaktmeldung notify Kontakt.*:contact:.* {Kontakt_Meldung(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Sabotagealarm notify Kontakt.*.sabotageError:.on {Kontakt_Sabotage(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die TÜRKONTAKTE-Meldung nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### TÜRKONTAKTE-Meldung/Zustand&lt;br /&gt;
sub Kontakt_Meldung($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME wurde $EVENT&amp;quot;;&lt;br /&gt;
if (ReadingsVal(&amp;quot;Alarm&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;on&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
fhem(&amp;quot;set teleBot send $ALIASNAME wurde $EVENT&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;$ALIASNAME&#039; &#039;$ALIASNAME wurde $EVENT&#039;&amp;quot;); # Nachricht über Pushover&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### TÜRKONTAKTE-Sabotagealarm&lt;br /&gt;
&lt;br /&gt;
sub Kontakt_Sabotage($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME meldet Sabotagealarm&amp;quot;;&lt;br /&gt;
fhem(&amp;quot;set teleBot send Alarm: $ALIASNAME meldet Sabotagealarm&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;Alarmanlage&#039; &#039;$ALIASNAME meldet Sabotagealarm&#039; &#039;&#039; 2 &#039; &#039; 60 600 &amp;quot;); # Nachricht über Pushover&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zur Benutzung / Fehlerhandling ===&lt;br /&gt;
&lt;br /&gt;
Der Alarm dummy hat den Zustand on:off.  Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert.&lt;br /&gt;
Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden.&lt;br /&gt;
Die Benachrichtigung kann aktuell per &#039;&#039;Telegram&#039;&#039; sowie &#039;&#039;Pushover&#039;&#039; (&#039;&#039;&#039;Achtung mit zweiterem sind Abokosten verbunden!&#039;&#039;&#039;) realisiert werden.&lt;br /&gt;
Diskussion zum Thema im Forum unter: {{Link2Forum|Topic=64080}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Problemlösungen =&lt;br /&gt;
Falls es &#039;&#039;&#039;Probleme beim Starten des Skripts&#039;&#039;&#039; gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | grep lepresenced&lt;br /&gt;
sudo kill &amp;lt;pid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debuglevel lepresenced setzen:&lt;br /&gt;
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}&lt;br /&gt;
&lt;br /&gt;
Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, dass Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden sind durch den nötigen LOG-Eintrag ersetzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur das wichtigste Loggen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_WARNING&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Keinerlei LOG-Einträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_EMERG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;Problemen mit der Batterieüberwachung&#039;&#039;&#039; der Tags kann die Pi Firmeware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden.&lt;br /&gt;
Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:&lt;br /&gt;
&amp;lt;pre&amp;gt;connect: Connection refused (111)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo rpi-update 8521fd34c8f66b6d109acce943f6e25ec93ec005&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehr dazu unter: {{Link2Forum|Topic=56960|Message=589165}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das BT-Device ist ständig &amp;quot;absent&amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Mögliche Lösung kann sein, dass Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivität.&lt;br /&gt;
Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install bluez-hcidump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehler in Logdateien /var/log/syslog und /var/log/kernel&#039;&#039;&#039;&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634211] bt_err_ratelimited: 1 callbacks suppressed&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634231] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:12 raspberrypi kernel: [ 4906.647350] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.532081] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.655564] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene log&#039;s geschrieben. Darunter maßgeblich &amp;quot;syslog&amp;quot; und &amp;quot;kern.log&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend)&lt;br /&gt;
Unterbinden der Einträge durch Anlage eines blocklist Eintrag:&lt;br /&gt;
&lt;br /&gt;
 1. Unter &amp;quot;/etc/rsyslog.d&amp;quot; eine Datei erzeugen mit dem Namen &amp;quot;01-blocklist.conf&amp;quot;&lt;br /&gt;
 2. Inhalt: (Die Ausdrücke in den &amp;quot;&amp;quot; sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die unten stehenden&amp;quot;)&lt;br /&gt;
    :msg,contains,&amp;quot;Bluetooth: hci0 advertising data length corrected&amp;quot; stop&lt;br /&gt;
    :msg,contains,&amp;quot;bt_err_ratelimited:&amp;quot; stop&lt;br /&gt;
 3. Dienst neu starten &amp;quot;sudo service rsyslog restart&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Weiter Infos werden im offiziellen Thema {{Link2Forum|Topic=28753|Message=499184|LinkText=hier}} diskutiert.&lt;br /&gt;
&lt;br /&gt;
Seit Version 0.82 kann es beim Start zu folgenden Meldungen im Log kommen. &lt;br /&gt;
 Sep 06 16:13:45 raspberrypi systemd[1]: Started lepresenced.&lt;br /&gt;
 Sep 06 16:13:45 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: Received &#039;Set scan parameters failed: Input/output error&#039;, ...tting...&lt;br /&gt;
 Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...&lt;br /&gt;
&lt;br /&gt;
Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst indem es sich resettet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moderne iPhones und Android Geräte wechseln zum &amp;quot;deep standby&amp;quot; Modus&#039;&#039;&#039;, und werden dann als &amp;quot;abwesend&amp;quot; gemeldet.&lt;br /&gt;
Mittels einer Funktion, die via hping3 Packete an den Geräte senden, um die &amp;quot;wach&amp;quot; zu halten, und dann die MacAdresse ausliest, kann man dieses Problem umgehen. Mehr im Forum [https://forum.fhem.de/index.php/topic,76342.0.html]&lt;br /&gt;
&lt;br /&gt;
= Versionsänderungen lepresenced =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--Version 0.81 (BasisVersion)&lt;br /&gt;
--Version 0.82 (stable  08/2017)&lt;br /&gt;
  -Neue Kommandozeilenoption &amp;quot;--debug&amp;quot;: Startet lepresenced im Vordergrund und gibt ausführliche Debug-Informationen auf STDOUT aus.&lt;br /&gt;
  -Sanity Check: lepresenced prüft beim Starten die Verfügbarkeit von hciconfig, hcitool und hcidump.&lt;br /&gt;
  -Model: lepresenced übermittelt das Reading model nun als lan-lepresenced. Das erlaubt die Erkennung von lepresenced in der FHEM-Statistik (sofern aktiviert).&lt;br /&gt;
--Version 0.83 (stable  09/2017)&lt;br /&gt;
  - Behebung von Systemstart Fehlern&lt;br /&gt;
  - Weitere Debug-Möglichkeiten. U. a. wird nun mitgezählt, ob hcitool lescan (&amp;quot;legacy&amp;quot;) und hcidump eine identische Zahl an Beacons empfangen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ansprechpartner =&lt;br /&gt;
# {{Link2FU|117|markusbloch }} (Markus) für das PRESENCE-Modul und collectord&lt;br /&gt;
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced &lt;br /&gt;
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27283</id>
		<title>PRESENCE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=PRESENCE&amp;diff=27283"/>
		<updated>2018-06-29T12:50:31Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* BT Dongle am PI installieren */ Tippfehler in der Überschrift korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=73_PRESENCE.pm&lt;br /&gt;
|ModOwner=markusbloch&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lan-ping&#039;&#039;&#039; - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.&lt;br /&gt;
* &#039;&#039;&#039;fritzbox&#039;&#039;&#039; - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)&lt;br /&gt;
* &#039;&#039;&#039; Bluetooth&#039;&#039;&#039;&lt;br /&gt;
:- &#039;&#039;&#039;local-bluetooth&#039;&#039;&#039; - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)&lt;br /&gt;
:- &#039;&#039;&#039;lan-bluetooth&#039;&#039;&#039;   - Das Überwachen von Bluetoothgeräten, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. [[:Kategorie:Raspberry Pi|Raspberry Pi]]) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.&lt;br /&gt;
* &#039;&#039;&#039;function&#039;&#039;&#039; - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)&lt;br /&gt;
* &#039;&#039;&#039;shell-script&#039;&#039;&#039; - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Ping im WLAN/LAN =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die IP-Addresse 192.168.0.30 alle 30&amp;amp;nbsp;Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status &amp;quot;present&amp;quot; (anwesend), ansonsten &amp;quot;absent&amp;quot; (abwesend).&lt;br /&gt;
&lt;br /&gt;
Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30 &#039;&#039;&#039;60&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun würde das Handy alle 60 Sekunden geprüft werden.&lt;br /&gt;
&lt;br /&gt;
Nur wenn bei einem iPhone/iPad die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.&lt;br /&gt;
&lt;br /&gt;
Sollte die Fehlermeldung &lt;br /&gt;
:&amp;lt;code&amp;gt; PRESENCE (Handy) - ping command returned with output: ping: icmp open socket: Operation not permitted &amp;lt;/code&amp;gt; &lt;br /&gt;
im Log auftauchen und lan-ping dadurch nicht funktionieren, liegt ein Berechtigungsproblem vor. Kein Grund den User fhem zu root zu machen!&lt;br /&gt;
Prüfe zu erst als User root ob die Capabilities gesetzt sind.&lt;br /&gt;
:&amp;lt;code&amp;gt;getcap /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Sollte folgendes Ergeben zu Tage fördern.&lt;br /&gt;
:&amp;lt;code&amp;gt;/bin/ping = cap_net_raw+ep&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist dem nicht so, setzen wir die benötigten Capabilities&lt;br /&gt;
:&amp;lt;code&amp;gt;setcap cap_net_raw+ep /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Mehr Informationen zum Thema Capabilities [https://manpages.debian.org/jessie/manpages-de/capabilities.7.de.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl =&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.&lt;br /&gt;
&lt;br /&gt;
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt &amp;quot;Heimnetz&amp;quot; auftaucht. &lt;br /&gt;
&lt;br /&gt;
Die erforderliche Definition:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE fritzbox iPhone-4S&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachung mittels Perl-Code =&lt;br /&gt;
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; PRESENCE function {...} [ &amp;lt;check-interval&amp;gt; [ &amp;lt;present-check-interval&amp;gt; ] ]&lt;br /&gt;
&lt;br /&gt;
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.&lt;br /&gt;
&lt;br /&gt;
== Beispiel DHCP Überwachung auf Airport Basestation ==&lt;br /&gt;
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.&lt;br /&gt;
&lt;br /&gt;
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z.&amp;amp;nbsp;B. mit: &amp;lt;code&amp;gt;cpan install use Net::SNMP&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zuerst ist folgender Code in 99_myUtils.pm einzufügen, sollte diese noch nicht vorhanden sein muss diese aus dem Template welches unter Edit Files zu finden ist erzeugt werden.&lt;br /&gt;
&#039;&#039;&#039;Achtung, das ist nicht der komplette Inhalt der 99_myUtils!&#039;&#039;&#039; Das ist nur die einzelne Routine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::SNMP;&lt;br /&gt;
sub&lt;br /&gt;
snmpCheck($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($airport,$client)= @_;&lt;br /&gt;
&lt;br /&gt;
  my $community = &amp;quot;public&amp;quot;;&lt;br /&gt;
  my $host = $airport;&lt;br /&gt;
  my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2&amp;quot;;&lt;br /&gt;
  #my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2.25.1.10.0.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my ( $session, $error ) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
    -hostname =&amp;gt; $host,&lt;br /&gt;
    -community =&amp;gt; $community,&lt;br /&gt;
    -port =&amp;gt; 161,&lt;br /&gt;
    -version =&amp;gt; 1&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if( !defined($session) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
    return &amp;quot;Can&#039;t connect to host $host.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  my @snmpoids = ();&lt;br /&gt;
&lt;br /&gt;
  my $response = $session-&amp;gt;get_next_request($oid);&lt;br /&gt;
  my @nextid = keys %$response;&lt;br /&gt;
  while ( @nextid &amp;amp;&amp;amp; $nextid[0] &amp;amp;&amp;amp; $nextid[0] =~ m/^$oid/ ) {&lt;br /&gt;
    push( @snmpoids, $nextid[0] );&lt;br /&gt;
&lt;br /&gt;
    $response = $session-&amp;gt;get_next_request( $nextid[0] );&lt;br /&gt;
    @nextid = keys %$response;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if( !defined($response = $session-&amp;gt;get_request( @snmpoids ) ) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  foreach my $value (values %$response) {&lt;br /&gt;
    return 1 if( $value eq $client )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich das Mobilgerät so überwachen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define iPhone PRESENCE function {snmpCheck(&amp;quot;10.0.1.1&amp;quot;,&amp;quot;0x44d77429f35c&amp;quot;)} 30 30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwesenheitserkennung mittels UniFi Controller ==&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung bei Geräten in Verbindung mit UniFi-Produkten funktioniert selbst dann, wenn sich die Geräte im PowerSave-Modus befinden. &lt;br /&gt;
&lt;br /&gt;
Beachte: Die Geräte werden erst ungefähr nach 5 Minuten, nachdem das Gerät das WLAN verlassen hat als disconnected angezeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE function {ReadingsVal(&amp;quot;&amp;lt;UniFi&amp;gt;&amp;quot;,&amp;quot;&amp;lt;NamedDevice&amp;gt;&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;connected&amp;quot; ? 1:0}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Events =&lt;br /&gt;
Der Vorteil gegenüber der Function-Variante ist, dass diese Variante ohne Blocking.pm-Overhead direkt ausgeführt werden kann und in &amp;quot;Echtzeit&amp;quot; abläuft (siehe {{Link2Forum|Topic=40287|Message=562823}}).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Überwachen mittels Bluetooth =&lt;br /&gt;
== Vorbereitung und Informationen ==&lt;br /&gt;
=== Getestete Hardware/Software ===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie (interner BT-Controller)&lt;br /&gt;
* &#039;&#039;&#039;BT-Dongle&#039;&#039;&#039; - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano &amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt &#039;&#039;LowEnergy&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;BT-TAG&#039;&#039;&#039; - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo&lt;br /&gt;
&lt;br /&gt;
=== BT Dongle am PI installieren ===&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am RaspberryPI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debian nachinstalliert werden.&lt;br /&gt;
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install bluetooth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach erfolgreicher Installation der Pakete sollte der RaspberryPI neu gestartet werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Reboot bitte das Log des RaspberryPI auf folgende Einträge prüfen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773748] NET: Registered protocol family 31&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773765] Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773797] Bluetooth: HCI socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773821] Bluetooth: L2CAP socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773890] Bluetooth: SCO socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.797531] usbcore: registered new interface driver btusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sobald der BT-Dongle erkannt wurde &#039;&#039;leuchtet&#039;&#039; (wenn vorhanden) auch die &#039;&#039;blaue/gelbe&#039;&#039; LED am Dongle auf.&lt;br /&gt;
&lt;br /&gt;
=== BT-Tags aktivieren ===&lt;br /&gt;
Jetzt kann der BT-Tag aktiviert werden. Bei einigen Tags muss dafür die &#039;&#039;&#039;Batteriesicherung&#039;&#039;&#039; gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Einen Tag wird mit folgendem Befehl auf der Konsole gesucht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hcitool lescan&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
LE Scan ...&lt;br /&gt;
7C:2F:80:A1:XA:XD (unknown)&lt;br /&gt;
7C:2F:80:A1:XA:XD Gigaset G-tag&lt;br /&gt;
7C:2F:80:A1:X4:X1 (unknown)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Übersicht über die möglichen Befehle von hcitool gibt es mit der Eingabe von:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo hcitool&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
hcitool - HCI Tool ver 5.23&lt;br /&gt;
Usage:&lt;br /&gt;
        hcitool [options] &amp;lt;command&amp;gt; [command parameters]&lt;br /&gt;
Options:&lt;br /&gt;
        --help  Display help&lt;br /&gt;
        -i dev  HCI device&lt;br /&gt;
Commands:&lt;br /&gt;
        dev     Display local devices&lt;br /&gt;
        inq     Inquire remote devices&lt;br /&gt;
        scan    Scan for remote devices&lt;br /&gt;
        name    Get name from remote device&lt;br /&gt;
        info    Get information from remote device&lt;br /&gt;
        spinq   Start periodic inquiry&lt;br /&gt;
        epinq   Exit periodic inquiry&lt;br /&gt;
        cmd     Submit arbitrary HCI commands&lt;br /&gt;
        con     Display active connections&lt;br /&gt;
        cc      Create connection to remote device&lt;br /&gt;
        dc      Disconnect from remote device&lt;br /&gt;
        sr      Switch master/slave role&lt;br /&gt;
        cpt     Change connection packet type&lt;br /&gt;
        rssi    Display connection RSSI&lt;br /&gt;
        lq      Display link quality&lt;br /&gt;
        tpl     Display transmit power level&lt;br /&gt;
        afh     Display AFH channel map&lt;br /&gt;
        lp      Set/display link policy settings&lt;br /&gt;
        lst     Set/display link supervision timeout&lt;br /&gt;
        auth    Request authentication&lt;br /&gt;
        enc     Set connection encryption&lt;br /&gt;
        key     Change connection link key&lt;br /&gt;
        clkoff  Read clock offset&lt;br /&gt;
        clock   Read local or remote clock&lt;br /&gt;
        lescan  Start LE scan&lt;br /&gt;
        lewladd Add device to LE White List&lt;br /&gt;
        lewlrm  Remove device from LE White List&lt;br /&gt;
        lewlsz  Read size of LE White List&lt;br /&gt;
        lewlclr Clear LE White list&lt;br /&gt;
        lecc    Create a LE Connection&lt;br /&gt;
        ledc    Disconnect a LE Connection&lt;br /&gt;
        lecup   LE Connection Update &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls beim SCAN kein Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des PI notwendig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hciconfig hci0 down&lt;br /&gt;
sudo hciconfig hci0 up&lt;br /&gt;
sudo hcitool dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch den FHEM Server direkt ==&lt;br /&gt;
[[Datei:Bluetooth-Adresse-iPhone.png|thumb|Bluetooth-Adresse eines iPhones]]&lt;br /&gt;
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.&lt;br /&gt;
&lt;br /&gt;
Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.&lt;br /&gt;
&lt;br /&gt;
Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der [[Konfiguration]] benötigt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord) ==&lt;br /&gt;
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]&lt;br /&gt;
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.&lt;br /&gt;
&lt;br /&gt;
Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Programm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Unterschied presenced / lepresenced / collectord ===&lt;br /&gt;
presenced und lepresenced sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced und lepresenced ist, dass lepresenced insbesondere für [https://de.wikipedia.org/wiki/Bluetooth_Low_Energy Bluetooth-LE-Devices] ist und presenced für &amp;quot;normale&amp;quot; Bluetooth-Geräte. &lt;br /&gt;
&lt;br /&gt;
collectord wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben. Sofern alle Räume einen Empfangspegel (RSSI) ermitteln können, wird bei mehreren anwesenden Räumen der Raum mit dem besten Empfangspegel selektiert (siehe {{Link2Forum|Topic=54482}}).&lt;br /&gt;
&lt;br /&gt;
=== Installation von (le)presenced ===&lt;br /&gt;
Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritte gehen jedoch auch mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket.&lt;br /&gt;
Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeitshalber wird sie aber aufgeführt.&lt;br /&gt;
&lt;br /&gt;
===== Installation per .deb-Paket =====&lt;br /&gt;
&lt;br /&gt;
Die bevorzugte Variante ist die Installation von lepresenced durch die passenden .deb Pakete.&lt;br /&gt;
{{Randnotiz|RNText=Bei einem Upgrade einer älteren Version reicht es, das neue .deb Paket mit&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo dpkg -i lepresenced-X.XX-X.deb&amp;lt;/code&amp;gt;&lt;br /&gt;
zu aktualisieren}} &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.Variante:&#039;&#039;&#039;&lt;br /&gt;
Herunterladen der aktuellen lepresenced-0.83-3.deb (Stand August 2017) Datei über den Webbrowser &lt;br /&gt;
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/ SVN-Repository]. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Download in other formats:&lt;br /&gt;
    Original Format &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
anklicken und die Datei herunterladen.&lt;br /&gt;
Die Datei kann jetzt auf den RPi kopiert und mit folgenden Befehlen ausgeführt werden (ggf. Berechtigungen anpassen). &lt;br /&gt;
&lt;br /&gt;
Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)&lt;br /&gt;
 https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.Variante:&#039;&#039;&#039; (zu Verwenden, wenn es Probleme bei Variante 1 gibt)&lt;br /&gt;
Herunterladen aus dem fhem contrib Verzeichnis:&lt;br /&gt;
Hierzu muss das contrib auf dem aktuellen Stand sein. Dazu wird die Installation von subversion (normal bereits vorhanden) benötigt.&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install subversion&lt;br /&gt;
&lt;br /&gt;
Danach kann per &lt;br /&gt;
 sudo svn checkout https://svn.fhem.de/fhem/trunk/fhem/contrib svnrepo&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Repository auf den Pi heruntergeladen werden. Danach sollte im gewählten Verzeichnis die eingecheckten Dateien verfügbar sein.&lt;br /&gt;
 /opt/fhem/svnrepo/PRESENCE/deb  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Installation der Variante 1 oder 2 &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Egal welche Variante gewählt wurde, nun kann mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;: Das &#039;&#039;&#039;Paket&#039;&#039;&#039; hat eine ca. Größe von &#039;&#039;&#039;6,5Kb&#039;&#039;&#039;. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird.&lt;br /&gt;
Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich &amp;quot;Download in other formats&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i lepresenced-0.83-3.deb&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get -f install&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Installation sollte am Ende ein [ ok ] Starting lepresenced (via systemctl): lepresenced.service. ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paketlisten werden gelesen... Fertig&lt;br /&gt;
Abhängigkeitsbaum wird aufgebaut.       &lt;br /&gt;
Statusinformationen werden eingelesen.... Fertig&lt;br /&gt;
Abhängigkeiten werden korrigiert ... Fertig&lt;br /&gt;
Die folgenden zusätzlichen Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
Die folgenden NEUEN Pakete werden installiert:&lt;br /&gt;
  bluez-hcidump&lt;br /&gt;
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.&lt;br /&gt;
1 nicht vollständig installiert oder entfernt.&lt;br /&gt;
Es müssen 157 kB an Archiven heruntergeladen werden.&lt;br /&gt;
Nach dieser Operation werden 490 kB Plattenplatz zusätzlich benutzt.&lt;br /&gt;
Möchten Sie fortfahren? [J/n]&lt;br /&gt;
Holen: 1 http://archive.raspberrypi.org/debian/ jessie/main bluez-hcidump armhf 5.23-2+rpi2 [157 kB]&lt;br /&gt;
Es wurden 157 kB in 0 s geholt (921 kB/s).&lt;br /&gt;
Vormals nicht ausgewähltes Paket bluez-hcidump wird gewählt.&lt;br /&gt;
(Lese Datenbank ... 42033 Dateien und Verzeichnisse sind derzeit installiert.)&lt;br /&gt;
Vorbereitung zum Entpacken von .../bluez-hcidump_5.23-2+rpi2_armhf.deb ...&lt;br /&gt;
Entpacken von bluez-hcidump (5.23-2+rpi2) ...&lt;br /&gt;
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...&lt;br /&gt;
bluez-hcidump (5.23-2+rpi2) wird eingerichtet ...&lt;br /&gt;
lepresenced (0.82-1) wird eingerichtet ...&lt;br /&gt;
[ ok ] Starting lepresenced (via systemctl): lepresenced.service.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.Variante:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Variante wird das aktuellste lepresenced Skript aus github heruntergeladen. Das bedeutet, dass jegliche Konfiguration wie automatischer Start, Berechtigungen etc. &lt;br /&gt;
manuell konfiguriert werden muss. Diese Variante eignet sich nur für diejenigen, die keine .deb-Pakete installieren wollen/können oder die genau Wissen, was sie tun!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/PRESENCE/lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur &amp;quot;Installation&amp;quot; des Skripts folgendermaßen vorgehen:&lt;br /&gt;
Unter /fhem manuell den Ordner „script“ anlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir script&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Datei lepresenced reinkopieren und ausführbar machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod +x /opt/fhem/script/lepresenced&lt;br /&gt;
sudo chgrp -cR dialout lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Skript erstmalig starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt beim Starten des Skript eine Fehlermeldung, müssen die Abhängigkeiten aufgelöst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Can&#039;t locate Net/Server/Daemonize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 / usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /opt/fhem/lepresenced line 17.&lt;br /&gt;
BEGIN failed--compilation aborted at /opt/fhem/lepresenced line 17.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um die Abhängigkeiten aufzulösen muss folgendes nachinstalliert werden und anschließend ein Reboot durchgeführt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libnet-server-*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Einrichtung eines Bluetooth-Geräts über FHEM =====&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration eines BT-Geräts in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der zum Beispiel ein G-Tag dem FHEM-Server bekannt gemacht werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden&lt;br /&gt;
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist den angegeben Port zu unterscheiden. Für presenced muss der Port 5111 genommen werden, für lepresenced der Port 5333.&#039;&#039;&#039;&lt;br /&gt;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
Diese Variante sollte eingesetzt werden, wenn nur ein Pi nach Bluetooth-Geräten sucht. Möchte man mehr als ein Gerät nutzen um zum Beispiel eine größere Fläche abzudecken so muss mit collectored gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alle Räume gemeinsam ansprechen mittels collectord ===&lt;br /&gt;
Um zwei presenced- oder lepresenced Installationen zu verbinden wird der collectord Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Presence_Collectord_Uebersicht.jpg|200px|thumb|left|Schematische Darstellung Presence und Collectord, Danke an dtavb]]&lt;br /&gt;
Auf Basis folgender Skizze wird die Einrichtung und der Betrieb der Anwesenheitserkennung und Überwachung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mit dem PRESENCE-Modul sowie dem Skript (.deb-Paket) lepresenced beschrieben. Zusätzlich wird für die Verbindung &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
mehrere lepresenced Instanzen der collectord verwendet.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.&lt;br /&gt;
{{NeuerTextBlock}}&lt;br /&gt;
&lt;br /&gt;
==== Aufbau ====&lt;br /&gt;
; RPi1 (Hauptinstanz): &lt;br /&gt;
: FHEM Installation&lt;br /&gt;
: presence/lepresenced Installation &lt;br /&gt;
: collectord installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
; RPi2 (Zweitsystem): &lt;br /&gt;
: FHEM installation&lt;br /&gt;
: presence/lepresenced Installation&lt;br /&gt;
: Sämtliche Bluetooth-Geräte in FHEM definiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Installation per .deb-Paket ====&lt;br /&gt;
collectord wird heruntergeladen und installiert:&lt;br /&gt;
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.8.deb (Stand Januar 2018)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i collectord-1.8.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord. Weitere Einstellungen können unter /etc/default/collectord vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration auf Shellebene ==== &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo vi /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datei muss jetzt nach folgender Vorlage angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# room definition&lt;br /&gt;
#[room-name]              # name of the room&lt;br /&gt;
#address=192.168.0.10     # ip-address or hostname&lt;br /&gt;
#port=5111                # tcp port which should be used (5111 is default)&lt;br /&gt;
#presence_timeout=120     # timeout in seconds for each check when devices are present&lt;br /&gt;
#absence_timeout=20       # timeout in secondsfor each check when devices are absent&lt;br /&gt;
&lt;br /&gt;
[RPi1] 			          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=127.0.0.1 	          # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&lt;br /&gt;
[RPi2]  		          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze&lt;br /&gt;
address=192.168.178.127	          # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2&lt;br /&gt;
port=5333		          # Port der Presence Installation &lt;br /&gt;
presence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
absence_timeout=60		  # Selbstgewaelte Pruefintervalle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &lt;br /&gt;
* Es dürfen keine [Namen] mit Leerzeichen verwendet werden&lt;br /&gt;
* Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration in FHEM ==== &lt;br /&gt;
;RPi1&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60           &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222)&#039;&#039;&lt;br /&gt;
;RPi2&lt;br /&gt;
 define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60     &#039;&#039;Hinweis: (Der Port ist der, des collectord!! Standard 5222 - die IP-Adresse von die von RPi1)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration kann der Daemon gestartet werden.&lt;br /&gt;
Sobald das Bluetoothgerät irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort &lt;br /&gt;
an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading &amp;quot;rooms&amp;quot; des jeweiligen BT-Gerätes dargestellt.&lt;br /&gt;
&lt;br /&gt;
Zum testen sollte collectord einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectord prüfen kann, dieser steht in der Zeile &amp;lt;pre&amp;gt;created socket on 0.0.0.0 with port 5222&amp;lt;/pre&amp;gt; und man sehen kann, ob der collectord richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -vv -c /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Ausgabe sieht wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2017-04-02 17:52:55 - =================================================&lt;br /&gt;
2017-04-02 17:52:55 - started with PID 15554&lt;br /&gt;
2017-04-02 17:52:55 - reading configuration file&lt;br /&gt;
2017-04-02 17:52:55 - no config errors found&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5222&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656&lt;br /&gt;
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 2 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48662&lt;br /&gt;
2017-04-02 17:53:20 - new connection from 127.0.0.1:48664&lt;br /&gt;
2017-04-02 17:53:20 - created thread 3 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 4 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 5 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:20 - created thread 6 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51638&lt;br /&gt;
2017-04-02 17:53:22 - created thread 7 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - created thread 8 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)&lt;br /&gt;
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51640&lt;br /&gt;
2017-04-02 17:53:22 - created thread 9 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:23 - created thread 10 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)&lt;br /&gt;
2017-04-02 17:53:29 - new connection from 192.168.xxx.xxx:51642&lt;br /&gt;
2017-04-02 17:53:29 - created thread 11 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
2017-04-02 17:53:29 - created thread 12 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading &amp;quot;rooms&amp;quot; mit dem Wert der erkannten PRESENCE-Installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verhalten presence timeout im zusammenhang mit dem Attribut &amp;quot;absenceThreshold&amp;quot; der PRESENCE Konfiguration in FHEM&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In der collectord.conf sind &amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt; für den jeweiligen Raum konfiguriert.&lt;br /&gt;
Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.&lt;br /&gt;
&lt;br /&gt;
In der PRESENCE-Definition kann man ebenfalls ein &amp;lt;code&amp;gt;absence_timeout&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;presence_timeout&amp;lt;/code&amp;gt; setzen. Sobald sich der Zustand ändert, wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss. Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand. Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.&lt;br /&gt;
&lt;br /&gt;
Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Reading &amp;quot;room&amp;quot; bei einer PRESENCE Definition und der Zusammenhang zu collectord&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der collectord (ab Version 1.8) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das &amp;quot;room&amp;quot;-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.&lt;br /&gt;
&lt;br /&gt;
====  Automatischer Start ====&lt;br /&gt;
Wenn der collectord per .deb Paket installiert wurde, startet er automatisch bei einem Reboot mit (via systemd/init-Skript).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Collectord wird standardmäßig mit dem Port 5222 gestartet. Um diese anzupassen sind zwei Schritte notwendig:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;1.)&#039;&#039;&#039; Anpassen der /usr/bin/collectord &lt;br /&gt;
    Hier bitte den Parameter my $opt_p von 5222 auf 5XXX abändern.&lt;br /&gt;
&lt;br /&gt;
Da der collectord mittlerweile per systemd beim reboot des RPi gestarte wird muss auch diese Konfiguration auf den neuen Port angepasst werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2.)&#039;&#039;&#039; Anpassen der /etc/default/collectord&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# collectord startup defaults:&lt;br /&gt;
# The TCP port collectord will listen for incoming connections (default: 5222)&lt;br /&gt;
PORT=5111&lt;br /&gt;
# The location of the configuration file (default: /etc/collectord.conf&lt;br /&gt;
CFGFILE=/etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manuell starten als Daemon (Parameter &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;) mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batterieüberwachung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung mit dem Modul BleTagBattery ===&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anwesenheitserkennung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModTechName=74_BleTagBattery&lt;br /&gt;
|ModOwner=mumpitzstuff&lt;br /&gt;
}}&lt;br /&gt;
Mit dem Modul BleTagBattery - können die Batteriestati aller BT-LE Devices gelesen werden.&lt;br /&gt;
Es wird das batteryLevel und battery angelegt welches als BT-LE Tags an einer PRESENCE-Installation registriert wurden.&lt;br /&gt;
&lt;br /&gt;
Vorraussetzung und Installation:&lt;br /&gt;
&lt;br /&gt;
Bluez und Gattool&lt;br /&gt;
 sudo apt-get install bluez&lt;br /&gt;
&lt;br /&gt;
Das Gattool ist in den Installationen von Bluez inbegriffen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinzufügen des githup für das Modul&lt;br /&gt;
 update add http://raw.githubusercontent.com/mumpitzstuff/fhem-BleTagBattery/master/controls_bletagbattery.txt&lt;br /&gt;
 update all&lt;br /&gt;
 restart fhem: shutdown restart&lt;br /&gt;
 BT-LE tags muss an einer PRESENCE-Installation des type &amp;quot;lan-bluetooth&amp;quot; registriert sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart von FHEM kann das Modul definiert werden:&lt;br /&gt;
 define a new device: define &amp;lt;name of device&amp;gt; BleTagBattery&lt;br /&gt;
&lt;br /&gt;
Das Modul versucht in der Standardkonfiguration alle 6 Stunden die BT-LE Devices zu erreichen und das Reading batteryLevel und battery zu aktualisieren.&lt;br /&gt;
Das Update kann auch manuell mit dem folgenden Befehl erzwungen werden&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;name of device&amp;gt; statusRequest.&lt;br /&gt;
&lt;br /&gt;
Weiter Informationen und Disskussionen können dem eigentlichen [https://forum.fhem.de/index.php?topic=68104.0 Forumsbeitrag] entnommen werden,&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (aktuell nur G-Tags) ===&lt;br /&gt;
&lt;br /&gt;
Leider überträgt der G-Tag nach der Einrichtung als Device in FHEM kein Reading mit seinem aktuellen Batteriestatus.&lt;br /&gt;
Dem wurde mit Hilfe des Forum Abhilfe geschaffen.&lt;br /&gt;
Im Folgenden wird erläutert wie die Batterieüberwachung eingerichtet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
bc - Basiscalculator [https://packages.debian.org/de/sid/bc Bc-Paket]&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install bc &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen eines Shellskript auf dem Raspberry System. &lt;br /&gt;
Die Parameter &amp;lt;&amp;lt;MAC-Adresse&amp;gt;&amp;gt; und &amp;lt;&amp;lt;TagName&amp;gt;&amp;gt; müssen durch die Werte des auszulesenden G-Tags ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
stringZ=$(sudo gatttool -b 5C:2B:80:C1:14:41 --char-read --handle=0x001b)&lt;br /&gt;
stringZ=${stringZ:33:2}&lt;br /&gt;
stringZ=$(echo &amp;quot;$stringZ&amp;quot; | tr a-f A-F)&lt;br /&gt;
decimal=$(echo &amp;quot;ibase=16; $stringZ&amp;quot; | bc)&lt;br /&gt;
perl /opt/fhem/fhem.pl 7072 &amp;quot;setreading MeinGtag Batterie $decimal&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dem Device in FHEM (hier MeinGtag) ein userReading mit dem Namen &#039;&#039;&#039;Batterie&#039;&#039;&#039; hinzufügen.&lt;br /&gt;
Das Shellskript mit folgendem Befehl starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./GtagBatterie.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist hierbei,&#039;&#039;&#039; dass Skript mit &amp;quot;./&amp;quot; und nicht mit &amp;quot;sh&amp;quot; aufzurufen. Beim Aufruf mit &amp;quot;sh GtagBatterie.sh&amp;quot; produziert es einen Fehler&lt;br /&gt;
&amp;lt;pre&amp;gt;GtagBatterie.sh: 3: GtagBatterie.sh: Bad substitution &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Reading wird auf den ausgelesenen Wert der Batterie gesetzt. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Es sollte für jeden G-Tag ein eigenes Skript abgelegt werden. Das Skript kann per crontab oder fhem Kommando (system) regelmäßig aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (alle Devices vom Typ &amp;quot;MODE=lan-bluetooth&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
Es gibt eine weitere Möglichkeit um den Batteriestatus von LE Devices abzurufen und in FHEM als Reading darzustellen.&lt;br /&gt;
Dabei wird der Batteriezustand für alle LE Devices, die bereits in FHEM konfiguriert sind und per lepresenced überwacht werden, automatisch in einem shell-Script ermittelt.&lt;br /&gt;
Näheres dazu im Forumartikel {{Link2Forum|Topic=56960|LinkText=Erweiterung: Anwesenheitserkennung/Batterieüberwachung}}.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Automatische Ermittlung aller in FHEM konfigurierten LE Devices&lt;br /&gt;
* Möglichkeit, diese Devices alternativ manuell im Script einzutragen&lt;br /&gt;
* Es werden nur Devices abgefragt, die im Status &amp;quot;present&amp;quot; sind, also mit ziemlicher Sicherheit auch verfügbar sind&lt;br /&gt;
* Ein eventuell auf dem FHEM telnet-Port gesetztes Passwort kann im Script hinterlegt werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionierendes lepresenced&#039;&#039;&#039; - siehe [[Anwesenheitserkennung#Anleitung_f.C3.BCr_ein_LE_Device_.28z.B._Gtags.2CPebbles_etc..29|Anleitung für ein LE Device (z.B. Gtags,Pebbles etc.)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;socat&#039;&#039;&#039; - TCP port forwarder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install socat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gawk&#039;&#039;&#039; - Zum extrahieren der Daten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install gawk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gatttool&#039;&#039;&#039; - Bestandteil von bluez &lt;br /&gt;
&lt;br /&gt;
gatttool ist auf den meisten Distributionen im bluez-Paket, allerdings nicht bei Opensuse. Dort muss man das Sourcepaket von bluez installieren und selbst kompilieren.&lt;br /&gt;
gatttool sollte dann nach /usr/bin oder /usr/local/bin kopiert werden,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den notwendigen Erweiterungen werden für die Ausführung von gatttool &#039;&#039;&#039;Root-Rechte benötigt&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Das Script selbst gibt es hier: [https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery lebattery]&lt;br /&gt;
&lt;br /&gt;
Am Besten unter /opt/fhem/script/lebattery speichern und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo su -&lt;br /&gt;
mkdir /opt/fhem/script&lt;br /&gt;
cd /opt/fhem/script&lt;br /&gt;
wget https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery&lt;br /&gt;
chmod 755 lebattery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Bedarf können im Script noch die folgenden 3 Parameter angepasst werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# If allowed_telnetPort is protected by a password, add the password here&lt;br /&gt;
TELNETPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
# Attribute for batterylevel in FHEM&lt;br /&gt;
ATTRIBUT=&amp;quot;batterylevel&amp;quot;&lt;br /&gt;
# Use this, if you dont want the script to determine the tags on its own&lt;br /&gt;
LETAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript wird dann unter root folgendermaßen gestartet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/fhem/script/lebattery -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe des Skripts, wenn es mit dem Verbose Parameter -v gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Beide Devices sind vom Typ NUT mini, das Device mit dem FHEM-Namen &#039;&#039;&#039;nut_Micky&#039;&#039;&#039; ist im Status &#039;&#039;&#039;absent&#039;&#039;&#039;. Das zweite Device ist im Status &#039;&#039;&#039;present&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Determining address for nut_Micky ...&lt;br /&gt;
nut_Micky is in state absent, no further action required&lt;br /&gt;
&lt;br /&gt;
Determining address for nut_Test ...&lt;br /&gt;
Fetching batterylevel for nut_Test (F3:44:04:81:54:89) ...&lt;br /&gt;
Setting batterylevel for nut_Test to 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mein crontab-Eintrag (User root) sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3 3  * * * /opt/fhem/script/lebattery -v &amp;gt;/opt/fhem/script/lebattery.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird jeden Morgen um 3 Minuten nach 3 Uhr der Zustand der Batterien aller Devices ermittelt und in FHEM abgespeichert.&amp;lt;br&amp;gt; &lt;br /&gt;
Bevor man das mit crontab macht, sollte man allerdings zunächst sicher stellen, dass es auch ohne crontab funktioniert....&lt;br /&gt;
&lt;br /&gt;
Bei Problemen kann man auch erstmal schauen, ob das mit dem gattool überhaupt funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gatttool -t &amp;lt;Typ&amp;gt; -b &amp;lt;MAC-Adresse&amp;gt; --char-read --uuid 0x2a19&lt;br /&gt;
&lt;br /&gt;
handle: 0x0017 	 value: 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In diesem Fall hat die Batterie noch 100% (hex 64).&amp;lt;br&amp;gt;&lt;br /&gt;
Der Typ ist abhängig vom Hersteller und kann public (G-Tags) bzw. random (Nut) sein. Im Zweifelsfall beides ausprobieren.&lt;br /&gt;
&lt;br /&gt;
= Beispiele =&lt;br /&gt;
==  Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags ==&lt;br /&gt;
Ein Skript zur Nutzung der Gigaset G-TAGs zur Alarmierung bei öffnen und schließen von Türen und zur Anwesenheitserkennung, um die Alarmierung zu aktivieren bzw. deaktivieren. &lt;br /&gt;
Es kann verwendet werden um die Anwesenheit von mehrern Personen im Haushalt zu erkennen. Dabei wird eingeschränkt, dass nur bestimmte Personen die Alarmierung aktivieren können ( Eltern/Kind -Beziehung ).&lt;br /&gt;
Des Weiteren werden im Beispiel die Eltern benachrichtigt wenn eins der Kinder das Haus verlässt und die Eltern nicht anwesend sind.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Namen der G-Tags in den Skripten bitte anpassen!}}&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;Notify&#039;&#039; und die &#039;&#039;RESIDENTS-Erweiterung&#039;&#039; wird ein Dummy benötigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm dummy&lt;br /&gt;
attr Alarm devStateIcon aktiv:secur_locked@red inaktiv:secur_open@lightgreen&lt;br /&gt;
attr Alarm eventMap on:aktiv off:inaktiv&lt;br /&gt;
attr Alarm setList on off&lt;br /&gt;
attr Alarm webCmd aktiv:inaktiv&lt;br /&gt;
attr Alarm room Alarm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtag.*.presence:.* {Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code für die 99_myUtils.pm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### GTAG ANWESENHEITS CHECK&lt;br /&gt;
sub Anwesenheit_check($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
&lt;br /&gt;
# gtag_rot	-	Alias Marco&lt;br /&gt;
# gtag_schwarz	-	Alias Ulli&lt;br /&gt;
# gtag_gruen	-	Alias Frida&lt;br /&gt;
# gtag_orange	-	Alias Hannah&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Alle GTAGs sind Standardmäßig Residents Roommate&lt;br /&gt;
# $RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur Gäste (Roomguest) Auskommentiert, da ich es so nicht brauche&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$NAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
my $ALIASNAME = AttrVal($ROOMMATE,&#039;alias&#039;,$ROOMMATE); # ALIAS des Roommates auslesen&lt;br /&gt;
&lt;br /&gt;
my $GTAG1 = Value(&#039;gtag_rot&#039;); # ELTERN&lt;br /&gt;
my $GTAG2 = Value(&#039;gtag_schwarz&#039;); # ELTERN&lt;br /&gt;
&lt;br /&gt;
my $STATUS = &amp;quot;wahrscheinlich gerade los&amp;quot;;&lt;br /&gt;
$STATUS = &amp;quot;anwesend&amp;quot; if ($EVENT eq &amp;quot;present&amp;quot;); # Status: anwesend&lt;br /&gt;
$STATUS = &amp;quot;unterwegs&amp;quot; if ($EVENT eq &amp;quot;absent&amp;quot;); # Status: unterwegs&lt;br /&gt;
&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME ist $STATUS.&amp;quot;; # LOG Eintrag erzeugen&lt;br /&gt;
&lt;br /&gt;
if (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME ist da...&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME ist da...&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;present&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_rot&amp;quot; xor $NAME eq &amp;quot;gtag_schwarz&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG INAKTIV: $ALIASNAME ist da...; set Alarm inaktiv&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG INAKTIV&#039; &#039;$ALIASNAME ist da...&#039;; set Alarm inaktiv&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;aktiv&amp;quot;) &amp;amp;&amp;amp; ($NAME eq &amp;quot;gtag_gruen&amp;quot; xor $NAME eq &amp;quot;gtag_orange&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;ALARMIERUNG BLEIBT AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039;&amp;quot;); # Pushover&lt;br /&gt;
 } 		&lt;br /&gt;
 elsif (($EVENT eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Alarm&amp;quot;) eq &amp;quot;inaktiv&amp;quot;) &amp;amp;&amp;amp; ($GTAG1 eq &amp;quot;absent&amp;quot; &amp;amp;&amp;amp; $GTAG2 eq &amp;quot;absent&amp;quot;)) {&lt;br /&gt;
 fhem(&amp;quot;set Alarm aktiv; set teleBot send ALARMIERUNG AKTIV: $ALIASNAME hat das Haus verlassen.&amp;quot;); # Telegram&lt;br /&gt;
# fhem(&amp;quot;set Alarm aktiv; set Infopush msg &#039;ALARMIERUNG AKTIV&#039; &#039;$ALIASNAME hat das Haus verlassen.&#039; &#039;&#039; 0 &#039;&#039;&amp;quot;); # Pushover&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Integration des RESIDENTS-MODUL ===&lt;br /&gt;
&lt;br /&gt;
Der hier beschriebene Code erweitert die Funktionen unter dem Punkt 5.93.&lt;br /&gt;
Das Notify muss daher mit der folgenden Zeile erweitert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_AnwesenheitCheck notify gtag.*.presence:.* { Anwesenheit_check(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;), Anwesenheit_check_resi(&amp;quot;$NAME&amp;quot;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die RESIDENTS Funktion nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### RESIDENTS&lt;br /&gt;
sub Anwesenheit_check_resi($) {&lt;br /&gt;
my ($NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME); # ALIASNAME des GTAGs auslesen&lt;br /&gt;
&lt;br /&gt;
my $RESIDENT = &amp;quot;rr_&amp;quot;; # Als Standard sind alle GTAGs Roommates&lt;br /&gt;
$RESIDENT = &amp;quot;rg_&amp;quot; if (($NAME eq &amp;quot;gtag_orange&amp;quot;) xor ($NAME eq &amp;quot;gtag_weis&amp;quot;)); # Hier nur GTAG Namen der Gäste (Roomguest)&lt;br /&gt;
my $ROOMMATE = (&amp;quot;$RESIDENT&amp;quot; . &amp;quot;$ALIASNAME&amp;quot;); # Residentsname zusammenbauen&lt;br /&gt;
&lt;br /&gt;
if (ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;absent&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE absent&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
 elsif(ReadingsVal($NAME,&#039;presence&#039;,$NAME) eq &amp;quot;present&amp;quot;) {&lt;br /&gt;
 fhem(&amp;quot;set $ROOMMATE home&amp;quot;); # Resisents Status von Roommates setzen&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mit Notify und Fenster/Tür. -Kontakt Überwachung ===&lt;br /&gt;
&lt;br /&gt;
Erweiterung für die Überwachung von  Fenster/Tür. -Kontakten. Dazu sind zwei weitere Notifys notwendig die auf die Trigger der Kontakte regagieren&lt;br /&gt;
und so eine weitere Funktion in der 99_myUtils.pm ansprechen. Die Notifys triggern auf Kontakte die mit dem Namen Kontakt* beginnen.&lt;br /&gt;
Sollten die eigenen Fenster/Tür. -Kontakt anderen Namen besitzen, müssen die Skripte dementsprechend angepasst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Kontaktmeldung notify Kontakt.*:contact:.* {Kontakt_Meldung(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Alarm_Sabotagealarm notify Kontakt.*.sabotageError:.on {Kontakt_Sabotage(&amp;quot;$EVTPART1&amp;quot;, &amp;quot;$NAME&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlicher Code für die 99_myUtils.pm um die TÜRKONTAKTE-Meldung nutzen zu können:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### TÜRKONTAKTE-Meldung/Zustand&lt;br /&gt;
sub Kontakt_Meldung($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME wurde $EVENT&amp;quot;;&lt;br /&gt;
if (ReadingsVal(&amp;quot;Alarm&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;on&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
fhem(&amp;quot;set teleBot send $ALIASNAME wurde $EVENT&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;$ALIASNAME&#039; &#039;$ALIASNAME wurde $EVENT&#039;&amp;quot;); # Nachricht über Pushover&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### TÜRKONTAKTE-Sabotagealarm&lt;br /&gt;
&lt;br /&gt;
sub Kontakt_Sabotage($$) {&lt;br /&gt;
my ($EVENT, $NAME) = @_;&lt;br /&gt;
my $ALIASNAME = AttrVal($NAME,&#039;alias&#039;,$NAME);&lt;br /&gt;
Log 1, &amp;quot;$ALIASNAME meldet Sabotagealarm&amp;quot;;&lt;br /&gt;
fhem(&amp;quot;set teleBot send Alarm: $ALIASNAME meldet Sabotagealarm&amp;quot;); # Nachricht über Telegram&lt;br /&gt;
# fhem(&amp;quot;set Infopush msg &#039;Alarmanlage&#039; &#039;$ALIASNAME meldet Sabotagealarm&#039; &#039;&#039; 2 &#039; &#039; 60 600 &amp;quot;); # Nachricht über Pushover&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zur Benutzung / Fehlerhandling ===&lt;br /&gt;
&lt;br /&gt;
Der Alarm dummy hat den Zustand on:off.  Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert.&lt;br /&gt;
Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden.&lt;br /&gt;
Die Benachrichtigung kann aktuell per &#039;&#039;Telegram&#039;&#039; sowie &#039;&#039;Pushover&#039;&#039; (&#039;&#039;&#039;Achtung mit zweiterem sind Abokosten verbunden!&#039;&#039;&#039;) realisiert werden.&lt;br /&gt;
Diskussion zum Thema im Forum unter: {{Link2Forum|Topic=64080}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Problemlösungen =&lt;br /&gt;
Falls es &#039;&#039;&#039;Probleme beim Starten des Skripts&#039;&#039;&#039; gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | grep lepresenced&lt;br /&gt;
sudo kill &amp;lt;pid&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debuglevel lepresenced setzen:&lt;br /&gt;
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}&lt;br /&gt;
&lt;br /&gt;
Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, dass Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden sind durch den nötigen LOG-Eintrag ersetzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur das wichtigste Loggen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_WARNING&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Keinerlei LOG-Einträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_EMERG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;Problemen mit der Batterieüberwachung&#039;&#039;&#039; der Tags kann die Pi Firmeware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden.&lt;br /&gt;
Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:&lt;br /&gt;
&amp;lt;pre&amp;gt;connect: Connection refused (111)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo rpi-update 8521fd34c8f66b6d109acce943f6e25ec93ec005&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehr dazu unter: {{Link2Forum|Topic=56960|Message=589165}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das BT-Device ist ständig &amp;quot;absent&amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Eine Mögliche Lösung kann sein, dass Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivität.&lt;br /&gt;
Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install bluez-hcidump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehler in Logdateien /var/log/syslog und /var/log/kernel&#039;&#039;&#039;&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634211] bt_err_ratelimited: 1 callbacks suppressed&lt;br /&gt;
 Jul 29 15:08:11 raspberrypi kernel: [ 4905.634231] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:12 raspberrypi kernel: [ 4906.647350] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.532081] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
 Jul 29 15:08:13 raspberrypi kernel: [ 4907.655564] Bluetooth: hci0 advertising data length corrected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene log&#039;s geschrieben. Darunter maßgeblich &amp;quot;syslog&amp;quot; und &amp;quot;kern.log&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Lösung (vorübergehend)&lt;br /&gt;
Unterbinden der Einträge durch Anlage eines blocklist Eintrag:&lt;br /&gt;
&lt;br /&gt;
 1. Unter &amp;quot;/etc/rsyslog.d&amp;quot; eine Datei erzeugen mit dem Namen &amp;quot;01-blocklist.conf&amp;quot;&lt;br /&gt;
 2. Inhalt: (Die Ausdrücke in den &amp;quot;&amp;quot; sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die unten stehenden&amp;quot;)&lt;br /&gt;
    :msg,contains,&amp;quot;Bluetooth: hci0 advertising data length corrected&amp;quot; stop&lt;br /&gt;
    :msg,contains,&amp;quot;bt_err_ratelimited:&amp;quot; stop&lt;br /&gt;
 3. Dienst neu starten &amp;quot;sudo service rsyslog restart&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Weiter Infos werden im offiziellen Thema {{Link2Forum|Topic=28753|Message=499184|LinkText=hier}} diskutiert.&lt;br /&gt;
&lt;br /&gt;
Seit Version 0.82 kann es beim Start zu folgenden Meldungen im Log kommen. &lt;br /&gt;
 Sep 06 16:13:45 raspberrypi systemd[1]: Started lepresenced.&lt;br /&gt;
 Sep 06 16:13:45 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: Received &#039;Set scan parameters failed: Input/output error&#039;, ...tting...&lt;br /&gt;
 Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...&lt;br /&gt;
&lt;br /&gt;
Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst indem es sich resettet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moderne iPhones und Android Geräte wechseln zum &amp;quot;deep standby&amp;quot; Modus&#039;&#039;&#039;, und werden dann als &amp;quot;abwesend&amp;quot; gemeldet.&lt;br /&gt;
Mittels einer Funktion, die via hping3 Packete an den Geräte senden, um die &amp;quot;wach&amp;quot; zu halten, und dann die MacAdresse ausliest, kann man dieses Problem umgehen. Mehr im Forum [https://forum.fhem.de/index.php/topic,76342.0.html]&lt;br /&gt;
&lt;br /&gt;
= Versionsänderungen lepresenced =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--Version 0.81 (BasisVersion)&lt;br /&gt;
--Version 0.82 (stable  08/2017)&lt;br /&gt;
  -Neue Kommandozeilenoption &amp;quot;--debug&amp;quot;: Startet lepresenced im Vordergrund und gibt ausführliche Debug-Informationen auf STDOUT aus.&lt;br /&gt;
  -Sanity Check: lepresenced prüft beim Starten die Verfügbarkeit von hciconfig, hcitool und hcidump.&lt;br /&gt;
  -Model: lepresenced übermittelt das Reading model nun als lan-lepresenced. Das erlaubt die Erkennung von lepresenced in der FHEM-Statistik (sofern aktiviert).&lt;br /&gt;
--Version 0.83 (stable  09/2017)&lt;br /&gt;
  - Behebung von Systemstart Fehlern&lt;br /&gt;
  - Weitere Debug-Möglichkeiten. U. a. wird nun mitgezählt, ob hcitool lescan (&amp;quot;legacy&amp;quot;) und hcidump eine identische Zahl an Beacons empfangen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ansprechpartner =&lt;br /&gt;
# {{Link2FU|117|markusbloch }} (Markus) für das PRESENCE-Modul und collectord&lt;br /&gt;
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced &lt;br /&gt;
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen&amp;diff=27281</id>
		<title>EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen&amp;diff=27281"/>
		<updated>2018-06-27T21:07:38Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* FHEM Config-Auszug */ attr &amp;lt;device&amp;gt; model Eltako_FSB_ACK ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=Fsb61np.jpg&lt;br /&gt;
|Bildbeschreibung=FSB61NP Fertigungswoche XX/12&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Aktor, Empfänger, ab Fertigungswoche 41/11 auch Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=1 (unidirektional, ab Fertigungswoche 41/11 bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch ca. 0,7W - 0,9W&lt;br /&gt;
|HWPoweredBy=230V&lt;br /&gt;
|HWSize=45x55x33mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Eltako&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Seite gilt nur für die &#039;&#039;&#039;bidirektionale&#039;&#039;&#039; Variante des Aktors ab Fertigungswoche 41/11}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen&#039;&#039;&#039; ist ein Aktor&lt;br /&gt;
* für&lt;br /&gt;
** Unterputzmontage&lt;br /&gt;
* für&lt;br /&gt;
** Steuerung von Rollladen und Beschattungselementen&lt;br /&gt;
== Features ==&lt;br /&gt;
Aktor für Beschattungselemente und Rolladen (ab Fertigungswoche 41/11 bidirektional)&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Volle Funktionsfähigkeit erfordert, dass die Bestätigungstelegramme am Aktor eingeschaltet sind&lt;br /&gt;
&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
Der Aktor kann nicht vollautomatisch per autocreate in FHEM angelegt werden. &lt;br /&gt;
Die Einbindung in FHEM kann entweder über die Nutzung der inoffiziellen, gerätespezifischen EEP (empfohlen) &#039;&#039;&#039;oder&#039;&#039;&#039; über die manuelle Vorgehensweise erfolgen.  &lt;br /&gt;
&lt;br /&gt;
===== Nutzung der inoffziellen EEP =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* FHEM-Device &amp;lt;name&amp;gt; (hier: EnO_switch_FSB61) mit dem inoffiziellen EEP für den FSB61 (G5-3F-7F) und der Sender-ID des FSB61 (siehe Rückseite des Aktors; hier: 01036620) durch Eingabe in das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] definieren:&lt;br /&gt;
: &amp;lt;code&amp;gt;define EnO_switch_FSB61 EnOcean 01036620 G5-3F-7F&amp;lt;/code&amp;gt;&lt;br /&gt;
: Hierdurch wird ein FHEM-Device mit allen grundlegenden Attributen angelegt. Nur das Attribut &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt; muss noch wie unten im Config-Auszug gezeigt mit dem Wert Eltako_FSB61 angelegt werden, bevor das FHEM-Device am Aktor angelernt werden kann.&lt;br /&gt;
* Am Aktor &lt;br /&gt;
** Oberer Funktions-Drehschalter: auf LRN&lt;br /&gt;
** Unterer Funktions-Drehschalter: auf MAX (zum Einlernen PC)&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set EnO_switch_FSB61 teach&amp;lt;/code&amp;gt;&lt;br /&gt;
* Am Aktor nach dem Einlernen beide Drehschalter in die ursprüngliche Position&lt;br /&gt;
* Abschließend müssen die Attribute &amp;lt;code&amp;gt;shutTime&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shutTimeCloses&amp;lt;/code&amp;gt; für die Laufzeitsteuerung angelegt und mit den individuellen Werten der zu steuernden Jalousien angepasst werden. Infos zu den Attributen finden sich unten im [[#FHEM_Config-Auszug|FHEM-Config-Auszug]].&lt;br /&gt;
&lt;br /&gt;
===== Alternative: manuelle Vorgehensweise =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* EnOcean-FHEM-Device &amp;lt;name&amp;gt; mit der Sender-ID des FSB (siehe Rückseite des Aktors) definieren&lt;br /&gt;
* Das Attribut subDef mit einer freien SenderId des TCMs anlegen ODER falls keine freie Sender-ID bekannt ist, das Attribut komplett weglassen, damit die Vergabe automatisch durch FHEM erfolgt&lt;br /&gt;
* Die Attribute subType, model und manufID wie nachfolgend im Config-Auszug anlegen&lt;br /&gt;
* Die Attribute shutTime und shutTimeCloses mit individullen Werten anlegen (vgl. Erläuterungen zum Config-Auszug)&lt;br /&gt;
* Am Aktor &lt;br /&gt;
** Oberer Funktions-Drehschalter: auf LRN&lt;br /&gt;
** Unterer Funktions-Drehschalter: auf MAX (zum Einlernen PC)&lt;br /&gt;
* FHEM Eingabefeld: „set &amp;lt;name&amp;gt; teach&amp;quot;&lt;br /&gt;
* Am Aktor nach dem Einlernen beide Drehschalter in die ursprüngliche Position&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration|fhem.cfg]]:&lt;br /&gt;
 define EnO_switch_FSB61 EnOcean 01036620     &amp;lt;--- SenderID des FSB61 (Aktors)&lt;br /&gt;
 attr EnO_switch_FSB61 eep A5-3F-7F&lt;br /&gt;
 attr EnO_switch_FSB61 manufID 00D&lt;br /&gt;
 attr EnO_switch_FSB61 model Eltako_FSB_ACK  &lt;br /&gt;
 attr EnO_switch_FSB61 subDef AABBCC05        &amp;lt;--- AABBCC05 ist eine der 127 SenderID&#039;s des TCM mit der FHEM sendet &lt;br /&gt;
 attr EnO_switch_FSB61 subType manufProfile&lt;br /&gt;
 attr EnO_switch_FSB61 webCmd opens:stop:closes&lt;br /&gt;
 attr EnO_switch_FSB61 shutTime 35&lt;br /&gt;
 attr EnO_switch_FSB61 shutTimeCloses 40&lt;br /&gt;
* &#039;&#039;&#039;shutTime&#039;&#039;&#039;: Zeit (in Sekunden) die der Rollladen von &amp;quot;vollständig geöffnet&amp;quot; bis &amp;quot;vollständig geschlossen&amp;quot; braucht. Diese Zeit verwendet FHEM um die Position des Rollladens zu errechnen. Fährt man den Rollladen von der oberen Endlage mit &amp;lt;pre&amp;gt;set EnO_switch_FSB61 position 50&amp;lt;/pre&amp;gt; so fährt der Rollladen die Hälfte der shutTime in Sekunden runter bevor er stoppt. Der Rollladen steht nun in der Position 50%.&lt;br /&gt;
* &#039;&#039;&#039;shutTimeCloses&#039;&#039;&#039;: Zeit (in Sekunden), um den Rollladen sicher in eine definierte Endlage zu fahren. &lt;br /&gt;
** shutTimeCloses ist größer als shutTime&lt;br /&gt;
** shutTimeCloses ist (etwas) größer als die am FSB61 eingestellte Rückfallverzögerung (unterer Drehschalter, 0-120 Sekunden)&lt;br /&gt;
: Fährt man den Rollladen von der oberen Endlage mit &amp;lt;pre&amp;gt;set EnO_switch_FSB61 closes&amp;lt;/pre&amp;gt; zu, so fährt FHEM den Rollladen shutTimeCloses Sekunden runter -&amp;gt; die untere Endlage wird sicher erreicht und der FSB61 sendet die diesbezügliche Bestätigung.&lt;br /&gt;
* &#039;&#039;&#039;model&#039;&#039;&#039;: &lt;br /&gt;
Grundsätzlich wird der Status „open_ack“ vom FSB61 Aktor versendet, wenn länger nach oben gefahren wird, als die am Aktor per Drehschalter eingestellte Zeit oder eben beim Hochfahren am lokalen Steuereingang. Damit befindet sicher der Aktor sicher in Position &amp;quot;0&amp;quot;. Mit &amp;lt;pre&amp;gt;attr &amp;lt;device&amp;gt; model Eltako_FSB_ACK&amp;lt;/pre&amp;gt; wird das in FHEM auch so umgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== Rollladensteuerung in Abhängigkeit von Sonnenauf- und -untergang ===&lt;br /&gt;
 define RolladenHoch at *{sunrise(0,&amp;quot;07:00&amp;quot;,&amp;quot;09:00&amp;quot;)} set EnO_switch_FSB61 opens&lt;br /&gt;
 define RolladenZu at *{sunset(0,&amp;quot;17:30&amp;quot;,&amp;quot;22:00&amp;quot;)} set EnO_switch_FSB61 closes&lt;br /&gt;
&lt;br /&gt;
Der Rolladen wird&lt;br /&gt;
&lt;br /&gt;
* morgens zum Sonnenaufgang, aber nicht vor 07:00 und nicht nach 09:00 Uhr hochgefahren und&lt;br /&gt;
* abends zum Sonnenuntergang zugefahren, aber nicht vor 17:30 Uhr und nicht nach 22:00 Uhr.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[SUNRISE_EL]]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige Rollladenstand im WebFrontend ===&lt;br /&gt;
Durch die folgenden zwei Attribute wird der Rollladenstand im WebFrontend bildlich dargestellt: &lt;br /&gt;
:&amp;lt;code&amp;gt;attr EnO_switch_FSB61 stateFormat position&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr EnO_switch_FSB61 devStateIcon down:fts_shutter_100 up:fts_window_2w 1\d.*:fts_shutter_90 2\d.*:fts_shutter_80 3\d.*:fts_shutter_70 4\d.*:fts_shutter_60 5\d.*:fts_shutter_50 6\d.*:fts_shutter_40 7\d.*:fts_shutter_30 8\d.*:fts_shutter_20 9\d.*:fts_shutter_10 \d.*:fts_shutter_90&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[FTUI_Snippets#Rollladen_Circle_Menu|dieses Beispiel für Tablet UI]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt: [https://www.eltako.com/fileadmin/downloads/de/datenblatt/Datenblatt_FSB61NP-230V.pdf PDF]&lt;br /&gt;
* Anleitung: [https://www.eltako.com/fileadmin/downloads/de/_bedienung/FSB61NP_30200430-7_dt.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen&amp;diff=26521</id>
		<title>EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen&amp;diff=26521"/>
		<updated>2018-04-29T19:04:24Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Anzeige Rollladenstand im WebFrontend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=Fsb61np.jpg&lt;br /&gt;
|Bildbeschreibung=FSB61NP Fertigungswoche XX/12&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Aktor, Empfänger, ab Fertigungswoche 41/11 auch Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=1 (unidirektional, ab Fertigungswoche 41/11 bidirektional)&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=Eigenverbrauch ca. 0,7W - 0,9W&lt;br /&gt;
|HWPoweredBy=230V&lt;br /&gt;
|HWSize=45x55x33mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=Eltako&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Seite gilt nur für die &#039;&#039;&#039;bidirektionale&#039;&#039;&#039; Variante des Aktors ab Fertigungswoche 41/11}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-FSB61-Aktor-Beschattungselemente-Rollladen&#039;&#039;&#039; ist ein Aktor&lt;br /&gt;
* für&lt;br /&gt;
** Unterputzmontage&lt;br /&gt;
* für&lt;br /&gt;
** Steuerung von Rollladen und Beschattungselementen&lt;br /&gt;
== Features ==&lt;br /&gt;
Aktor für Beschattungselemente und Rolladen (ab Fertigungswoche 41/11 bidirektional)&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Volle Funktionsfähigkeit erfordert, dass die Bestätigungstelegramme am Aktor eingeschaltet sind&lt;br /&gt;
&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
Der Aktor kann nicht vollautomatisch per autocreate in FHEM angelegt werden. &lt;br /&gt;
Die Einbindung in FHEM kann entweder über die Nutzung der inoffiziellen, gerätespezifischen EEP (empfohlen) &#039;&#039;&#039;oder&#039;&#039;&#039; über die manuelle Vorgehensweise erfolgen.  &lt;br /&gt;
&lt;br /&gt;
===== Nutzung der inoffziellen EEP =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* FHEM-Device &amp;lt;name&amp;gt; (hier: EnO_switch_FSB61) mit dem inoffiziellen EEP für den FSB61 (G5-3F-7F) und der Sender-ID des FSB61 (siehe Rückseite des Aktors; hier: 01036620) durch Eingabe in das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] definieren:&lt;br /&gt;
: &amp;lt;code&amp;gt;define EnO_switch_FSB61 EnOcean 01036620 G5-3F-7F&amp;lt;/code&amp;gt;&lt;br /&gt;
: Hierdurch wird ein FHEM-Device mit allen grundlegenden Attributen angelegt. Nur das Attribut &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt; muss noch wie unten im Config-Auszug gezeigt mit dem Wert Eltako_FSB61 angelegt werden, bevor das FHEM-Device am Aktor angelernt werden kann.&lt;br /&gt;
* Am Aktor &lt;br /&gt;
** Oberer Funktions-Drehschalter: auf LRN&lt;br /&gt;
** Unterer Funktions-Drehschalter: auf MAX (zum Einlernen PC)&lt;br /&gt;
* FHEM Eingabefeld: &amp;lt;code&amp;gt;set EnO_switch_FSB61 teach&amp;lt;/code&amp;gt;&lt;br /&gt;
* Am Aktor nach dem Einlernen beide Drehschalter in die ursprüngliche Position&lt;br /&gt;
* Abschließend müssen die Attribute &amp;lt;code&amp;gt;shutTime&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;shutTimeCloses&amp;lt;/code&amp;gt; für die Laufzeitsteuerung angelegt und mit den individuellen Werten der zu steuernden Jalousien angepasst werden. Infos zu den Attributen finden sich unten im [[#FHEM_Config-Auszug|FHEM-Config-Auszug]].&lt;br /&gt;
&lt;br /&gt;
===== Alternative: manuelle Vorgehensweise =====&lt;br /&gt;
Folgende Schritte sind durchzuführen:&lt;br /&gt;
* EnOcean-FHEM-Device &amp;lt;name&amp;gt; mit der Sender-ID des FSB (siehe Rückseite des Aktors) definieren&lt;br /&gt;
* Das Attribut subDef mit einer freien SenderId des TCMs anlegen ODER falls keine freie Sender-ID bekannt ist, das Attribut komplett weglassen, damit die Vergabe automatisch durch FHEM erfolgt&lt;br /&gt;
* Die Attribute subType, model und manufID wie nachfolgend im Config-Auszug anlegen&lt;br /&gt;
* Die Attribute shutTime und shutTimeCloses mit individullen Werten anlegen (vgl. Erläuterungen zum Config-Auszug)&lt;br /&gt;
* Am Aktor &lt;br /&gt;
** Oberer Funktions-Drehschalter: auf LRN&lt;br /&gt;
** Unterer Funktions-Drehschalter: auf MAX (zum Einlernen PC)&lt;br /&gt;
* FHEM Eingabefeld: „set &amp;lt;name&amp;gt; teach&amp;quot;&lt;br /&gt;
* Am Aktor nach dem Einlernen beide Drehschalter in die ursprüngliche Position&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration|fhem.cfg]]:&lt;br /&gt;
 define EnO_switch_FSB61 EnOcean 01036620     &amp;lt;--- SenderID des FSB61 (Aktors)&lt;br /&gt;
 attr EnO_switch_FSB61 eep A5-3F-7F&lt;br /&gt;
 attr EnO_switch_FSB61 manufID 00D&lt;br /&gt;
 attr EnO_switch_FSB61 model Eltako_FSB61&lt;br /&gt;
 attr EnO_switch_FSB61 subDef AABBCC05        &amp;lt;--- AABBCC05 ist eine der 127 SenderID&#039;s des TCM mit der FHEM sendet &lt;br /&gt;
 attr EnO_switch_FSB61 subType manufProfile&lt;br /&gt;
 attr EnO_switch_FSB61 webCmd opens:stop:closes&lt;br /&gt;
 attr EnO_switch_FSB61 shutTime 35&lt;br /&gt;
 attr EnO_switch_FSB61 shutTimeCloses 40&lt;br /&gt;
* &#039;&#039;&#039;shutTime&#039;&#039;&#039;: Zeit (in Sekunden) die der Rollladen von &amp;quot;vollständig geöffnet&amp;quot; bis &amp;quot;vollständig geschlossen&amp;quot; braucht. Diese Zeit verwendet FHEM um die Position des Rollladens zu errechnen. Fährt man den Rollladen von der oberen Endlage mit &amp;lt;pre&amp;gt;set EnO_switch_FSB61 position 50&amp;lt;/pre&amp;gt; so fährt der Rollladen die Hälfte der shutTime in Sekunden runter bevor er stoppt. Der Rollladen steht nun in der Position 50%.&lt;br /&gt;
* &#039;&#039;&#039;shutTimeCloses&#039;&#039;&#039;: Zeit (in Sekunden), um den Rollladen sicher in eine definierte Endlage zu fahren. &lt;br /&gt;
** shutTimeCloses ist größer als shutTime&lt;br /&gt;
** shutTimeCloses ist (etwas) größer als die am FSB61 eingestellte Rückfallverzögerung (unterer Drehschalter, 0-120 Sekunden)&lt;br /&gt;
: Fährt man den Rollladen von der oberen Endlage mit &amp;lt;pre&amp;gt;set EnO_switch_FSB61 closes&amp;lt;/pre&amp;gt; zu, so fährt FHEM den Rollladen shutTimeCloses Sekunden runter -&amp;gt; die untere Endlage wird sicher erreicht und der FSB61 sendet die diesbezügliche Bestätigung.&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== Rollladensteuerung in Abhängigkeit von Sonnenauf- und -untergang ===&lt;br /&gt;
 define RolladenHoch at *{sunrise(0,&amp;quot;07:00&amp;quot;,&amp;quot;09:00&amp;quot;)} set EnO_switch_FSB61 opens&lt;br /&gt;
 define RolladenZu at *{sunset(0,&amp;quot;17:30&amp;quot;,&amp;quot;22:00&amp;quot;)} set EnO_switch_FSB61 closes&lt;br /&gt;
&lt;br /&gt;
Der Rolladen wird&lt;br /&gt;
&lt;br /&gt;
* morgens zum Sonnenaufgang, aber nicht vor 07:00 und nicht nach 09:00 Uhr hochgefahren und&lt;br /&gt;
* abends zum Sonnenuntergang zugefahren, aber nicht vor 17:30 Uhr und nicht nach 22:00 Uhr.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[SUNRISE_EL]]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige Rollladenstand im WebFrontend ===&lt;br /&gt;
Durch die folgenden zwei Attribute wird der Rollladenstand im WebFrontend bildlich dargestellt: &lt;br /&gt;
:&amp;lt;code&amp;gt;attr EnO_switch_FSB61 stateFormat position&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr EnO_switch_FSB61 devStateIcon down:fts_shutter_100 up:fts_window_2w 1\d.*:fts_shutter_90 2\d.*:fts_shutter_80 3\d.*:fts_shutter_70 4\d.*:fts_shutter_60 5\d.*:fts_shutter_50 6\d.*:fts_shutter_40 7\d.*:fts_shutter_30 8\d.*:fts_shutter_20 9\d.*:fts_shutter_10 \d.*:fts_shutter_90&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[FTUI_Snippets#Rollladen_Circle_Menu|dieses Beispiel für Tablet UI]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt: [https://www.eltako.com/fileadmin/downloads/de/datenblatt/Datenblatt_FSB61NP-230V.pdf PDF]&lt;br /&gt;
* Anleitung: [https://www.eltako.com/fileadmin/downloads/de/_bedienung/FSB61NP_30200430-7_dt.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Event_monitor&amp;diff=26405</id>
		<title>Event monitor</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Event_monitor&amp;diff=26405"/>
		<updated>2018-04-12T20:52:18Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Vorgehensweise beim Ändern eines Gerätes */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:EventMonitor.png|mini|400px|rechts|Event Monitor Anzeige mit Beispiel-Ereignissen]]&lt;br /&gt;
Der [[Event monitor]] (&amp;lt;code&amp;gt;/fhem?cmd=style%20eventMonitor&amp;lt;/code&amp;gt; [[#Die_o.a._eventMonitor-URL_kann_nicht_erfolgreich_aufgerufen_werden]]) ist eine Seite im [[PGM2|Standard Interface]] von FHEM, auf der alle von FHEM verarbeiteten Ereignisse angezeigt werden. Ereignisse im genannten Sinn sind neben eingehenden Funktelegrammen auch [[notify]]- und [[at]]-Anweisungen.&lt;br /&gt;
&lt;br /&gt;
Die Ereignisanzeige wird bei jedem Aufruf des Monitor-Fensters geleert, nur im Anschluss daran auftretende Ereignisse werden angezeigt, es können also keine Ereignisse der Vergangenheit angezeigt werden. Um einen längeren Zeitraum &amp;quot;aufzuzeichnen&amp;quot;, muss das Monitor-Fenster demzufolge durchgehend geöffnet sein.&lt;br /&gt;
&lt;br /&gt;
In einer Telnet-Sitzung ist eine äquivalente Funktionalität über das &amp;quot;inform&amp;quot; Kommando verfügbar.&lt;br /&gt;
&lt;br /&gt;
Im gezeigten Beispiel sind im überwachten Zeitraum vier Nachrichten eines [[FHT80TF-2]] aufgetreten.&lt;br /&gt;
&lt;br /&gt;
== Events &amp;quot;filtern&amp;quot; ==&lt;br /&gt;
[[Datei:EventMonitorFiltered.png|mini|rechts|Event Monitor, gefilterte Ausgabe]]&lt;br /&gt;
Um die Ausgabe im Event monitor auf eine Teilmenge zu begrenzen, kann an die URL ein Filter angehängt werden; im gezeigten Beispiel werden nur Ereignisse Devices angezeigt, die den Text &#039;&#039;pca&#039;&#039; in Namen enthalten. Die URL muss bis FHEM-Updatestand vom 26.03.2015 dafür auf &amp;lt;code&amp;gt;/fhem?cmd=style eventMonitor pca&amp;lt;/code&amp;gt; abgeändert / ergänzt werden, der angewendete Filter wird unter dem Befehlseingabefeld angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der Filter funktioniert bis FHEM-Updatestand vom 26.03.2015 nur auf den Device Namen bzw. Teile davon, nicht jedoch auf den Device Typ (im gezeigten Beispiel würde also ein Filtern auf PCA301 nicht funktionieren).&lt;br /&gt;
&lt;br /&gt;
Mit FHEM-Update vom 27.03.2015 wurde Aufruf und Bedienung des Event Monitors vereinfacht sowie die Filtermöglichkeiten ausgebaut. Der Filter muss nicht mehr über eine Anpassung der URL, sondern kann direkt im Event Monitor dialogunterstützt eingestellt werden. Es sind nun auch Filter auf Device Typ möglich und es kann ein beliebiger regulärer Ausdruck in Perl für den Filter genutzt werden. Bei Aufruf des Event Monitors werden zunächst weiterhin alle Events angezeigt. Erkennbar an der Titelzeile &amp;quot;Events (Filter:.*):&amp;quot;. Durch Anklicken des &amp;quot;.*&amp;quot; in der Titelzeile öffnet sich eine Dialogbox in der man einen regulären Ausdruck eintragen kann. Nach Bestätigung der Dialogbox mit OK wird dieser reguläre Ausdruck zum Filtern der Events genutzt und in der Titelzeile angezeigt (bspw. &amp;quot;Events (Filter:pca):&amp;quot;). Beispiele zu den neuen Filtermöglichkeiten enthält dieser {{Link2Forum|Topic=12398|Message=278553|LinkText=Forenbeitrag}}.&lt;br /&gt;
&lt;br /&gt;
== Geräte anlegen/ändern ==&lt;br /&gt;
Der [[Event monitor]] bietet die Möglichkeit aus einer markierten [[Event]]-Zeile Gerätedefinitionen abzuleiten und die [[Gerät|Geräte]] anzulegen.&lt;br /&gt;
Es können Definitionen für folgende Gerätemodule angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[FileLog]]&lt;br /&gt;
* [[notify]]&lt;br /&gt;
* [[sequence]]&lt;br /&gt;
* [[watchdog]]&lt;br /&gt;
&lt;br /&gt;
Für einige [[Gerät|Geräte]] können die Definitionen auch geändert werden. Die [[Gerätename|Gerätenamen]] werden in einer Auswahlliste angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== Vorgehensweise beim Anlegen eines Gerätes ===&lt;br /&gt;
* [[Event]]-Zeile komplett markieren&lt;br /&gt;
* den Knopf {{Taste|Create/Modify Device}} betätigen&lt;br /&gt;
* ein Gerätemodul auswählen&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039; auswählen&lt;br /&gt;
* die gewünschte Form des [[Event|Events]] auswählen&lt;br /&gt;
* den Knopf {{Taste|OK}} betätigen&lt;br /&gt;
Danach öffnet sich die Detailansicht des angelegten [[Gerät|Gerätes]], dort kann die Definition weiter bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
=== Vorgehensweise beim Ändern eines Gerätes ===&lt;br /&gt;
* [[Event]]-Zeile komplett markieren&lt;br /&gt;
* den Knopf {{Taste|Create/Modify Device}} betätigen&lt;br /&gt;
* &#039;&#039;&#039;Modify&#039;&#039;&#039; auswählen&lt;br /&gt;
* ein [[Gerät]] auswählen&lt;br /&gt;
* die gewünschte Form des [[Event|Events]] auswählen&lt;br /&gt;
* den Knopf {{Taste|OK}} betätigen&lt;br /&gt;
Danach öffnet sich die Detailansicht des angelegten [[Gerät|Gerätes]], dort kann die Definition weiter bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
=== Die eventMonitor-URL kann nicht erfolgreich aufgerufen werden ===&lt;br /&gt;
&lt;br /&gt;
Der Event-Monitor kann bei aktiviertem CSRF&amp;lt;ref&amp;gt;[https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery Cross-Site-Request-Forgery] - Wikipedia&amp;lt;/ref&amp;gt;-Schutz (FHEMWEB Attribut &amp;lt;code&amp;gt;csrfToken&amp;lt;/code&amp;gt;) nur aus dem FHEMWEB-Frontend heraus geöffnet werden. Es handelt sich hierbei um einen Sicherheitsmechanismus, welcher seit Feature-Level 5.8 standardmäßig aktiviert ist. Jeder Aufruf des Event-Monitors in FHEMWEB muss standardmäßig das aktuell gültige CSRF-Token im URL-Aufruf enthalten um den Event-Monitor angezeigt zu bekommen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;/fhem?cmd=style%20eventMonitor&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;fwcsrf=csrf_193851249212150&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieses Verhalten kann durch das FHEMWEB Attribut &amp;lt;code&amp;gt;csrfToken&amp;lt;/code&amp;gt; (siehe {{Link2CmdRef|Lang=de|Anker=csrfToken}}) verändert werden. Details dazu finden sich in dem Artikel [[CsrfToken-HowTo]].&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor schreibt keine Events ===&lt;br /&gt;
Es sind diverse Situationen bekannt geworden, in denen der Event Monitor keine Events schreibt, z.B.:&lt;br /&gt;
* aufgrund von Problemen mit dem {{Link2Forum|Topic=35715|Message=291061|LinkText=Netzwerkkartentreiber &#039;&#039;E2200 KILLER&#039;&#039;}}&lt;br /&gt;
* {{Link2Forum|Topic=35715|Message=289167|LinkText=Firewall (Sophos)}}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=12398}} &#039;&#039;Filter im Event Monitor&#039;&#039;&lt;br /&gt;
* [[Event|Event, Ereignis]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Event_monitor&amp;diff=26404</id>
		<title>Event monitor</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Event_monitor&amp;diff=26404"/>
		<updated>2018-04-12T20:51:39Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Vorgehensweise beim Anlegen eines Gerätes */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:EventMonitor.png|mini|400px|rechts|Event Monitor Anzeige mit Beispiel-Ereignissen]]&lt;br /&gt;
Der [[Event monitor]] (&amp;lt;code&amp;gt;/fhem?cmd=style%20eventMonitor&amp;lt;/code&amp;gt; [[#Die_o.a._eventMonitor-URL_kann_nicht_erfolgreich_aufgerufen_werden]]) ist eine Seite im [[PGM2|Standard Interface]] von FHEM, auf der alle von FHEM verarbeiteten Ereignisse angezeigt werden. Ereignisse im genannten Sinn sind neben eingehenden Funktelegrammen auch [[notify]]- und [[at]]-Anweisungen.&lt;br /&gt;
&lt;br /&gt;
Die Ereignisanzeige wird bei jedem Aufruf des Monitor-Fensters geleert, nur im Anschluss daran auftretende Ereignisse werden angezeigt, es können also keine Ereignisse der Vergangenheit angezeigt werden. Um einen längeren Zeitraum &amp;quot;aufzuzeichnen&amp;quot;, muss das Monitor-Fenster demzufolge durchgehend geöffnet sein.&lt;br /&gt;
&lt;br /&gt;
In einer Telnet-Sitzung ist eine äquivalente Funktionalität über das &amp;quot;inform&amp;quot; Kommando verfügbar.&lt;br /&gt;
&lt;br /&gt;
Im gezeigten Beispiel sind im überwachten Zeitraum vier Nachrichten eines [[FHT80TF-2]] aufgetreten.&lt;br /&gt;
&lt;br /&gt;
== Events &amp;quot;filtern&amp;quot; ==&lt;br /&gt;
[[Datei:EventMonitorFiltered.png|mini|rechts|Event Monitor, gefilterte Ausgabe]]&lt;br /&gt;
Um die Ausgabe im Event monitor auf eine Teilmenge zu begrenzen, kann an die URL ein Filter angehängt werden; im gezeigten Beispiel werden nur Ereignisse Devices angezeigt, die den Text &#039;&#039;pca&#039;&#039; in Namen enthalten. Die URL muss bis FHEM-Updatestand vom 26.03.2015 dafür auf &amp;lt;code&amp;gt;/fhem?cmd=style eventMonitor pca&amp;lt;/code&amp;gt; abgeändert / ergänzt werden, der angewendete Filter wird unter dem Befehlseingabefeld angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der Filter funktioniert bis FHEM-Updatestand vom 26.03.2015 nur auf den Device Namen bzw. Teile davon, nicht jedoch auf den Device Typ (im gezeigten Beispiel würde also ein Filtern auf PCA301 nicht funktionieren).&lt;br /&gt;
&lt;br /&gt;
Mit FHEM-Update vom 27.03.2015 wurde Aufruf und Bedienung des Event Monitors vereinfacht sowie die Filtermöglichkeiten ausgebaut. Der Filter muss nicht mehr über eine Anpassung der URL, sondern kann direkt im Event Monitor dialogunterstützt eingestellt werden. Es sind nun auch Filter auf Device Typ möglich und es kann ein beliebiger regulärer Ausdruck in Perl für den Filter genutzt werden. Bei Aufruf des Event Monitors werden zunächst weiterhin alle Events angezeigt. Erkennbar an der Titelzeile &amp;quot;Events (Filter:.*):&amp;quot;. Durch Anklicken des &amp;quot;.*&amp;quot; in der Titelzeile öffnet sich eine Dialogbox in der man einen regulären Ausdruck eintragen kann. Nach Bestätigung der Dialogbox mit OK wird dieser reguläre Ausdruck zum Filtern der Events genutzt und in der Titelzeile angezeigt (bspw. &amp;quot;Events (Filter:pca):&amp;quot;). Beispiele zu den neuen Filtermöglichkeiten enthält dieser {{Link2Forum|Topic=12398|Message=278553|LinkText=Forenbeitrag}}.&lt;br /&gt;
&lt;br /&gt;
== Geräte anlegen/ändern ==&lt;br /&gt;
Der [[Event monitor]] bietet die Möglichkeit aus einer markierten [[Event]]-Zeile Gerätedefinitionen abzuleiten und die [[Gerät|Geräte]] anzulegen.&lt;br /&gt;
Es können Definitionen für folgende Gerätemodule angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[FileLog]]&lt;br /&gt;
* [[notify]]&lt;br /&gt;
* [[sequence]]&lt;br /&gt;
* [[watchdog]]&lt;br /&gt;
&lt;br /&gt;
Für einige [[Gerät|Geräte]] können die Definitionen auch geändert werden. Die [[Gerätename|Gerätenamen]] werden in einer Auswahlliste angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== Vorgehensweise beim Anlegen eines Gerätes ===&lt;br /&gt;
* [[Event]]-Zeile komplett markieren&lt;br /&gt;
* den Knopf {{Taste|Create/Modify Device}} betätigen&lt;br /&gt;
* ein Gerätemodul auswählen&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039; auswählen&lt;br /&gt;
* die gewünschte Form des [[Event|Events]] auswählen&lt;br /&gt;
* den Knopf {{Taste|OK}} betätigen&lt;br /&gt;
Danach öffnet sich die Detailansicht des angelegten [[Gerät|Gerätes]], dort kann die Definition weiter bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
=== Vorgehensweise beim Ändern eines Gerätes ===&lt;br /&gt;
* [[Event]]-Zeile komplett markieren&lt;br /&gt;
* den Knopf {{Taste|Create/Modify Device}} betätigen&lt;br /&gt;
* &#039;&#039;&#039;Modify&#039;&#039;&#039; auswählen&lt;br /&gt;
* ein [[Gerät]] auswählen&lt;br /&gt;
* die gewünschte Form des [[Event|Events]] auswählen&lt;br /&gt;
* den Knopf {{Taste|OK}} betätigen&lt;br /&gt;
Danach öffnet sich die Detailansicht des angelegten [[Gerät|Gerätes]], dort kann die Definition weiter beatbeitet werden.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
=== Die eventMonitor-URL kann nicht erfolgreich aufgerufen werden ===&lt;br /&gt;
&lt;br /&gt;
Der Event-Monitor kann bei aktiviertem CSRF&amp;lt;ref&amp;gt;[https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery Cross-Site-Request-Forgery] - Wikipedia&amp;lt;/ref&amp;gt;-Schutz (FHEMWEB Attribut &amp;lt;code&amp;gt;csrfToken&amp;lt;/code&amp;gt;) nur aus dem FHEMWEB-Frontend heraus geöffnet werden. Es handelt sich hierbei um einen Sicherheitsmechanismus, welcher seit Feature-Level 5.8 standardmäßig aktiviert ist. Jeder Aufruf des Event-Monitors in FHEMWEB muss standardmäßig das aktuell gültige CSRF-Token im URL-Aufruf enthalten um den Event-Monitor angezeigt zu bekommen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;/fhem?cmd=style%20eventMonitor&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;fwcsrf=csrf_193851249212150&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieses Verhalten kann durch das FHEMWEB Attribut &amp;lt;code&amp;gt;csrfToken&amp;lt;/code&amp;gt; (siehe {{Link2CmdRef|Lang=de|Anker=csrfToken}}) verändert werden. Details dazu finden sich in dem Artikel [[CsrfToken-HowTo]].&lt;br /&gt;
&lt;br /&gt;
=== Event Monitor schreibt keine Events ===&lt;br /&gt;
Es sind diverse Situationen bekannt geworden, in denen der Event Monitor keine Events schreibt, z.B.:&lt;br /&gt;
* aufgrund von Problemen mit dem {{Link2Forum|Topic=35715|Message=291061|LinkText=Netzwerkkartentreiber &#039;&#039;E2200 KILLER&#039;&#039;}}&lt;br /&gt;
* {{Link2Forum|Topic=35715|Message=289167|LinkText=Firewall (Sophos)}}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=12398}} &#039;&#039;Filter im Event Monitor&#039;&#039;&lt;br /&gt;
* [[Event|Event, Ereignis]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Z-Wave-FIB_FGRM-222-Rollladenaktor&amp;diff=25502</id>
		<title>Z-Wave-FIB FGRM-222-Rollladenaktor</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Z-Wave-FIB_FGRM-222-Rollladenaktor&amp;diff=25502"/>
		<updated>2018-02-27T05:57:13Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Links */Links zu den Manuals funktionierten nicht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=Z-Wave-FIB FGRM-222.JPG&lt;br /&gt;
|Bildbeschreibung=Fibaro FGRM-222&lt;br /&gt;
|HWProtocol=Z-Wave &lt;br /&gt;
|HWType=Sensor, Sender und Aktor, Empfänger&lt;br /&gt;
|HWCategory=Z-Wave&lt;br /&gt;
|HWComm=Funk 868MHz&lt;br /&gt;
|HWChannels=2&lt;br /&gt;
|HWVoltage=230V~&lt;br /&gt;
|HWPowerConsumption=&amp;lt;0,8W&lt;br /&gt;
|HWPoweredBy=230V~&lt;br /&gt;
|HWSize=42x37x17mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#ZWave Z-Wave]&lt;br /&gt;
|HWManufacturer=[http://www.fibaro.com/de Fibar Group]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Z-Wave-FIB FGRM-222-Rollladenaktor]] ist ein Jalousiesteuereinsatz für die Steuerung von Rollos, Markisen, Jalousien, Garagentoren und anderen Einphasen-Wechselstrom-Geräten mit Energiemessfunktion&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Der Jalousieaktor bietet Positionserkennung, spezielle Steuerkommandos für Lammellen (Winkelverstellung) und misst den Energieverbrauch.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Inklusion === &lt;br /&gt;
Der Aktor wird bei der Inklusion und aktivierten autocreate vollautomatisch erkannt und definiert. Zur Steuerung von Lamellen von Jalousien muss das Kommando &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; model&amp;lt;/code&amp;gt; erfolgreich ausgeführt worden sein, damit die speziellen Fibaro-Kommandos zur Lammellensteuerung bereitstehen.&lt;br /&gt;
 &lt;br /&gt;
=== Assoziation ===&lt;br /&gt;
Der Controller muss zur korrekten Funktion in die Assoziationsgruppe 3 des Aktors aufgenommen werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; associationAdd 3 &amp;lt;Controller-NodeID&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies wird aufgrund der Informationen in der XML-Config-Datei für den FGRM-222 automatisch bei der Inklusion durchgeführt. Bitte die korrekte Verarbeitung des Befehls per &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; association 3&amp;lt;/code&amp;gt; überprüfen.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
{{Randnotiz|RNText=Ab {{Link2Forum|Topic=37121|Message=294480|LinkText=Updatestand 15.05.2015}} wird bei der Inklusion von Geräten automatisch der Befehl &amp;lt;code&amp;gt;get &amp;lt;name&amp;gt; model&amp;lt;/code&amp;gt; ausgeführt.}}&lt;br /&gt;
Das Gerät von FHEM einmalig durch folgenden Befehl identifizieren:   &lt;br /&gt;
:&amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; model&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Readings &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modelID&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;modelConfig&amp;lt;/code&amp;gt; werden dadurch erzeugt. In &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt; steht nach korrekter Ausführung des Befehls der Klartextname des Gerätes &amp;quot;FIBARO System FGRM222 Roller Shutter Controller 2&amp;quot;. Zudem sind dann spezielle set/get-Kommandos configXYZ des Gerätes im Auswahldialog der Detailansicht mit den zugehörigen Hilfetexten verfügbar.&lt;br /&gt;
&lt;br /&gt;
Der Aktor muss anschließend kalibriert werden. Dazu Parameter 29 auf 1 setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configByte 29 1&amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configForcedRollerShutterCalibration StartCalibrationProcess&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Aktor fährt die Rolllade zur Kalibrierung vollständig hoch, runter und wieder hoch. &lt;br /&gt;
&lt;br /&gt;
==== Rollladen ====&lt;br /&gt;
Nach Kalibrierung kann die Rolllade sofort prozentual durch&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; dim &amp;lt;%&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
gesteuert werden. Weitere Parametereinstellung sind grundsätzlich nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig wird die Rollladenposition mit &amp;quot;off&amp;quot;, &amp;quot;dimXY&amp;quot; (xy=1-99) und &amp;quot;on&amp;quot; angezeigt.&lt;br /&gt;
Möchte man das Reading &amp;quot;position&amp;quot; mit aussschließlich zahlenmäßiger Angabe der Position haben, dann muss die Konfiguration für den Versand des Fibaro-Reports angepasst werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configByte 3 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configReportsType BlindPositionReportsSentToThe1 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Jalousie mit Lammellen ====&lt;br /&gt;
Zur Steuerung von Jalousien mit Lammellen ist der Jalousiemodus mit Positionsunterstützung zu wählen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configByte 10 2 &amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configRollerShutterOperatingModes VenetianBlindModeWithPositioning &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Jalousie-Positions-Report sollte als Fibaro Kommando an den Controller gesendet werden, da nur so der eingestellte Winkel vom Aktor an den Controller gesendet wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configByte 3 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; configReportsType BlindPositionReportsSentToThe1 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zudem ist die Zeit für ein vollständiges Drehen der Lammellen einzustellen:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;set &amp;lt;device&amp;gt; configWord 12 &amp;lt;time&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;set &amp;lt;device&amp;gt; configInVenetianBlindModeTheParameter12 &amp;lt;time&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen dieser Parameter kann die Jalousie mit Lammellen folgermaßen gesteuert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; positionSlat &amp;lt;%&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Fährt die Lammelle in den angegebenen Winkel.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; positionBlind &amp;lt;%&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Fährt die Jalousie zur angegebenen Position und fährt die Lammellen auf Position 0% (geschlossen).&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausnahme: Bei sehr geringen Änderungen an der Ausgangsposition (ca. 1-3%) wird der zuletzt gewählt Winkel der Lammellen wieder hergestellt.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; dim &amp;lt;%&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Fährt die Jalousie zur angegebenen Position und fährt die Lammellen in den zuletzt per &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; positionSlat &amp;lt;%&amp;gt;&amp;lt;/code&amp;gt; gewählten Winkel.&lt;br /&gt;
&lt;br /&gt;
Obige Hinweise beziehen sich auf einen Aktor ohne örtliche Steuerung durch Taster/Schalter. Auswirkungen einer örtlichen Steuerung auf die FHEM-Befehle (Winkeleinstellungen!) können daher nicht beurteilt werden.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Ein exemplarischer Auszug aus der [[Konfiguration]]:&lt;br /&gt;
 define ZWave_SWITCH_MULTILEVEL_4 ZWave e345c452 4&lt;br /&gt;
 attr ZWave_SWITCH_MULTILEVEL_4 IODev ZWDongle_0&lt;br /&gt;
 attr ZWave_SWITCH_MULTILEVEL_4 classes MANUFACTURER_SPECIFIC VERSION CONFIGURATION ASSOCIATION SWITCH_BINARY POWERLEVEL METER SENSOR_MULTILEVEL FIRMWARE_UPDATE_MD SWITCH_BINARY MANUFACTURER_PROPRIETARY PROTECTION MARK METER SENSOR_MULTILEVEL MANUFACTURER_PROPRIETARY SCENE_ACTIVATION SWITCH_MULTILEVEL SWITCH_BINARY&lt;br /&gt;
 attr ZWave_SWITCH_MULTILEVEL_4 room ZWave&lt;br /&gt;
 define FileLog_ZWave_SWITCH_MULTILEVEL_4 FileLog ./log/ZWave_SWITCH_MULTILEVEL_4-%Y.log ZWave_SWITCH_MULTILEVEL_4&lt;br /&gt;
 attr FileLog_ZWave_SWITCH_MULTILEVEL_4 logtype text&lt;br /&gt;
 attr FileLog_ZWave_SWITCH_MULTILEVEL_4 room ZWave&lt;br /&gt;
&lt;br /&gt;
=== Logbeispiel ===&lt;br /&gt;
Log mit Parameter 3 auf 0 = Jalousie Positions Report wird als Z-Wave Kommando an Primärcontroller gesendet. (Standardeinstellung) &lt;br /&gt;
&lt;br /&gt;
 2014-09-27_13:41:46 ZWave_SWITCH_MULTILEVEL_4 power: 81.6 W&lt;br /&gt;
 2014-09-27_13:42:36 ZWave_SWITCH_MULTILEVEL_4 power: 59.5 W&lt;br /&gt;
 2014-09-27_13:42:41 ZWave_SWITCH_MULTILEVEL_4 power: 0.0 W&lt;br /&gt;
 2014-09-27_13:42:41 ZWave_SWITCH_MULTILEVEL_4 dim 95&lt;br /&gt;
 2014-09-27_13:42:41 ZWave_SWITCH_MULTILEVEL_4 reportedState: dim 95&lt;br /&gt;
 2014-09-27_13:44:40 ZWave_SWITCH_MULTILEVEL_4 dim 53&lt;br /&gt;
 2014-09-27_13:44:41 ZWave_SWITCH_MULTILEVEL_4 power: 85.1 W&lt;br /&gt;
 2014-09-27_13:45:05 ZWave_SWITCH_MULTILEVEL_4 dim 53&lt;br /&gt;
 2014-09-27_13:45:05 ZWave_SWITCH_MULTILEVEL_4 reportedState: dim 53&lt;br /&gt;
 2014-09-27_13:45:05 ZWave_SWITCH_MULTILEVEL_4 power: 0.0 W&lt;br /&gt;
 2014-09-27_13:45:20 ZWave_SWITCH_MULTILEVEL_4 dim 0&lt;br /&gt;
 2014-09-27_13:45:21 ZWave_SWITCH_MULTILEVEL_4 power: 85.8 W &lt;br /&gt;
 2014-09-27_13:45:55 ZWave_SWITCH_MULTILEVEL_4 off&lt;br /&gt;
 2014-09-27_13:45:55 ZWave_SWITCH_MULTILEVEL_4 reportedState: off&lt;br /&gt;
 2014-09-27_14:54:46 ZWave_SWITCH_MULTILEVEL_4 energy: 0.01 kWh&lt;br /&gt;
&lt;br /&gt;
Log mit Parameter 3 auf 1 = Jalousie Positions Report wird als Fibaro Kommando an Primärcontroller gesendet.&lt;br /&gt;
 2014-09-28_14:33:55 ZWave_SWITCH_MULTILEVEL_4 positionBlinds 15&lt;br /&gt;
 2014-09-28_14:34:01 ZWave_SWITCH_MULTILEVEL_4 position: Blind 15 Slat 25&lt;br /&gt;
 2014-09-28_14:34:01 ZWave_SWITCH_MULTILEVEL_4 power: 0.0 W&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Hersteller-Anleitung: [https://manuals.fibaro.com/content/manuals/en/FGR-222/FGR-222-EN-A-v1.1.pdf PDF], englisch&lt;br /&gt;
* Zwaveeurope-Anleitung: [http://manuals-backend.z-wave.info/make.php?lang=DE&amp;amp;sku=FIB_FGRM-222 HTML], deutsch&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Z-Wave Components|Rolladen]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;br /&gt;
[[Kategorie:Energieverbrauchsmessung]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic&amp;diff=25501</id>
		<title>HomeMatic</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic&amp;diff=25501"/>
		<updated>2018-02-27T05:20:03Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Protokoll */Tippfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HomeMatic&#039;&#039;&#039; (HM) ist ein System des Herstellers eQ-3 zur Steuerung und Überwachung von zahlreichen Aufgaben und Situationen im Haus. Erhältlich sind sowohl Geräte mit Funkschnittstelle 868.3 MHz, als auch (seit 2008) drahtgebundene Geräte mit RS485-Schnittstelle. Im Programm sind Geräte zur Heizungs- und Lichtsteuerung, Temperatur-, Luftfeuchte- und Feuchtemessung, Zutrittskontrolle, als Wasser-, Brand- und Bewegungsmelder sowie als Wetterstation, ferner gibt es noch Fernbedienungen und Statusdisplays.&lt;br /&gt;
&lt;br /&gt;
Das ähnliche klingende &#039;&#039;&#039;&#039;&#039;[[HomeMatic IP]]&#039;&#039;&#039;&#039;&#039; ist eine neue Generation von Geräten und Funkprotokoll (HM-IP: IP over BidCos). Die dort angebotenen Geräte lassen sich über den Einsatz einer (physischen) CCU2 oder anderen Lösungen wie YHAM, raspberrymatic usw. und den [[HMCCU|HomeMatic-Modulen]] integrieren.&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
HomeMatic-Geräte können untereinander &#039;&#039;gepeert&#039;&#039; werden (engl. &#039;&#039;peers&#039;&#039; = &amp;quot;Gleiche&amp;quot;), im einfachsten Fall kann deshalb bereits ein Sensor (z.B. ein Temperatursensor) mit einem Aktor (z.B. einem Heizkörperregler) verbunden werden und diesen steuern. Hierbei können mehrere Sensoren und Aktoren untereinander verbunden werden, die Vorstellung der &amp;quot;Gleichen&amp;quot; ist also zutreffend.&lt;br /&gt;
&lt;br /&gt;
HomeMatic-Geräte können auch mit einer Zentrale verbunden (&#039;&#039;gepairt&#039;&#039;) werden, die dann einen Teil der Steuerungslogik übernehmen kann. Bei dieser Verbindung spricht man vom &#039;&#039;Pairing&#039;&#039;, weil jedes HomeMatic-Gerät nur mit einer Zentrale verbunden werden kann. Gepairte Geräte können auch nicht mehr direkt gepeert werden - dies geht dann nur noch unter Beteiligung der Zentrale.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
Für den Betrieb ohne Zentrale sind keine weiteren Voraussetzungen zu erfüllen.&lt;br /&gt;
===Zentrale von eQ-3===&lt;br /&gt;
Vom Hersteller eQ-3 selbst wird eine Zentrale (derzeit aktuell CCU-2) und Windows-Software zur Steuerung und Auswertung der HM-Komponenten angeboten. Diese Zentrale kann wie eingangs dargestellt über das Modul [[HMCCU]] in FHEM eingebunden werden und dann neben HM-IP- und HM-wired-Komponenten auch solche mit BidCoS verwalten.&lt;br /&gt;
&lt;br /&gt;
===FHEM als Zentrale===&lt;br /&gt;
Zur Kommunikation mit HomeMatic benötigt FHEM eine Schnittstelle, die im 868,3-MHz-Band funken kann. Infrage kommen:&lt;br /&gt;
* [[HM-MOD-RPI-PCB HomeMatic Funkmodul f%C3%BCr Raspberry_Pi]] (RPI, WLAN, LAN, USB)&lt;br /&gt;
* [[HM-LGW-O-TW-W-EU Funk-LAN Gateway]] (LAN)&lt;br /&gt;
* [[HM-CFG-LAN]] (oft auch &amp;quot;HMLAN&amp;quot; genannt; LAN; nicht mehr lieferbar)&lt;br /&gt;
* [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]] (USB, nicht mehr lieferbar)&lt;br /&gt;
* [[CUL]] und andere Geräte mit CC110x-Transceiver, [[CUNO]], SelbstbauCUL, nanoCUL, umgeflashter MAX-Cube, MapleCUx, CUNX usw. (USB, GPIO, LAN , WLAN)&lt;br /&gt;
&lt;br /&gt;
Erfahrungsgemäß ist der Einsatz originaler HomeMatic IOs empfehlenswert, da es bei allen CUL-Derivaten immer wieder zu Schwierigkeiten kommen kann, vor allem in größeren Installationen und bei der Kommunikation mit komplexeren Geräten. Wer dennoch einen CUL für HomeMatic verwenden will, sollte eine speziell für den Betrieb mit HomeMatic optimierte CUL-firmware ([https://forum.fhem.de/index.php/topic,24436.0.html TimeStamp Firmware]) verwenden. Bei HomeMatic ist das Timing der Telegramme entscheidend sonst kann es zu &amp;quot;MISSING_ACK&amp;quot; bzw. &amp;quot;RESPONSE TIMEOUT:RegisterRead&amp;quot; u.ä. Meldungen kommen! Zusätzlich sind &#039;&#039;&#039;unbedingt&#039;&#039;&#039; die Hinweise im Artikel [[AES_Encryption]] zu beachten!&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;HomeMatic Wired&#039;&#039; benötigt man eine RS485-Schnittstelle. Das &amp;quot;offizielle&amp;quot; Gateway [[HomeMatic Wired RS485 LAN Gateway|HMW-LGW-O-DR-GS-EU]] (LAN) funktioniert prinzipiell mit FHEM, der Einsatz wird aber nicht empfohlen. Hier gibt es Alternativen dazu: [[Serial/Netzwerk-RS485-Adapter]].&lt;br /&gt;
&lt;br /&gt;
===Migration von CCU-2 zu FHEM===&lt;br /&gt;
Der Umzug einer bestehenden HomeMatic Installation von einer HomeMatic CCU-2 auf FHEM ist möglich. Um die an die Zentrale angebundenen Devices in FHEM ohne größere Umkonfiguration weiter verwenden zu können, muß die HM-Id und, falls verwendet, die AES-Schlüssel der CCU-2 in FHEM übernommen werden. Um diese Daten aus der CCU-2 auszulesen, wird eine SSH-Verbindung (zum Beispiel mit PuTTY unter Windows) aufgebaut. Die HM-Id befindet sich in der Datei &amp;lt;code&amp;gt;/usr/local/etc/config/rfd/BidCoS-RF.dev&amp;lt;/code&amp;gt; in einer Zeile wie dieser:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;device serial=&amp;quot;BidCoS-RF&amp;quot; type=&amp;quot;HM-RCV-50&amp;quot; address=&amp;quot;&amp;lt;span style=&amp;quot;color: maroon; font-weight: bold;&amp;quot;&amp;gt;0xABCDEF&amp;lt;/span&amp;gt;&amp;quot; aes_key_index=&amp;quot;0&amp;quot; firmware_version=&amp;quot;2.11.9&amp;quot; bidcos_interface=&amp;quot;KEQ1234567&amp;quot; roaming=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die HM-Id ist der Wert des &amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;-Attributs. Die dort angegebene hexadezimale Zahl (hier &amp;lt;code&amp;gt;0xABCDEF&amp;lt;/code&amp;gt;) ist die HM-Id und wird in FHEM ohne das &amp;quot;0x&amp;quot;-Präfix verwendet.&lt;br /&gt;
&lt;br /&gt;
Falls AES-Schlüssel eingerichtet sind, sind diese in der Datei &amp;lt;code&amp;gt;/etc/config_templates/crypttool.cfg&amp;lt;/code&amp;gt; zu finden und können 1:1 als Schlüssel im [[HM-CFG-LAN]] in der gleichen Reihenfolge hinterlegt werden.&lt;br /&gt;
{{Todo|Wie werden AES-Schlüssel in HM-CFG-LAN &amp;quot;hinterlegt&amp;quot;?}}&lt;br /&gt;
&lt;br /&gt;
==Protokoll==&lt;br /&gt;
HM-Geräte kommunizieren untereinander mit dem Protokoll &#039;&#039;Bidirectional Communication Standard&#039;&#039;, abgekürzt &#039;&#039;BidCoS&#039;&#039;. Jedes HM-Gerät enthält also Sender und Empfänger, das ist einer der wesentlichen Unterschiede z.B. zum FS20-System.&lt;br /&gt;
*Jedes HM-Gerät meldet beim Empfang eines Steuerbefehls durch einen Peer an diesen eine Bestätigung „ACK“ zurück. Erkennt das HM-Gerät den Befehl nicht, sendet es ein &#039;&#039;NACK&#039;&#039;. Kommt vom HM-Gerät keine Rückmeldung innerhalb einer festgelegten Zeit, meldet der steuernde Peer ein &#039;&#039;MISSING ACK&#039;&#039;.&lt;br /&gt;
*Jedes HM-Gerät meldet ferner seinen Status nach dem Erhalt eines Steuerbefehls zurück - so kann auch ein lokal am Gerät erfolgender Tastendruck in beim steuernden Peer oder  in der Zentrale registriert werden.&lt;br /&gt;
&lt;br /&gt;
Das Protokoll &#039;&#039;BidCoS&#039;&#039; wurde zum großen Teil entschlüsselt, seine offen verfügbare Variante heißt &#039;&#039;AskSin&#039;&#039;. Unter Verwendung der AskSin-Library entstehen derzeit erste Geräte, die in das HomeMatic-System eingebunden werden können. Zur Unterscheidung zwischen HM und den neuen Geräten werden diese als [[HomeBrew]] (HB) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
=Betrieb mit FHEM=&lt;br /&gt;
Die Kenntnis des Dokumentes [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Einsteigerdokuments &amp;quot;Heimautomatisierung mit FHEM&amp;quot;] wird vorausgesetzt. Im Anhang dieses Dokuments findet sich ein Teil über den Aufbau und die Funktion von HM-Geräten.&lt;br /&gt;
&lt;br /&gt;
=== Einrichten des IO-Devices (Funkschnittstelle)===&lt;br /&gt;
Zuerst muss ein IO-Device eingerichtet werden, um mit HM Geräten kommunizieren zu können. Hier ist eine Liste der [[HomeMatic#FHEM als Zentrale|Schnittstellen]].&lt;br /&gt;
&lt;br /&gt;
=== Struktur von HM Geräten===&lt;br /&gt;
HM Geräte sind logisch in ein &#039;&#039;&#039;Device (Gerät)&#039;&#039;&#039; und ein oder mehrere &#039;&#039;&#039;Channels (Kanäle)&#039;&#039;&#039; gegliedert. Jedes Device und jeder Channel wird in einer Entity in FHEM repräsentiert. &amp;lt;br&amp;gt;&lt;br /&gt;
Ausnahme: Sollte ein Gerät nur einen Kanal haben werden diese zusammen in einer Entity angelegt. &lt;br /&gt;
====Device====&lt;br /&gt;
Das Device ist für die Kommunikation verantwortlich. Es sortiert und ordnet die zu sendenden und empfangenden Nachrichten. &lt;br /&gt;
Man kann prüfen, ob alle Nachrichten übertragen sind, oder ob es Probleme gegeben hat. Die Variablen &amp;quot;prot...&amp;quot; geben Auskunft darüber. Siehe auch [[Homematic_HMInfo#protoEvents]].&lt;br /&gt;
Zu beachten sind zudem die Übertragungsmodi. Nicht alle Devices sind ständig auf Empfang - FHEM muss berücksichtigen, wann gesendet werden kann. In &#039;&#039;&#039;protState&#039;&#039;&#039; kann man sehen, ob Kommandos auf Verarbeitung warten, also pending sind. Einige Devices unterstützen mehrere Modi parallel. &lt;br /&gt;
&lt;br /&gt;
===== Config=====&lt;br /&gt;
Wird von allen Devices unterstützt, auch wenn es bei Always kaum genutzt werden kann.&lt;br /&gt;
Man setzt die Kommandos in FHEM ab und diese warten in der Kommando-Queue.  &lt;br /&gt;
Wenn die Config-Funktion am Device ausgelöst wird (Anlerntaste drücken) sendet FHEM die wartenden Nachrichten der Reihe nach. Config wird bei allen Devices zum Pairen genutzt.&lt;br /&gt;
&lt;br /&gt;
===== Always=====&lt;br /&gt;
Trifft man meist bei netzbetriebenen Geräten an, da diese kein Problem mit dem Energieverbrauch haben. Man kann immer mit dem Device kommunizieren.&lt;br /&gt;
&lt;br /&gt;
===== Burst=====&lt;br /&gt;
Nur der Empfänger des Device ist aktiv. Über eine Aufweck-Sequenz kann das Device geweckt werden. Man kann quasi immer mit dem Device kommunizieren. Nachteil des Aufwecken ist zum Einen, dass immer ALLE Devices im Funknetz geweckt werden, was deren Batterie belastet. Zum Anderen ist die Aufweck-Sequenz funktechnisch aufwändig und belastet die maximal erlaubte Sendekapazität des IO device je Stunde. &lt;br /&gt;
&lt;br /&gt;
===== ConditionalBurst=====&lt;br /&gt;
Bei einigen Devices kann man den Burst mode zuschalten. Dies sind Devices, die zusätzlich über andere modi verfügen, so z.B. wakeup. Schaltet man Burst-Empfang ein kann man immer und sofort mit dem Device reden, es kostet aber etwas mehr Batterie. Siehe hierzu Attribut &#039;&#039;&#039;burstAccess&#039;&#039;&#039;, Kommando &#039;&#039;&#039;burstXmit&#039;&#039;&#039; und Register &#039;&#039;&#039;burstRx&#039;&#039;&#039;&lt;br /&gt;
===== LazyConfig=====&lt;br /&gt;
Kommandos in der Queue werden bearbeitet, wenn eine Aktion vom Device ausgeht. So zum Beispiel ein Tastendruck bei einer Fernbedienung.&lt;br /&gt;
Dieser mode wird von CUL/CUNO nicht unterstützt. FHEM ignoriert diese Option automatisch und wartet i.A. auf ein Config.&lt;br /&gt;
===== Wakeup=====&lt;br /&gt;
Die Devices wachen regelmäßig auf und senden Daten, z.B. Temperatursensoren. Zu diesem Zeitpunkt kann FHEM die Nachrichten übertragen. Die Aufwachperiode ist unterschiedlich von 3 min bis zu 24h.&lt;br /&gt;
&lt;br /&gt;
====Channel====&lt;br /&gt;
Ein Kanal ist die Funktionseinheit des Geräts. Hier ist die Funktion des Sensors oder Aktors realisiert.&lt;br /&gt;
&lt;br /&gt;
Nutzt ein Gerät nur einen Kanal, wird dieser in FHEM der Übersichtlichkeit halber nicht einzeln angelegt. Für die Kommandos und das Peering wird trotzdem die HM-ID des 1. Kanals verwendet.&lt;br /&gt;
&lt;br /&gt;
Nutzt ein Gerät hingegen mehrere Kanäle, werden diese per [[autocreate]] zusätzlich zum Device angelegt. Es ist aber möglich, bei Geräten mit virtuellen Kanälen, diese zu löschen und fehlende Attribute manuell dem Device hinzu zu fügen. Danach kann es wie ein 1-Kanal-Gerät genutzt werden. Allerdings werden die Kanäle beim erneuten Pairing von [[autocreate]] neu angelegt.&lt;br /&gt;
&lt;br /&gt;
=====virtuelle Kanäle=====&lt;br /&gt;
Einige Dimmer unterstützen virtuelle Kanäle. Eigentlich haben sie keinen Hauptkanal sondern nur 3 virtuelle Kanäle, die je nach Verknüpfungslogik, den endgültigen Zustand des Aktors bestimmen. Dieses Verhalten wird in jedem Kanal per Register &#039;&#039;&#039;logicCombination&#039;&#039;&#039; gesetzt. &amp;lt;br /&amp;gt;&lt;br /&gt;
Folgende Logik wird dabei angewendet: &amp;lt;tt&amp;gt;phyLevel = (((0% o Ch1) o Ch2) o Ch3)&amp;lt;/tt&amp;gt;  [o = Logik-Platzhalter] &lt;br /&gt;
&lt;br /&gt;
D.h. es wird immer der Kanal mit dem gesetzten Register mit dem vorherigen Teilergebnis kombiniert, angefangen mit Kanal1. &amp;lt;br /&amp;gt;&lt;br /&gt;
Es gibt folgende Logik-Optionen: [einzelne Betrachtung von &amp;lt;tt&amp;gt;(Vorergebnis o Kanal)&amp;lt;/tt&amp;gt;]&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;&amp;quot;|Wert!!style=&amp;quot;text-align:left;&amp;quot;|Bedeutung!!style=&amp;quot;text-align:left;&amp;quot;|Beispiel (alle Werte in %)&lt;br /&gt;
|-&lt;br /&gt;
|inactive||keine Verknüpfung|| 30 inactive 80 = 30&lt;br /&gt;
|-&lt;br /&gt;
|or||oder (höchster Wert zählt)|| 30 or 80 = 80&lt;br /&gt;
|-&lt;br /&gt;
|and||und (kleinster Wert zählt)|| 30 and 80 = 30&lt;br /&gt;
|-&lt;br /&gt;
|xor||entweder-oder (nur 1 Kanal darf über 0% sein)|| 30 xor 80 = 0 &#039;&#039;aber&#039;&#039; 30 xor 0 = 30&lt;br /&gt;
|-&lt;br /&gt;
|nor||oder negiert (höchster Wert subtrahiert von 100%)|| 30 nor 80 &#039;&#039;= !80&#039;&#039; = 20&lt;br /&gt;
|-&lt;br /&gt;
|nand||und negiert (niedrigster Wert subtrahiert von 100%)|| 30 nand 80 &#039;&#039;= !30&#039;&#039; = 70&lt;br /&gt;
|-&lt;br /&gt;
|orinv||oder mit invertiertem Kanal|| 30 orinv 80 &#039;&#039;= 30 or 20&#039;&#039; = 30&lt;br /&gt;
|-&lt;br /&gt;
|andinv||und mit invertiertem Kanal|| 30 andinv 80 &#039;&#039;= 30 and 20&#039;&#039; = 20&lt;br /&gt;
|-&lt;br /&gt;
|plus||Vorergebnis addiert mit Kanal|| 30 plus 80 = 100&lt;br /&gt;
|-&lt;br /&gt;
|minus||Vorergebnis subtrahiert mit Kanal|| 30 minus 80 = 0&lt;br /&gt;
|-&lt;br /&gt;
|mul||Vorergebnis multipliziert mit Kanal|| 30 mul 80 = 24&lt;br /&gt;
|-&lt;br /&gt;
|plusinv||Vorergebnis addiert mit invertiertem Kanal|| 30 plusinv 80 &#039;&#039;= 30 plus 20&#039;&#039; = 50&lt;br /&gt;
|-&lt;br /&gt;
|minusinv||Vorergebnis subtrahiert mit invertiertem Kanal|| 30 minusinv 80 &#039;&#039;= 30 minus 20&#039;&#039; = 10&lt;br /&gt;
|-&lt;br /&gt;
|mulinv||Vorergebnis multipliziert mit invertiertem Kanal|| 30 mulinv 80 &#039;&#039;= 30 mul 20&#039;&#039; = 6&lt;br /&gt;
|-&lt;br /&gt;
|invPlus||invertiertes Vorergebnis addiert mit Kanal|| 30 invPlus 80 &#039;&#039;= 70 plus 80&#039;&#039; = 100&lt;br /&gt;
|-&lt;br /&gt;
|invMinus||invertiertes Vorergebnis subtrahiert mit Kanal|| 30 invMinus 80 &#039;&#039;= 70 minus 80&#039;&#039; = 0&lt;br /&gt;
|-&lt;br /&gt;
|invMul||invertiertes Vorergebnis multipliziert mit Kanal|| 30 invMul 80 &#039;&#039;= 70 mul 80&#039;&#039; = 56&lt;br /&gt;
|}&lt;br /&gt;
: &#039;&#039;→ Siehe auch: [[HM-LC-Dim1PWM-CV Dimmaktor PWM DC-LED#Beispiele|Verknüpfungsbeispiel]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Variablen===&lt;br /&gt;
Wie alle FHEM Entities werden 4 Gruppen von Daten unterstützt: &lt;br /&gt;
* Internals: Im Web-Interface sichtbare Variablen, die allgemeine Informationen über den Zustand enthalten.&lt;br /&gt;
* Readings: Im Web-Interface sichtbare Variablen. Sie werden aus von Entities empfangenen Nachrichten generiert. Man kann mit notify Trigger auf diese setzen. Readings werden im Statefile bei save und gewissen neustarts gesichert und beim Booten eingelesen. Readings haben einen Zeitstempel. &lt;br /&gt;
* Attribute: Im Web-Interface sichtbare Variablen. Über sie kann man die Eigenschaften der Entity in FHEM steuern. &lt;br /&gt;
* Helper: Im Web-Interface nicht sichtbare Variablen. Man kann sie mit dem Kommando &#039;list&#039; sehen. Es sind Hilfsvariablen, die für den User keine Bedeutung haben sollen. &lt;br /&gt;
==== Internals====&lt;br /&gt;
Viele Variablen sind nicht HM spezifisch - deren Bedeutung muss im allgemeinen Teil nachgelesen werden. Spezifische Variablen sind:&lt;br /&gt;
*Device&lt;br /&gt;
** channel_xx: Liste der Kanäle, die dem Device zugeordnet sind. &lt;br /&gt;
** prot... : Gruppe von Daten zum Zustand des &amp;lt;u&amp;gt;[[HomeMatic#Protokol|Protokolls]]&amp;lt;/u&amp;gt;, also der Kommunikation mit dem Device.&lt;br /&gt;
** rssi...: Gruppe von Daten die den &amp;lt;u&amp;gt;[[HomeMatic#Rssi|Empfangspegel]]&amp;lt;/u&amp;gt; des Device bei IOs, Peers und Repeatern darstellt. &lt;br /&gt;
&lt;br /&gt;
*Kanäle&lt;br /&gt;
** device: Das übergeordnete Device&lt;br /&gt;
** chanNo: Die Kanalnummer&lt;br /&gt;
** peerList: Ist die Entity mit einem anderen gepeert, so steht hier der Name der Peers. Siehe auch attribut peerIDs und Reading peerList. Diese Variable ist mit dem peer verlinkt, man kann darauf &#039;clicken&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Readings====&lt;br /&gt;
Readings für HM Entities unterliegenden allgemeinen FHEM Regeln. &lt;br /&gt;
Generell gilt, dass ein Wert, der von FHEM gesetzt wurde mit dem prefix &#039;&#039;&#039;&amp;quot;set_&amp;quot;&#039;&#039;&#039; versehen wird. Wenn der Zustand bestätigt ist, wird das set_ entfernt. Sollte man also ein Reading mit diesem prefix haben, das sich nicht selbst entfernt sollt man unbedingt den Zustand kontrollieren. &amp;lt;br&amp;gt;&lt;br /&gt;
So ist nach einem &amp;quot;set Licht on&amp;quot; der Zustand des Licht erst einmal &amp;quot;set_on&amp;quot;. Mit der Antwort des Device wird es dann auf &amp;quot;on&amp;quot; gesetzt. &amp;lt;br&amp;gt;&lt;br /&gt;
Register machen eine Ausnahme:&lt;br /&gt;
&lt;br /&gt;
=====Register=====&lt;br /&gt;
Register sind Konfigurationsparameter, die &#039;&#039;&#039;im Device flash&#039;&#039;&#039; gespeichert werden. Daten, die Registern zugeordnet sind, beginnen mit &amp;quot;R-&amp;quot;. Sollte das Register einem peer zugeordnet sein kommt dieser danach. Der Namen ist also &#039;&#039;&#039;R-&amp;lt;peer&amp;gt;-&amp;lt;registerName&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Der Zugriff ist indirekt, geht also nur über Methoden und Kommandos. Man kann die Konfiguration (Register und peers) mit &#039;&#039;&#039;getConfig&#039;&#039;&#039; aus dem Device lesen und in FHEM dargestellen. FHEM bemüht sich, die angezeigten Register aktuell zu halten - der User muss aber eine gewisse Vorsicht im Umgang damit walten lassen. Register können mit &#039;&#039;&#039;regSet&#039;&#039;&#039; gesetzt werden. Ob die gelesenen Register komplett sind prüft [[Homematic_HMInfo#Integrit.C3.A4tspr.C3.BCfungen|configCheck]]. Da einige Entities viele Register haben kann man mit dem Attribut &#039;&#039;&#039;expert&#039;&#039;&#039; die Sichtbarkeit steuern (siehe auch [[Homematic_HMInfo#Infos|Register]]).&lt;br /&gt;
&lt;br /&gt;
Von einigen Devices sind Register schwer zu lesen, z.B. config devices. Man kann die Register-Readings [[Homematic_HMInfo#archConfig|archivieren]] und beim reboot wieder [[Homematic_HMInfo#archConfig|laden]].&lt;br /&gt;
&lt;br /&gt;
==== Attribute====&lt;br /&gt;
Attribute sind i.A. Parameter, die das Verhalten der Entity steuern. Sie werden mit &#039;&#039;&#039;save&#039;&#039;&#039; in fhem.cfg oder einem seiner subfiles gespeichert. Nach einer Änderung sollte der User ein &amp;quot;save&amp;quot; machen, sonst sind diese nach einem Reboot verloren.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier werden nur &#039;&#039;&#039;HM spezifische Attribute&#039;&#039;&#039; besprochen.&amp;lt;br&amp;gt;&lt;br /&gt;
Attribute, die das System &#039;&#039;&#039;automatisch&#039;&#039;&#039; anlegt. Sollten diese nicht mehr stimmen kann der User anlernen am Device drücken und sie werden wieder hergestellt. Der User sollte sie &#039;&#039;&#039;nicht ändern&#039;&#039;&#039;.&lt;br /&gt;
* model&lt;br /&gt;
* subType&lt;br /&gt;
* peerIDs: HMIds der peers. Wird gelegentlich verschoben!&lt;br /&gt;
* serialNr: auslaufend - durch Reading D-serianNr ersetzt&lt;br /&gt;
* firmware: auslaufend - durch Reading D-firmware ersetzt&lt;br /&gt;
&lt;br /&gt;
Attribute für HM Entities, die der User steuern kann&lt;br /&gt;
* webCmd: FHEM setzt ggf. einen Default, der User kann dies anpassen&lt;br /&gt;
* expert: schaltet mehr oder weniger Readings sichtbar - dient der Übersichtlichkeit des Web-Interface. &lt;br /&gt;
* autoReadReg: steuert das automatische Lesen der Konfiguration - ggf. zeitverzögert um Resourcen zu schonen. Es wird Level 5 empfohlen&lt;br /&gt;
&lt;br /&gt;
Attribute für HM Entities am Device, die der User steuern kann&lt;br /&gt;
* msgRepeat: kann man im Device einstellen. Es legt fest, wie oft eine Nachricht wiederholt werden soll, falls sie nicht empfangen wird. Beachte, dass unabhängig davon ein HMLAN/USB immer 3-mal probiert zu senden. Insbesondere bei Burst Devices sollte man einen niedrigen Level einstellen.&lt;br /&gt;
* IODev: Sollte man auf das IO device setzen, über das zu diesem Device gesendet werden soll. Es wird i.A. beim Pairen gesetzt. &lt;br /&gt;
&lt;br /&gt;
Empfohlene Attribute außerhalb von HM&lt;br /&gt;
* event-on-change-reading .*&lt;br /&gt;
&lt;br /&gt;
===Kommandos===&lt;br /&gt;
====Allgemein====&lt;br /&gt;
* get &amp;lt;name&amp;gt; cmdList &#039;&#039;# zeigt alle Kommandos mit Parametern für diese Entity an&#039;&#039;&lt;br /&gt;
* clear [readings|register|rssi|msgEvents] &#039;&#039;# löschen von Readings oder Zählern&#039;&#039;&lt;br /&gt;
====Register kommandos====&lt;br /&gt;
* set &amp;lt;name&amp;gt; getConfig &#039;&#039;# liest alle Peers und Register. Auf ein Device angewendet werden ALLE channels auch gelesen&#039;&#039;&lt;br /&gt;
* set &amp;lt;name&amp;gt; regSet [prep|exec] &amp;lt;regName&amp;gt; &amp;lt;value&amp;gt; ... [&amp;lt;peerChannel&amp;gt;]&#039;&#039; #schreiben eines Registerwerts. Das Kommando landet im Kommandstack&#039;&#039;&lt;br /&gt;
* set &amp;lt;name&amp;gt; regbulk ...&#039;&#039;# kommando zum Setzen von rohdaten und ganzen Registerlisten. Ausser zum re-configurieren eines ganzen Device eher nicht für den User zu gebrauchen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* set &amp;lt;name&amp;gt; sign [on|off &#039;&#039;# setzt das Register um AES einzuschalten. Man sollte sich über AES &#039;&#039;&#039;vorher&#039;&#039;&#039; einlesen!!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* get &amp;lt;name&amp;gt; regList &#039;&#039;# zeigt alle Register, die diese Entity &#039;&#039;&#039;unterstützt&#039;&#039;&#039; - incl Beschreibung und Wertebereich. Als Anfänger sollte man einmal hinsehen!&#039;&#039;&lt;br /&gt;
* get &amp;lt;name&amp;gt; reg all &#039;&#039;# zeigt alle Register, die diese Entity &#039;&#039;&#039;hat&#039;&#039;&#039; und den aktuellen Wert&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Kommunikation===&lt;br /&gt;
Die Kommunikation zwischen Device und der Zentrale folgt einem Protokoll. Für die meisten Nachrichten erwartet der Sender eine Empfangsbestätigung. FHEM beachtet das Protokoll und implementiert es entsprechend der Fähigkeiten des IO device.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich kann jedes Device an jedes andere Nachrichten senden. Damit dies auch einen erfolg hat, müssen die Kanäle gepeert werden.&lt;br /&gt;
&lt;br /&gt;
Um FHEM zu erlauben, Nachrichten an das Device zu richten muss FHEM gepairt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Senden der Nachrichten macht IMMER das Device - ein Kanal selbst kann nicht wirklich senden. &lt;br /&gt;
&lt;br /&gt;
====Protokoll====&lt;br /&gt;
Da für das Senden das Device verantwortlich ist sind hier die entsprechenden Informationen zu finden. Zu Beachten sind die [[HomeMatic#Device|Übertragungsmodi]], die ein Device unterstützt.  Die Internals &amp;quot;prot...&amp;quot; enthalten alle notwendigen Daten. &lt;br /&gt;
* protState: Der Zustand der Protokollmaschine&lt;br /&gt;
** CMDs_done: alle Nachrichten übertragen, keine Fehler in diesem Durchgang aufgetreten&lt;br /&gt;
** CMDs_done_Error:xx : es hat xx Fehler bei der letzten Übertragung gegeben. &lt;br /&gt;
** CMDs_pending: Nachrichten warten auf das Senden&lt;br /&gt;
** CMDs_processing... : die Nachrichtenübertragung ist im Gange&lt;br /&gt;
** Info_Cleared: die Protokoll Statistik wurde rückgesetzt&lt;br /&gt;
* protCmdPend: Anzahl der Nachrichten, die auf das Senden warten&lt;br /&gt;
* protCmdDel: Anzahl gelöschter Nachrichten aufgrund von Fehlern&lt;br /&gt;
* protCmdNack: Anzahl der negativen Acknowledges&lt;br /&gt;
* protCmdResnd: Anzahl der Wiederholungen - die Nachrichten wurden nicht gelöscht. &lt;br /&gt;
* protCmdResndFail: Anzahl der fehlgeschlagenen Wiederholungen - die Nachrichten wurden gelöscht. &lt;br /&gt;
* protCmdIOerr: Anzahl der IO Fehler - Übertragung war nicht Möglich, weil das IO Device Probleme hatte. Der Grund sollte im IO Device nachgesehen werden. &lt;br /&gt;
* protCmdIOdly: Anzahl der Verzögerungen aufgrund von IO Problemen&lt;br /&gt;
* protCmdTimedOn: Anzahl der Nachrichten, wenn ein Timer im Device genutzt wird - z.B. durch on-for-timer&lt;br /&gt;
* protCmdRcv: Anzahl empfangene Nachrichten&lt;br /&gt;
* protCmdSnd: Anzahl gesendete Nachrichten&lt;br /&gt;
* protCmdErrIoId_...: Anzahl der Sendeversuche zum Device von einer anderen Zentrale&lt;br /&gt;
* protCmdErrIoAttack: Anzahl der Sendeversuche zum Device die nicht von FHEM kam- es könnte ein Versuch sein, das System zu hacken. Dies wird auch im Reading &#039;&#039;&#039;sabotageAttack&#039;&#039;&#039; ausgegeben und man kann ein notify darauf ansetzen. &lt;br /&gt;
&lt;br /&gt;
* protCmdEvt_AESCom: Anzahl der AES Nachrichten von Device&lt;br /&gt;
* protCmdEvt_AESKey: Benutzter AES key&lt;br /&gt;
&lt;br /&gt;
Die Zähler können mit &#039;&#039;&#039;set &amp;lt;device&amp;gt; clear msgEvents&#039;&#039;&#039; rückgesetzt werden. Dies kann vor Konfigurationsänderungen Sinn machen, um Probleme besser erkennen zu können. &amp;lt;br&amp;gt;&lt;br /&gt;
Eine Übersicht kann man mit HMInfo &amp;lt;u&amp;gt;[[Homematic_HMInfo#protoEvents|protoEvents]]&amp;lt;/u&amp;gt; erhalten. Auch das Löschen aller Zähler ist von HMInfo aus möglich.&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
Zeigt den Empfangspegel, den ein Device von einem Anderen misst. Die Variablen sind in Internals abgelegt. Angegeben werden minimale und maximale Wert. Außerdem wird der Durchschnitt und die Anzahl der Nachrichten ausgewertet.&amp;lt;br&amp;gt;&lt;br /&gt;
HM liefert Empfangspegel am IO Device (FHEM standard) aber auch den Empfangspegel am Device selbst. Ebenfalls ausgewertet werden Pegel, die beim Senden zwischen Peers erreicht werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Zähler können mit &#039;&#039;&#039;set &amp;lt;device&amp;gt; clear rssi&#039;&#039;&#039; rückgesetzt werden.&amp;lt;br&amp;gt; &lt;br /&gt;
Eine Übersicht erhält man mit HMInfo &amp;lt;u&amp;gt;[[Homematic_HMInfo#RSSI|Rssi]]&amp;lt;/u&amp;gt;. Das Löschen der Zähler aller HM devices ist von HMInfo aus möglich.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Man kann RSSI kontinuierlich aufzeichnen, wenn das Attribut &#039;&#039;&#039;rssiLog&#039;&#039;&#039; im Device gesetzt ist. Es wird ein Reading rssi_&amp;lt;name&amp;gt; erzeugt. Das generelle Setzen dieses Attributs wird aus Performance-Gründen nicht empfohlen.&lt;br /&gt;
&lt;br /&gt;
== Pairen und Peeren ==&lt;br /&gt;
: &#039;&#039;→ Siehe auch: [[Pairing und Peering]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HomeMatic-Geräte können mit einer Zentrale (FHEM) &#039;&#039;gepairt&#039;&#039; und mit anderen HM-Geräten &#039;&#039;gepeert&#039;&#039; werden.&lt;br /&gt;
&lt;br /&gt;
=== Pairen ===&lt;br /&gt;
: &#039;&#039;→ Siehe auch: [[Pairing (HomeMatic)]]&#039;&#039;&lt;br /&gt;
: &#039;&#039;→ Anleitung: [[HomeMatic Devices pairen]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HM-Geräte können mit und ohne Zentrale betrieben werden. FHEM geht davon aus, dass Geräte immer von einer Zentrale aus gesteuert werden können. Dazu muss das Gerät mit der Zentrale &#039;&#039;gepairt&#039;&#039; werden.&lt;br /&gt;
&lt;br /&gt;
=== Peeren ===&lt;br /&gt;
: &#039;&#039;→ Siehe auch: [[Peering (HomeMatic)]]&lt;br /&gt;
&lt;br /&gt;
Um es Geräten zu ermöglichen auch ohne Zentrale zu interagieren (zum Beispiel wenn die Zentrale einen Defekt hat), können HM-Geräte untereinander &#039;&#039;gepeert&#039;&#039; werden.&lt;br /&gt;
Dazu wird ein Sensor-Kanal mit einem Aktor-Kanal verknüpft.&lt;br /&gt;
&lt;br /&gt;
== HMInfo ==&lt;br /&gt;
: &#039;&#039;→ Siehe auch: [[Homematic HMInfo]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei der Betreuung einer HomeMatic-Installation ist das Modul [[Homematic_HMInfo|HMInfo]] sehr hilfreich. Es stellt eine Übersicht der HomeMatic-Komponenten zur Verfügung, kann die Konfiguration prüfen und Alarmierungen gesammelt auswerten.&lt;br /&gt;
&lt;br /&gt;
== Besondere Entities ==&lt;br /&gt;
&lt;br /&gt;
=== Virtuelle Entities ===&lt;br /&gt;
Virtuelle Entities sind nicht reale HM Devices und Kanäle. Man kann sie als Sender und Empfänger nutzen, auch im Zusammenhang mit Rauchmeldern oder zur Steuerung von Heizungsventilen. Die spezifischen Anwendungen sind im entsprechenden Kapitel nachzulesen. &amp;lt;br&amp;gt;&lt;br /&gt;
Angelegt wird das Device, dann wird per Kommando eine Anzahl Kanäle angelegt. &lt;br /&gt;
  define &amp;lt;virtDev&amp;gt; CUL_HM 112233&lt;br /&gt;
  set &amp;lt;virtDev&amp;gt; virtual 10&lt;br /&gt;
jetzt hat man ein virtuelles Device mit 10 Kanälen angelegt. &lt;br /&gt;
Die die gültigen Kommandos kann man wie immer mit &#039;&#039;&#039;get &amp;lt;entity&amp;gt; cmdList&#039;&#039;&#039; erfahren.&amp;lt;br&amp;gt;&lt;br /&gt;
Auch einem Virtuellen Device sollte man das &#039;&#039;&#039;Attribut IODev setzen &#039;&#039;&#039;.&lt;br /&gt;
=== IO Entities ===&lt;br /&gt;
: &#039;&#039;→ Siehe auch: [[Virtueller Controller VCCU#Virtuelle Kanäle der VCCU]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO-Entities&#039;&#039;&#039; sind virtuelle Kanäle der Zentrale, mit denen andere HomeMatic-Geräte gepeert werden können. Diese Kanäle sind einem &#039;&#039;IO-Device&#039;&#039; zugeordnet – im Unterschied zu &#039;&#039;virtuellen Entities&#039;&#039; gibt es kein virtuelles HomeMatic-Gerät welches die Kanäle beherbergt.&lt;br /&gt;
&lt;br /&gt;
Jedem IO-Device können bis zu 50 Kanäle zugewiesen werden. Wenn mehrere IO-Devices die gleiche HMId nutzen, zum Beispiel wenn ein [[Virtueller Controller VCCU|virtueller Controller]] verwendet wird, teilen sich diese IO-Devices die Kanäle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anlegen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 # IO-Device definieren&lt;br /&gt;
 define &amp;lt;IO-Device&amp;gt; CUL_HM c0ffee&lt;br /&gt;
 attr &amp;lt;IO-Device&amp;gt; model CCU-FHEM&lt;br /&gt;
 &lt;br /&gt;
 # 4 IO-Entities definieren&lt;br /&gt;
 set &amp;lt;IO-Device&amp;gt; virtual 4&lt;br /&gt;
&lt;br /&gt;
=== Action Detector===&lt;br /&gt;
Einige Devices der HM-Geräteserie senden periodisch Nachrichten. Manche alle 3 Minuten, andere alle 3 Tage. Wenn so eine Zeit für ein Device spezifiziert ist, wird diese automatisch vom ActionDetector überwacht.&amp;lt;br&amp;gt;&lt;br /&gt;
Meist sind dies batteriebetriebene Geräte. Sollte aus irgendwelchen Gründen der Batteriealarm übersehen werden und das Gerät keine Nachricht mehr senden, wird es auf Dead gesetzt.&lt;br /&gt;
Die Kontrollinstanz ist ein Pseudo-Gerät &amp;quot;ActionDetector&amp;quot; mit der HMId &amp;quot;000000&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
* attribut&lt;br /&gt;
** actCycle: gibt an, in welchen Abständen sich das Device melden muss&lt;br /&gt;
** actStatus: gibt den Zustand an&lt;br /&gt;
*** alive: Device hat sich in der erwarteten Zeit min einmal gemeldet&lt;br /&gt;
*** dead: Device hat sich in der erwarteten Zeit nicht gemeldet&lt;br /&gt;
*** unknown: Device hat sich nicht gemeldet, es ist aber seit dem letzten reboot die Zykluszeit noch nicht abgelaufen. &lt;br /&gt;
&lt;br /&gt;
* readings&lt;br /&gt;
** Activity:    entsprechend dem actStatus. &lt;br /&gt;
&lt;br /&gt;
* get&lt;br /&gt;
** listDevice:           Gibt alle Objekte zurück&lt;br /&gt;
** listDevice notActive: Gibt alle Objekte zurück die nicht &amp;quot;alive&amp;quot; sind&lt;br /&gt;
** listDevice alive:     Gibt alle Objekte zurück die &amp;quot;alive&amp;quot; sind&lt;br /&gt;
** listDevice unknown:   Gibt alle Objekte zurück die &amp;quot;unknown&amp;quot; sind&lt;br /&gt;
** listDevice dead:      Gibt alle Objekte zurück die &amp;quot;dead&amp;quot; sind&lt;br /&gt;
&lt;br /&gt;
Durch das Setzen des Attributs im HM device wird der ActionDetector automatisch definiert - nach einem save steht er auch in der fhem.cfg.&lt;br /&gt;
Alternativ ist auch eine manuelle Definition möglich und sollte in etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
 define ActionDetector CUL_HM 000000&lt;br /&gt;
 attr ActionDetector actCycle 30&lt;br /&gt;
 attr ActionDetector event-on-change-reading .*&lt;br /&gt;
 attr ActionDetector model ActionDetector&lt;br /&gt;
&lt;br /&gt;
Die HMId &amp;quot;000000&amp;quot; darf nicht geändert werden.&lt;br /&gt;
&lt;br /&gt;
In der Entity actionDetector kann man die Infos gesammelt einsehen.&lt;br /&gt;
Der User kann durch das Setzen des Attributs actCycle jedes Device in diese Liste aufnehmen. Es wird dann geprüft, ob sich das Device in dieser Zeit auch meldet. Der User muss dies aber selbst sicherstellen.&lt;br /&gt;
&lt;br /&gt;
== Tipps / HowTos / Beispiele ==&lt;br /&gt;
&lt;br /&gt;
* [[HomeMatic Devices pairen|HM Devices pairen]] zum &#039;&#039;&#039;Pairen&#039;&#039;&#039; der Geräte untereinander.&lt;br /&gt;
* [[CUL]] (also gleichzeitig)?&lt;br /&gt;
* [[Slider für HM-Rolladensteuerung anzeigen]]&lt;br /&gt;
* Für den &amp;quot;Fall der Fälle&amp;quot;: Erstellen Sie eine Liste aller HM-Geräte mit den Installationsorten, HM-Namen, FHEM-Namen &#039;&#039;&#039;und&#039;&#039;&#039; den Geräte-IDs. Falls Sie sich ihr FHEM einmal zerschießen, wird diese Liste sehr hilfreich sein. Zur Abwicklung von Gewährleistungsansprüchen sind Daten über Kaufdatum und Lieferant (bei größeren Installationen mit Zukauf in zeitlichen Abständen) ebenfalls angebracht.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
&lt;br /&gt;
=== Messages Sniffen ===&lt;br /&gt;
Um Probleme besser nachvollziehen zu können, kann man &amp;lt;u&amp;gt;[[Homematic_Nachrichten_sniffen|Nachrichten mitsniffen]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Daten können empfangen werden, Befehle werden nicht übertragen ===&lt;br /&gt;
&lt;br /&gt;
Das kann mehrere Ursachen haben:&lt;br /&gt;
* Pairing nicht abgeschlossen (bei den &#039;&#039;Readings&#039;&#039; &amp;quot;PairedTo&amp;quot; bzw. &amp;quot;R-pairCentral&amp;quot; steht der Wert &#039;&#039;&#039;set_&#039;&#039;&#039;0x1A2B3C). Das Pairing ist erst dann erfolgreich abgeschlossen, wenn das &#039;&#039;&#039;set_&#039;&#039;&#039; fehlt, also nur noch (beispielhaft) &amp;quot;0x1A2B3C&amp;quot; steht. Siehe [[HomeMatic_Devices_pairen]]&lt;br /&gt;
* Sender (CUL/HM-LAN) und Empfänger (HM-Device) stehen zu nah (RSSI-Werte bei ~ &amp;quot;-17&amp;quot;) beieinander&lt;br /&gt;
* Sender (CUL/HM-LAN) und Empfänger (HM-Device) stehen zu weit (RSSI-Werte bei unter ~ &amp;quot;-80&amp;quot;) voneinander entfernt&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=== Notifys und anderes funktionieren nach einem FHEM-Neustart nicht mehr oder nicht mehr zeitnah ===&lt;br /&gt;
&lt;br /&gt;
Obwohl HomeMatic wegen der höheren Datenübertragungsrate wesentlich weniger von der [[1% Regel]] betroffen ist als z.B. FS20 oder FHT, so kann es dennoch zu Funkkontingentüberschreitungen kommen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere ist bei FHEM Versionen ab Oktober 2013 das Attribut &#039;&#039;autoReadReg&#039;&#039; auf &amp;quot;4_reqStatus&amp;quot; gesetzt. Damit wird für jedes HM-Device mit diesem so gesetzten Attribut beim FHEM-Start ein &#039;&#039;getConfig&#039;&#039; durchgeführt, was viel Funkverkehr erfordert.&lt;br /&gt;
&lt;br /&gt;
Je nach Anzahl der Geräte kann es dazu kommen, dass insgesamt zu viel Funklast erzeugt wird - im Logfile erscheint dann eine Meldung wie:&lt;br /&gt;
&lt;br /&gt;
 2013.10.03 13:41:18 2: HMLAN_Parse: HMLAN1 new condition ERROR-Overload&lt;br /&gt;
&lt;br /&gt;
Ab diesem Moment werden eben auch keine anderen Befehle mehr an weitere HM-Geräte geschickt, da das Funkkontingent aufgebraucht ist. Erst nach einer Stunde kann erneut gesendet werden. Als &#039;&#039;&#039;Notbehelf&#039;&#039;&#039; kann die Funkschnittstelle resetted oder  ([[HMLAN Konfigurator]]) kurz stromlos gemacht werden. Dann wird der Zähler wieder auf Null gesetzt.&lt;br /&gt;
&lt;br /&gt;
Alternativ können so viele HM-Geräte wie möglich auf &#039;&#039;autoReadReg 0_off&#039;&#039; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[1% Regel]]&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
Die Batterielebensdauer der HomeMatic Komponenten ist durchwachsen. Besonders die mitgelieferten Batterien sind mitunter schon nach wenigen Wochen leer, trotzdem werden öfters keine &#039;&#039;battery low&#039;&#039; Meldung erzeugt. Bei Störung des Funkverkehrs (z.B. blinkendes Antennensymbol im HM-CC-TC und kurzes Piepen zur vollen Stunde von morgens bis abends, fehlende ACK Meldungen, nicht auslösende IR-Bewegungssensoren und ähnliches) sollte also immer auch eine schlechte Spannungsversorgung in Betracht gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Gute neue Batterien halten jedoch i.d.R. 12 Monate und mehr, auch Lebensdauern über 2 Jahre sind bei einigen Geräten (Tür/Fensterkontakte, Sender, Retroanzeige,  IR-Bewegungsmelder) keine Seltenheit.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.homematic.com/ HomeMatic] Homepage&lt;br /&gt;
* Hersteller [http://www.eq-3.de eQ-3] &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/uiTable&amp;diff=24273</id>
		<title>DOIF/uiTable</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/uiTable&amp;diff=24273"/>
		<updated>2018-01-03T22:30:25Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Positionierung über die Matrixstruktur einer Tabelle */Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das DOIF-Attribut &#039;&#039;&#039;uiTable&#039;&#039;&#039; dient der Definition eines User Interface im Kontext von FHEMWEB.&lt;br /&gt;
Die Syntax ist in der Befehlsreferenz zu [https://fhem.de/commandref_DE.html#DOIF_uiTable uiTable] beschrieben und wird hier nicht behandelt.&lt;br /&gt;
An dieser Stelle werden Beispiele zur Gestaltung der &#039;&#039;&#039;uiTable&#039;&#039;&#039; gezeigt.&lt;br /&gt;
&lt;br /&gt;
== Sensorauswahl mit WID und DOIF_Readings == &lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* funktionsloses DOIF &amp;lt;code&amp;gt;Sensorauswahl_Labor DOIF (1)&amp;lt;/code&amp;gt;&lt;br /&gt;
* DOIF_Readings &amp;lt;code&amp;gt;showtemp:ReadingsVal([$SELF:sensorselect],&amp;quot;temperature&amp;quot;,&amp;quot;nix&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Aggregationsfunktion &amp;lt;code&amp;gt;[@&amp;quot;:temperature&amp;quot;:temperature]&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Uitable_sensorauswahl.png|300px|thumb|right|Sensorauswahl mit Wertanzeige des ausgewählten Sensors]]&lt;br /&gt;
Im Auswahlfeld werden alle [[Gerät|Geräte]], die ein [[Readings|Reading]] &#039;&#039;&#039;temperature&#039;&#039;&#039; enthalten aufgelistet. Die Temperatur des gewählten [[Gerät|Gerätes]] wird angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
&amp;lt;code&amp;gt;WID([$SELF:sensorselect],[@&amp;quot;&amp;quot;:temperature])&amp;lt;/code&amp;gt; legt in &#039;&#039;&#039;uiTable&#039;&#039;&#039; ein [[FHEMWEB/Widgets|Select-Widget]] für das [[Readings|Reading]] &#039;&#039;&#039;sensorselect&#039;&#039;&#039; an. Die Liste des [[FHEMWEB/Widgets|Widgets]] wird über die Aggregationsfunktion &amp;lt;code&amp;gt;[@&amp;quot;:temperature&amp;quot;:temperature]&amp;lt;/code&amp;gt; erzeugt.&lt;br /&gt;
Über das [[Attribute|Attribut]] &#039;&#039;&#039;DOIF_Readings&#039;&#039;&#039; &amp;lt;code&amp;gt;showtemp:ReadingsVal([$SELF:sensorselect],&amp;quot;temperature&amp;quot;,&amp;quot;nix&amp;quot;)&amp;lt;/code&amp;gt; wird ein [[Readings|Reading]] &#039;&#039;&#039;showtemp&#039;&#039;&#039; mit der Temperatur des ausgewählten Sensors gesetzt.&lt;br /&gt;
In &#039;&#039;&#039;uiTable&#039;&#039;&#039; zeigt &amp;lt;code&amp;gt;[$SELF:showtemp]&amp;lt;/code&amp;gt; den in &#039;&#039;&#039;showtemp&#039;&#039;&#039; enthaltenen Wert an.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Sensorauswahl_Labor DOIF (1)&lt;br /&gt;
attr Sensorauswahl_Labor DOIF_Readings showtemp:ReadingsVal([$SELF:sensorselect],&amp;quot;temperature&amp;quot;,&amp;quot;nix&amp;quot; )&lt;br /&gt;
attr Sensorauswahl_Labor room DOIF_Labor&lt;br /&gt;
attr Sensorauswahl_Labor uiTable &amp;quot;Sensor auswählen&amp;quot;|&amp;quot;T/°C&amp;quot;\&lt;br /&gt;
WID([$SELF:sensorselect],[@&amp;quot;:temperature&amp;quot;:temperature])|[$SELF:showtemp]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kombination von WID und STY zu einem Thermostat Widget ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* HTML-Elemente &amp;lt;code&amp;gt;&amp;amp;lt;div&amp;gt;&amp;amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Styleattribute &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text-align&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;font-weight&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;font-size&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable Templates &amp;lt;code&amp;gt;$TPL{&amp;lt;name&amp;gt;}=&amp;quot;&amp;lt;template content&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable Funktionen &amp;lt;code&amp;gt;WID([&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;],&amp;lt;widget parameter&amp;gt;)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;STY(&amp;lt;content&amp;gt;,&amp;lt;style attributes&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Uitable_widget_kombi_thermostat.png|300px|thumb|right|Kombination von FHEMWEB-Widgets zu einem Thermostat-Widget]]&lt;br /&gt;
Das Thermostat Widget zeigt mit dem inneren Teilkreis die Isttemperatur an und mit dem äusseren Teilkreis wird die Solltemperatur gesetzt. Das obere Textfeld zeigt den Zahlenwert der Solltemperatur, der Untere den der Isttemperatur. Die Farbe, der Soll- und Isttemperatur ändert sich mit ihrem Wert.&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung der Kombination ===&lt;br /&gt;
&#039;&#039;&#039;uiTable&#039;&#039;&#039; ist tabellenförmig aufgebaut, in einer Tabellenzelle können mehrere Elemente kombiniert werden. Da zwei gleich große knob-Widgets übereinander liegen ist nur das obere Widget, die Solltemperatur, bedienbar.&lt;br /&gt;
Die Widgetkombination wird durch den folgenden Code-Auszug beschrieben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 $TPL{style2}=&amp;quot;text-align:right;width:23px;position:absolute;left:13px;top:26px;font-weight:bold;font-size:12px;color:&amp;quot;;&lt;br /&gt;
 $TPL{style3}=&amp;quot;text-align:right;width:23px;position:absolute;left:13px;top:13px;font-weight:bold;font-size:12px;color:&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 $TPL{knob1}=&amp;quot;knob,thickness:.4,fgColor:#00A5FF,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;&lt;br /&gt;
 $TPL{knob2}=&amp;quot;knob,thickness:.3,fgColor:#FFA500,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative;width:50px;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID([HMdummy_Labor:measured-temp],$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID([HMdummy_Labor:desired-temp],$TPL{knob2},&amp;quot;set&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY([HMdummy_Labor:measured-temp:d1],$TPL{style2}.DOIF_hsv([HMdummy_Labor:measured-temp],7,25,240,360,100,100)).STY([HMdummy_Labor:desired-temp:d1],$TPL{style3}.DOIF_hsv([HMdummy_Labor:desired-temp],7,25,240,360,100,100)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit style2, style3, knob1 und knob2 werden vier Templates gespeichert. Sie werden jeweils nur einmal verwendet, verkürzen aber die Tabellendefinition.&lt;br /&gt;
Die Templates knob1 und knob2 beschreiben die [[FHEMWEB/Widgets|Knob-Widgets]].&lt;br /&gt;
Die Templates style2 und style3 beschreiben die Textfelder für die Soll- und Isttemperatur durch die Angabe der entsprechenden CSS-Attribute.&lt;br /&gt;
&lt;br /&gt;
==== Struktur der Kombination ====&lt;br /&gt;
Die Tabellenzelle wird mit div-Elementen nach folgenden Schema strukturiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div mit relativer Position zum Elternelement&amp;gt;&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Knob-Widget Isttemperatur &amp;lt;/div&amp;gt; unterste Ebene&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Knob-Widget Solltemperatur &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Solltemperatur &amp;lt;/div&amp;gt; in STY enthalten und beschrieben durch style3&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Isttemperatur &amp;lt;/div&amp;gt; in STY enthalten und beschrieben durch style2, oberste Ebene&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit &amp;lt;code&amp;gt;position:relative;width:50px;height:50px&amp;lt;/code&amp;gt; wird das oberste div-Element in der Tabellenzelle positioniert. Durch die Verwendung des CSS-Attributes &#039;&#039;&#039;position&#039;&#039;&#039; wird das div-Element zum Bezugspunkt der nachfolgenden Elemente mit absoluter Positionsangabe.&lt;br /&gt;
&lt;br /&gt;
==== Positionierung der FHEMWEB-Widgets ====&lt;br /&gt;
Mit &amp;lt;code&amp;gt;position:absolute;left:0px;top:0px&amp;lt;/code&amp;gt; werden die das knob-Widget umschliessenden div-Elemente in die linke obere Ecke ihres Elternelementes positioniert.&lt;br /&gt;
&lt;br /&gt;
==== Position und Format der Textanzeige ====&lt;br /&gt;
&amp;lt;code&amp;gt;position:absolute;left:13px;top:26px&amp;lt;/code&amp;gt; positioniert das div-Element absolut zum Bezugspunkt, 13 Pixel nach rechts und 26 Pixel nach unten, von links oben aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;width:23px&amp;lt;/code&amp;gt; legt die Breite des div-Elements auf 23 Pixel fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt; formatiert den Text fett.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;font-size:12px&amp;lt;/code&amp;gt; legt die Schriftgröße auf 12 Pixel fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;text-align:right&amp;lt;/code&amp;gt; richtet den Text rechtsbündig aus.&lt;br /&gt;
&lt;br /&gt;
==== Dynamische Farben ====&lt;br /&gt;
&amp;lt;code&amp;gt;color:#&amp;amp;lt;berechnete Farbe&amp;amp;gt;&amp;lt;/code&amp;gt; legt die Farbe fest.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;$TPL{style2}.DOIF_hsv([HMdummy_Labor:measured-temp],7,25,240,360,100,100)&amp;lt;/code&amp;gt; wird die Farbnummer an das Template &#039;&#039;&#039;style3&#039;&#039; angehängt.&lt;br /&gt;
Die Farbnummer wird mit der DOIF internen Funktion DOIF_hsv berechnet. Die Funktion wird mit den Parametern &amp;amp;lt;laufender Wert&amp;amp;gt;,&amp;amp;lt;unterer Wert&amp;amp;gt;,&amp;amp;lt;oberer Wert&amp;amp;gt;,&amp;amp;lt;HUE-Startwert&amp;amp;gt;,&amp;amp;lt;HUE-Endwert&amp;amp;gt;,&amp;amp;lt;Farbsättigung&amp;amp;gt;,&amp;amp;lt;Hellwert&amp;amp;gt; aufgerufen. Der laufende Wert ergibt sich aus dem [[Readings|Reading]] &#039;&#039;&#039;measured-temp&#039;&#039;&#039; des [[Gerät|Gerätes]] &#039;&#039;&#039;HMdummy_Labor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Alternativ, die Nutzung von Methodentemplates ===&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Methodentemplates definieren&amp;lt;code&amp;gt;DEF TPL_&amp;amp;lt;name&amp;amp;gt;(&amp;amp;lt;template definition&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Methodentemplates anwenden &amp;lt;code&amp;gt;TPL_&amp;amp;lt;name&amp;amp;gt;(&amp;amp;lt;parameter1;,&amp;amp;lt;parameter2;, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Die Kombination wird als Template einer Methode angelegt. Damit wird die Tabellendefinition übersichtlicher und das Template kann mit anderen Parametern aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Das Template mit den Platzhaltern &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;$1&amp;lt;/syntaxhighlight&amp;gt; bis &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;$4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DEF TPL_Thermostat(&amp;quot;&amp;lt;div style=&#039;position:relative;width:50px;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID($1,$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID($2,$TPL{knob2},&amp;quot;set&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY($3,$TPL{style2}.DOIF_hsv($1,7,25,240,360,100,100)).STY($4,$TPL{style3}.DOIF_hsv($2,7,25,240,360,100,100)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und die Definition des Widgets in der Tabelle mit vier Parametern in DOIF-Syntax.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
TPL_Thermostat([HMdummy_Labor:measured-temp],[HMdummy_Labor:desired-temp],[HMdummy_Labor:measured-temp:d1],[HMdummy_Labor:desired-temp:d1])&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] (nur das Attribut uiTable) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr widgetkombi_Labor uiTable {\&lt;br /&gt;
$TPL{style2}=&amp;quot;text-align:right;;width:23px;;position:absolute;;left:13px;;top:26px;;font-weight:bold;;font-size:12px;;color:&amp;quot;;;\&lt;br /&gt;
$TPL{style3}=&amp;quot;text-align:right;;width:23px;;position:absolute;;left:13px;;top:13px;;font-weight:bold;;font-size:12px;;color:&amp;quot;;;\&lt;br /&gt;
\&lt;br /&gt;
$TPL{knob1}=&amp;quot;knob,thickness:.4,fgColor:#00A5FF,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;;\&lt;br /&gt;
$TPL{knob2}=&amp;quot;knob,thickness:.3,bgColor:#808080,fgColor:#FFA500,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
DEF TPL_Thermostat(&amp;quot;&amp;lt;div style=&#039;position:relative;;width:50px;;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:0px;;top:0px&#039;&amp;gt;&amp;quot;.WID($1,$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:0px;;top:0px&#039;&amp;gt;&amp;quot;.WID($2,$TPL{knob2},&amp;quot;set&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY($3,$TPL{style2}.DOIF_hsv($1,7,25,240,360,100,100)).STY($4,$TPL{style3}.DOIF_hsv($2,7,25,240,360,100,100)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable,disabled&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
TPL_Thermostat([HMdummy_Labor:measured-temp],[HMdummy_Labor:desired-temp],[HMdummy_Labor:measured-temp:d1],[HMdummy_Labor:desired-temp:d1])&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kombination von WID und STY zum Festlegen zweier Grenzwerte ==&lt;br /&gt;
[[Datei:Uitable_widget_kombi_grenzwert.png|100px|right]]&lt;br /&gt;
Die Kombination ist so angelegt, dass beide Widgets bedienbar sind.&lt;br /&gt;
Es wird jeweils ein Reading durch ein Widget gesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Positionierung der knob-Widgets ===&lt;br /&gt;
Die Widget sind unterschiedlich groß.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=perl&amp;gt;&lt;br /&gt;
$TPL{knob1}=&amp;quot;... width:50,height:50 ...&amp;quot;&lt;br /&gt;
$TPL{knob2}=&amp;quot;... width:38,height:38 ...&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daher muss &#039;&#039;&#039;knob2&#039;&#039;&#039; 6px nach rechts und unten positioniert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&amp;lt;div style=&#039;... left:6px;;top:6px&#039;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit wird erreicht, dass beide Widgets bedienbar bleiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=perl&amp;gt;&lt;br /&gt;
defmod widgetkombi2_Labor DOIF (1)&lt;br /&gt;
attr widgetkombi2_Labor group Labor: uiTable&lt;br /&gt;
attr widgetkombi2_Labor room DOIF_Labor&lt;br /&gt;
attr widgetkombi2_Labor uiTable {\&lt;br /&gt;
$TPL{style2}=&amp;quot;text-align:center;;width:23px;;position:absolute;;left:13px;;top:13px;;font-weight:bold;;font-size:12px;;color:red&amp;quot;;;\&lt;br /&gt;
$TPL{style3}=&amp;quot;text-align:center;;width:23px;;position:absolute;;left:13px;;top:26px;;font-weight:bold;;font-size:12px;;color:blue&amp;quot;;;\&lt;br /&gt;
\&lt;br /&gt;
$TPL{knob1}=&amp;quot;knob,thickness:.23,bgColor:lightgrey,fgColor:#FF0000,min:0,max:100,width:50,height:50,step:1,angleArc:270,angleOffset:225,displayInput:false,cursor:1,lineCap:round&amp;quot;;;\&lt;br /&gt;
$TPL{knob2}=&amp;quot;knob,thickness:.32,bgColor:#808080,fgColor:#0000FF,min:0,max:100,width:38,height:38,step:1,angleArc:270,angleOffset:225,displayInput:false,cursor:1,lineCap:round&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative;;width:50px;;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:px;;top:0px&#039;&amp;gt;&amp;quot;.WID([$SELF:obererGrenzwert],$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:6px;;top:6px&#039;&amp;gt;&amp;quot;.WID([$SELF:untererGrenzwert],$TPL{knob2}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY([$SELF:obererGrenzwert],$TPL{style2}).STY([$SELF:untererGrenzwert],$TPL{style3}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate widgetkombi2_Labor initialized&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:20:15 cmd 0&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:55:42 obererGrenzwert 87&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:20:15 state initialized&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:55:45 untererGrenzwert 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Befehl mit Icon und Text-Overlay ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* HTML-Elemente &amp;lt;code&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Link-Attribute &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable Formatierung einer Tabellenzelle &amp;lt;code&amp;gt;$TD{row}{col}=&amp;quot;&amp;lt;HTML-Attribute&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute , &amp;lt;code&amp;gt;background-color&amp;lt;/code&amp;gt;&lt;br /&gt;
* FHEMWEB-Funktion &amp;lt;code&amp;gt;FW_makeImage(&amp;lt;image name&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* FHEMWEB-Variablen &amp;lt;code&amp;gt;$FW_ME&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$FW_CSRF&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Uitable_widget_cmdlink_icon_text.png|300px|thumb|right|Befehlslink mit Icon, Text und Hinweistext]]&lt;br /&gt;
Mit dieser Widgetkombination wird ein FHEM-Befehl als Link in eine Tabellenzelle der &#039;&#039;&#039;uiTable&#039;&#039;&#039; eingefügt. Als Linktext wird ein Icon eingebunden und ein Text über das Icon positioniert. Der Link enthält einen Hinweistext. Siehe auch {{Link2Forum|Topic=80835|Message=729002|LinkText=Link mit Icon und FHEM-Befehl}} ff.&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
Mit &amp;lt;code&amp;gt;$TD{0}{0}=&amp;quot;style=&#039;position:relative&#039;&amp;quot;;&amp;lt;/code&amp;gt; wird die oberste linke Zelle als der Bezugspunkt für die Textpositionierung festgelegt. Als erstes wird der der Link mit dem a-Element angelegt. Mit dem Attribut &amp;lt;code&amp;gt;target=&#039;_blank&#039;&amp;lt;/code&amp;gt; erfolgt die Ausgabe der aufgerufenen Seite in einem neuen Browser-Tab. Die URL wird in dem Attribut &amp;lt;code&amp;gt;href=&#039;$FW_ME?detail=$SELF&amp;amp;cmd.$SELF=list $SELF$FW_CSRF&#039; title=&#039;list $SELF&#039;&amp;lt;/code&amp;gt; angegeben. Darin liefert &amp;lt;code&amp;gt;$FW_ME&amp;lt;/code&amp;gt; den Webnamen von FHEM, &amp;lt;code&amp;gt;$SELF&amp;lt;/code&amp;gt; den Eigennamen des DOIF, und &amp;lt;code&amp;gt;$FW_CSRF&amp;lt;/code&amp;gt; das aktuelle CSRF-Token. Das Attribut &amp;lt;code&amp;gt;title=&#039;list $SELF&#039;&amp;lt;/code&amp;gt; gibt den Hinweistext an. Als Linktext liefert die Funktion &amp;lt;code&amp;gt;FW_makeImage(&amp;quot;time_note\@lightblue&amp;quot;)&amp;lt;/code&amp;gt; den HTML-code zum Anzeigen des Icons, dabei beschreibt &amp;lt;code&amp;gt;&amp;quot;time_note\@lightblue&amp;quot;&amp;lt;/code&amp;gt; den Iconnamen und die Einfärbung des Icons. Auch der über das Icon gelegte Text gehört zum Linktext, er wird aber durch die Positionsangaben &amp;lt;code&amp;gt;style=&#039;position:absolute; left:12px; top:20px;&amp;lt;/code&amp;gt; auf das Icon geschoben. Die Angaben &amp;lt;code&amp;gt;font-size:12px; background-color:lightblue; color:darkred;&amp;lt;/code&amp;gt; dienen der Formatierung des Textes.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod widget_cmdlink_icon_text DOIF (1)&lt;br /&gt;
attr widget_cmdlink_icon_text group Labor: uiTable&lt;br /&gt;
attr widget_cmdlink_icon_text room DOIF_Labor,DOIFalone&lt;br /&gt;
attr widget_cmdlink_icon_text uiTable {\&lt;br /&gt;
  $TD{0}{0}=&amp;quot;style=&#039;position:relative&#039;&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;a target=&#039;_blank&#039; href=&#039;$FW_ME?cmd.$SELF=list $SELF$FW_CSRF&#039; title=&#039;list $SELF&#039;&amp;gt;&amp;quot;.FW_makeImage(&amp;quot;time_note\@lightblue&amp;quot;).&amp;quot;&amp;lt;div style=&#039;position:absolute;; left:12px;; top:20px;; font-size:12px;; background-color:lightblue;; color:darkred&#039;&amp;gt;list&amp;lt;/div&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;\&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Frontendelemente über einem Hintergrund (Grundriss) platzieren ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Formatierung des table-Element &amp;lt;code&amp;gt;$TABLE&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute &amp;lt;code&amp;gt;background-image:url&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background-size&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt;&lt;br /&gt;
* HTML Zeilenumbruch &amp;lt;code&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt;, Leerzeichen &amp;lt;code&amp;gt;&amp;amp;amp;nbsp&amp;amp;#59;&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Grundriss1.png|300px|thumb|right|Positionierung von Text und Widget auf einem Hintergrundbild]]&lt;br /&gt;
In diesem Beispiel wird ein Hintergundbild geladen und das Bild mit Widgets und Text beschriftet.&lt;br /&gt;
Dem table-Element der uiTable wird über &amp;lt;code&amp;gt;$TABLE = &amp;quot;CSS-Attribute&amp;quot;;&amp;lt;/code&amp;gt; eine Formatierung zugewiesen. Die Formatierung beinhaltet das Laden eine Hintergrundbildes mit &amp;lt;code&amp;gt;background-image:url($FW_ME/www/pgm2/images/Grundriss.svg);&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Positionierung über die Matrixstruktur einer Tabelle ===&lt;br /&gt;
Durch die Formatierung &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; wird der Zelleninhalt zentriert. Die Positionierung von Text und Widget, die Verschiebung aus der Mitte der Zelle, erfolgt durch Zeilenumbruch &amp;lt;code&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; und Leerzeichen &amp;lt;code&amp;gt;&amp;amp;amp;nbsp&amp;amp;#59;&amp;lt;/code&amp;gt;. Da Text und Widget in der Tabellenzelle durch ein Komma getrennt werden, erfolgt dort ein Zeilenumbruch.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
Das Beispiel funktioniert nur, wenn das Hintergrundbild in das Verzeichnis &amp;lt;code&amp;gt;/www/pgm2/images/&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
* Download von  [[Medium:Grundriss.svg|Grundriss.svg]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Grundriss_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_Labor uiTable {\&lt;br /&gt;
  $TABLE = &amp;quot; text-align:center;;width:300px;; height:300px;; background-image:url($FW_ME/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TR{1,3} = &amp;quot;class=&#039;&#039;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch})|&amp;quot;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch})|&amp;quot; Bad&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Bad],$TPL{switch})\&lt;br /&gt;
&amp;quot; &amp;quot;|&amp;quot; &amp;quot;|&amp;quot; Diele &amp;quot;,WID([$SELF:Diele],$TPL{switch})\&lt;br /&gt;
&amp;quot;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Kind &amp;quot;,WID([$SELF:Ki],$TPL{switch})|&amp;quot; &amp;quot;\&lt;br /&gt;
&amp;quot;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Balkon&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Balkon],$TPL{switch})|&amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_Labor initialized&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Bad off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:22 Balkon off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Diele off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:42 Ki on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:30 Kue on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:31 SZ on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:46 WZ1 on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:23 WZ2 off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 cmd 0&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alternativ, freie Positionierung von Text und Widgets ===&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Festlegen des Positionierungsbezugspunktes mit &amp;lt;code&amp;gt;position:relative;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Positionierung der Frontendelemente mit &amp;lt;code&amp;gt;position:absolute; Left:&amp;amp;lt;Pixel nach rechts&amp;amp;gt;px; top:&amp;amp;lt;Pixel nach unten&amp;amp;gt;px;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Verwendung nur einer Tabellenzelle&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Grundriss2.png|300px|thumb|right|Absolute Positionierung]]Widgets und Texte werden auf dem Hintergrundbild durch Angabe ihrer absoluten Position zur linken oberen Ecke der Tabelle, bzw. des Hintergrundbilder positioniert. Die Positionierung kann pixelgenau angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Der gesamte Text und die Widgets werden nur in einer Tabellenzelle platziert. Die linke obere Ecke der Tabelle wird mit &amp;lt;code&amp;gt;position:relative;&amp;lt;/code&amp;gt; zum Bezugspunkt. Die zu positionierenden Elemente werden mit &amp;lt;code&amp;gt;position:absolute; Left:&amp;amp;lt;Pixel nach rechts&amp;amp;gt;px; top:&amp;amp;lt;Pixel nach unten&amp;amp;gt;px;&amp;lt;/code&amp;gt; platziert. Text u. Widget sind von einem div-Element umschlossen, so dass sie als Einheit positioniert werden können.&lt;br /&gt;
&lt;br /&gt;
Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; mit absoluten Positionsangaben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;position:relative; text-align:center;width:300px; height:300px; background-image:url($FW_ME/www/pgm2/images/Grundriss.svg); background-size: 300px 300px;&amp;quot;;&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:absolute; left:35px; top:25px;&#039;&amp;gt;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:25px;&#039;&amp;gt;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:225px; top:25px;&#039;&amp;gt;Bad&amp;quot;,WID([$SELF:Bad],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:105px;&#039;&amp;gt;Diele &amp;quot;.WID([$SELF:Diele],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:35px; top:160px;&#039;&amp;gt;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:35px; top:220px;&#039;&amp;gt;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:160px;&#039;&amp;gt;Kind&amp;quot;,WID([$SELF:Ki],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:250px;&#039;&amp;gt;Balkon&amp;quot;,WID([$SELF:Balkon],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1 für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
In diesem Beispiel wurde gegenüber dem vorhergehenden Beispiel nur die Definiton des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; geändert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Grundriss_position_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_position_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_position_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_position_Labor uiTable {\&lt;br /&gt;
  $ATTRIBUTESFIRST = 1;;\&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;;position:relative;; text-align:center;;width:300px;; height:300px;; background-image:url($FW_ME/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
 }\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:absolute;; Left:35px;; top:25px;;&#039;&amp;gt;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:25px;;&#039;&amp;gt;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:225px;; top:25px;;&#039;&amp;gt;Bad&amp;quot;,WID([$SELF:Bad],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:105px;;&#039;&amp;gt;Diele &amp;quot;.WID([$SELF:Diele],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:35px;; top:160px;;&#039;&amp;gt;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:35px;; top:220px;;&#039;&amp;gt;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:160px;;&#039;&amp;gt;Kind&amp;quot;,WID([$SELF:Ki],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:250px;;&#039;&amp;gt;Balkon&amp;quot;,WID([$SELF:Balkon],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_position_Labor initialized&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:22 Bad off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:46 Balkon off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:30 Diele off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:27 Ki on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:28 Kue on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:27 SZ off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:43 WZ1 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:29 WZ2 on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 cmd 0&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2 für [[Import_von_Code_Snippets|Raw definition]], mit Methodentemplate ===&lt;br /&gt;
In diesem Beispiel wurde gegenüber dem vorhergehenden Beispiel nur die Definiton des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; geändert.&lt;br /&gt;
In dieser Variante wird ein Methodentemplate für das Objekt aus Text und Widget verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Grundriss_position_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_position_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_position_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_position_Labor uiTable {\&lt;br /&gt;
  $ATTRIBUTESFIRST = 1;;\&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;;position:relative;; text-align:center;;width:300px;; height:300px;; background-image:url(./fhem/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
 }\&lt;br /&gt;
\&lt;br /&gt;
DEF TPL_Objekt(&amp;quot;&amp;lt;div style=&#039;position:absolute;; Left:&amp;quot;.$1.&amp;quot;px;; top:&amp;quot;.$2.&amp;quot;px;;&#039;&amp;gt;&amp;quot;.$3.WID($4,$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Schlafen&amp;lt;br&amp;gt;&amp;quot;,[$SELF:SZ])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Küche&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Kue])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;225&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Bad&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Bad])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;105&amp;quot;,&amp;quot;Diele &amp;quot;,[$SELF:Diele])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Wohnen A&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ1])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;220&amp;quot;,&amp;quot;Wohnen B&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ2])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Kind&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Ki])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;250&amp;quot;,&amp;quot;Balkon&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Balkon])&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_position_Labor initialized&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:22 Bad off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:46 Balkon off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:30 Diele off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:27 Ki on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:28 Kue on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:27 SZ off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:43 WZ1 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:29 WZ2 on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 cmd 0&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 state initialized&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Icon mit animierter Füllung ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* benutzerdefinierte Perl-Funktion &amp;lt;code&amp;gt;sub FUNC_&amp;amp;lt;name&amp;amp;gt;{&amp;amp;lt;Funktionsblock&amp;amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute &amp;lt;code&amp;gt;linear-gradient&amp;lt;/code&amp;gt;&lt;br /&gt;
* RGB-Farbangabe mit &amp;amp;alpha;-Kanal &amp;lt;code&amp;gt;rgba(&amp;amp;lt;rotwert&amp;amp;gt;,&amp;amp;lt;grünwert&amp;amp;gt;,&amp;amp;lt;blauwert&amp;amp;gt;,&amp;amp;lt;transparenzwert&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:uiTable_gradiend_Labor.png|300px|thumb|right|Icon mit animierter Füllung]]&lt;br /&gt;
Das Icon für eine Zisterne wird mit einem veränderlichen Hintergrund angezeigt, der den Füllstand darstellt.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau der Kombination ===&lt;br /&gt;
Der Zelleninhalt hat folgende Struktur.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div Bezugspunkt&amp;gt;&lt;br /&gt;
  &amp;lt;div dynamischer Gradiend untere Ebene&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div obere Ebene mit SVG als Inhalt&amp;gt;SVG&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Bezugspunkt und die Größe wird mit &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;&amp;quot;&amp;lt;div style=&#039;width:32px;height:35px;position:relative;&#039;&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; angegeben.&lt;br /&gt;
&lt;br /&gt;
Die untere Ebene wird durch &amp;lt;code&amp;gt;STY&amp;lt;/code&amp;gt; beschrieben, der Inhalt wird durch &amp;lt;code&amp;gt;FUNC_zisterne([HMdummy_Labor:level])&amp;lt;/code&amp;gt; erzeugt, die Formatierung erfolgt über &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;positon:absolute;left:0px;top:0px;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die obere Ebene wird durch das div-Element &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;&amp;quot;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px;&#039;&amp;gt;&amp;quot;.FW_makeImage(&#039;zisterne&#039;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; beschrieben, wobei der Inhalt, das Icon, durch die Funktion &amp;lt;code&amp;gt;FW_makeImage(&#039;zisterne&#039;)&amp;lt;/code&amp;gt; zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Die selbst definierte Funktion &amp;lt;code&amp;gt;FUNC_zisterne&amp;lt;/code&amp;gt; gibt ein div-Element zurück, dass die Form der Füllung des Icons, die Richtung der Füllung &amp;lt;code&amp;gt;to top&amp;lt;/code&amp;gt; mit der Position der Farbgrenze &amp;lt;code&amp;gt;rgba(0,0,230,0.5) ($val*24/100)px, rgba(0,0,0,0) ($val*24/100)px);&amp;lt;/code&amp;gt; durch den &amp;lt;code&amp;gt;linear-gradient&amp;lt;/code&amp;gt; festlegt.&lt;br /&gt;
&lt;br /&gt;
Durch ein Verschieben der Farbgrenze über den Wert des [[Readings]] &amp;lt;code&amp;gt;HMdummy_Labor:level&amp;lt;/code&amp;gt;, wird die Füllhöhe animiert. &lt;br /&gt;
&lt;br /&gt;
Die Füllhöhe der Zisterne (0-100) wird umgerechnet auf die Füllhöhe des Icons (0px-24px) mit &amp;lt;code&amp;gt;$val*24/100&amp;lt;/code&amp;gt;, dabei ist &amp;lt;code&amp;gt;$val&amp;lt;/code&amp;gt; die aktuelle Füllhöhe der Zisterne, dargestellt durch das [[Readings|Reading]] &amp;lt;code&amp;gt;HMdummy_Labor:level&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; mit absoluten Positionsangaben ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
sub FUNC_zisterne {&lt;br /&gt;
    my($val)= @_;&lt;br /&gt;
    my $ret= &amp;quot;&amp;lt;div style=\&amp;quot;position:absolute;bottom:3px;left:6px;width:20px;height:24px;background:linear-gradient( to top, rgba(0,0,230,0.5)  &amp;quot;.($val*24/100).&amp;quot;px, rgba(0,0,0,0) &amp;quot;.($val*24/100).&amp;quot;px);\&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
    return $ret;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;width:32px;height:35px;position:relative;&#039;&amp;gt;&amp;quot;.STY(FUNC_zisterne([HMdummy_Labor:level]),&amp;quot;positon:absolute;left:0px;top:0px;&amp;quot;).&amp;quot;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px;&#039;&amp;gt;&amp;quot;.FW_makeImage(&#039;zisterne&#039;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
Das Beispiel funktioniert nur, wenn das Icon &#039;&#039;&#039;zisterne.svg&#039;&#039;&#039; in ein Verzeichnis unterhalb von &amp;lt;code&amp;gt;/www/images/&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
* Download von  [[Medium:zisterne.svg|zisterne.svg]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod gradiend_Labor DOIF (1) ## HMsensor_Labor HMdummy_Labor&lt;br /&gt;
attr gradiend_Labor group Labor: uiTable&lt;br /&gt;
attr gradiend_Labor room DOIF_Labor,DOIFalone&lt;br /&gt;
attr gradiend_Labor uiTable {\&lt;br /&gt;
sub FUNC_zisterne {\&lt;br /&gt;
    my($val)= @_;;\&lt;br /&gt;
    my $ret= &amp;quot;&amp;lt;div style=\&amp;quot;position:absolute;;bottom:3px;;left:6px;;width:20px;;height:24px;;background:linear-gradient( to top, rgba(0,0,230,0.5)  &amp;quot;.($val*24/100).&amp;quot;px, rgba(0,0,0,0) &amp;quot;.($val*24/100).&amp;quot;px);;\&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;;\&lt;br /&gt;
    return $ret;;\&lt;br /&gt;
  }\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;width:32px;;height:35px;;position:relative;;&#039;&amp;gt;&amp;quot;.STY(FUNC_zisterne([HMdummy_Labor:level]),&amp;quot;positon:absolute;;left:0px;;top:0px;;&amp;quot;).&amp;quot;&amp;lt;div style=&#039;position:absolute;;left:0px;;top:0px;;&#039;&amp;gt;&amp;quot;.FW_makeImage(&#039;zisterne&#039;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
defmod HMdummy_Labor dummy&lt;br /&gt;
attr HMdummy_Labor group Labor: uiTable&lt;br /&gt;
attr HMdummy_Labor room DOIF_Labor&lt;br /&gt;
attr HMdummy_Labor userReadings desired-temp {ReadingsNum($name,&amp;quot;state&amp;quot;,7)}&lt;br /&gt;
&lt;br /&gt;
defmod HMsensor_Labor DOIF ([+1])\&lt;br /&gt;
  (setreading HMdummy_Labor measured-temp {(if ([HMdummy_Labor:measured-temp] &amp;lt; [HMdummy_Labor:desired-temp]){[HMdummy_Labor:measured-temp]+.5} else {7})},\&lt;br /&gt;
  setreading HMdummy_Labor level {(if ([HMdummy_Labor:level] &amp;lt; 100){[HMdummy_Labor:level]+5} else {0})})&lt;br /&gt;
attr HMsensor_Labor do always&lt;br /&gt;
attr HMsensor_Labor group Labor: uiTable&lt;br /&gt;
attr HMsensor_Labor room DOIF_Labor&lt;br /&gt;
attr HMsensor_Labor webCmd enable:disable&lt;br /&gt;
&lt;br /&gt;
setstate HMdummy_Labor desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-08 23:34:23 desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-08 23:34:23 level 75&lt;br /&gt;
setstate HMdummy_Labor 2017-11-08 23:34:23 measured-temp 27&lt;br /&gt;
setstate HMdummy_Labor 2017-11-06 12:04:39 state desired-temp 29&lt;br /&gt;
&lt;br /&gt;
setstate HMsensor_Labor disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 cmd 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 cmd_event timer_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 cmd_nr 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 last_cmd cmd_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 mode disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 state disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:54:37 timer_01_c01 08.11.2017 23:54:38&lt;br /&gt;
&lt;br /&gt;
setstate gradiend_Labor initialized&lt;br /&gt;
setstate gradiend_Labor 2017-11-08 23:35:44 cmd 0&lt;br /&gt;
setstate gradiend_Labor 2017-11-08 23:35:44 state initialized&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ladezustand als vertikaler, linearer Gradiend ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* benutzerdefinierte Perl-Funktion &amp;lt;code&amp;gt;sub FUNC_&amp;amp;lt;name&amp;amp;gt;{&amp;amp;lt;Funktionsblock&amp;amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable-Funktion &amp;lt;code&amp;gt;STY&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute &amp;lt;code&amp;gt;linear-gradient&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;border-style&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;border-width&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;border-color&amp;lt;/code&amp;gt;&lt;br /&gt;
* RGB-Farbangabe mit &amp;amp;alpha;-Kanal &amp;lt;code&amp;gt;rgba(&amp;amp;lt;rotwert&amp;amp;gt;,&amp;amp;lt;grünwert&amp;amp;gt;,&amp;amp;lt;blauwert&amp;amp;gt;,&amp;amp;lt;transparenzwert&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:uiTable_verticalGradient.png|height 100px|thumb|right|Vertikaler Gradiend mit animierter Überlagerung]]&lt;br /&gt;
Der farbige Gradiend (rot, gelb, grün von unten nach oben) wird zu dem Teil abgedeckt, welcher der Ergänzung des Ladezustandes zu 100 entspricht.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau der Kombination ===&lt;br /&gt;
Der Zelleninhalt hat folgende Struktur.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div Bezugspunkt und statischer Gradiend (rot,gelb,grün) als Hintergrung&amp;gt;&lt;br /&gt;
  &amp;lt;div untere Ebene dynamischem Gradienten&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div obere Ebene mit Wert als Inhalt&amp;gt;Wert&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Bezugspunkt, die Größe, der Rahmen und der statische Gradiend wird mit &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; inline&amp;gt;&amp;lt;div style=&#039;border-width:2px;border-style:solid;border-color:gray;position:relative;width:25px;height:100px;background:linear-gradient( to top, red 0px,yellow 50px,green 100px);&#039;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; festgelegt.&lt;br /&gt;
&lt;br /&gt;
Der dynamische Gradiend wird durch die benutzerdefinierte Funktion &amp;lt;code&amp;gt;FUNC_batt&amp;lt;/code&amp;gt; zurückgegeben, &amp;lt;code&amp;gt;(100-$val)&amp;lt;/code&amp;gt; berechnet den abzudeckenden Teil des rot, gelb, grünen Gradienten.&lt;br /&gt;
&lt;br /&gt;
Durch &amp;lt;code&amp;gt;STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:9px;position:absolute;top:45px;right:1px&amp;quot;)&amp;lt;/code&amp;gt; wird der Wert positioniert und angezeigt.&lt;br /&gt;
 &lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; mit absoluten Positionsangaben ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  $TD{0}{0}=&amp;quot; colspan=2 &amp;quot;;&lt;br /&gt;
  sub FUNC_batt {&lt;br /&gt;
    my($val)=@_;&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;left:0px;width:25px;height:100px;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;px,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;px);&amp;quot;;&lt;br /&gt;
    return $ret;&lt;br /&gt;
  }&lt;br /&gt;
  sub FUNC_batt2 {&lt;br /&gt;
    my($val)=@_;&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;left:9px;top:6px;width:14px;height:27px;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;%,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;%);&amp;quot;;&lt;br /&gt;
    return $ret;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;border-width:2px;border-style:solid;border-color:gray;position:relative;width:25px;height:100px;background:linear-gradient( to top, red 0px,yellow 50px,green 100px);&#039;&amp;gt;&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:9px;position:absolute;top:45px;right:1px&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;|&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative&#039;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;position:absolute;left:9px;top:6px;width:14px;height:27px;background:linear-gradient( to top, red 0%,yellow 50%,green 100%);&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt2([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:6px;position:absolute;top:15px;left:10px&amp;quot;).STY(FW_makeImage(&amp;quot;measure_battery_0&amp;quot;)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Anwendung des Anwendung der überlagerten Gradienten auf ein Batterieicon wird durch den nachstehenden Codeteil erzeugt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative&#039;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;position:absolute;left:9px;top:6px;width:14px;height:27px;background:linear-gradient( to top, red 0%,yellow 50%,green 100%);&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt2([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:6px;position:absolute;top:15px;left:10px&amp;quot;).STY(FW_makeImage(&amp;quot;measure_battery_0&amp;quot;)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod verticalGradiend_Labor DOIF (1) ## HMsensor_Labor HMdummy_Labor&lt;br /&gt;
attr verticalGradiend_Labor group Labor: uiTable&lt;br /&gt;
attr verticalGradiend_Labor room DOIF_Labor&lt;br /&gt;
attr verticalGradiend_Labor uiTable {\&lt;br /&gt;
  $TD{0}{0}=&amp;quot; colspan=2 &amp;quot;;;\&lt;br /&gt;
  sub FUNC_batt {\&lt;br /&gt;
    my($val)=@_;;\&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;;left:0px;;width:25px;;height:100px;;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;px,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;px);;&amp;quot;;;\&lt;br /&gt;
    return $ret;;\&lt;br /&gt;
  }\&lt;br /&gt;
  sub FUNC_batt2 {\&lt;br /&gt;
    my($val)=@_;;\&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;;left:9px;;top:6px;;width:14px;;height:27px;;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;%,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;%);;&amp;quot;;;\&lt;br /&gt;
    return $ret;;\&lt;br /&gt;
  }\&lt;br /&gt;
}\&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:25px;;height:100px;;background:linear-gradient( to top, red 0px,yellow 50px,green 100px);;&#039;&amp;gt;&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:9px;;position:absolute;;top:45px;;right:1px&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;|\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative&#039;&amp;gt;\&lt;br /&gt;
&amp;lt;div style=&#039;position:absolute;;left:9px;;top:6px;;width:14px;;height:27px;;background:linear-gradient( to top, red 0%,yellow 50%,green 100%);;&#039;&amp;gt;&amp;lt;/div&amp;gt;\&lt;br /&gt;
&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt2([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:6px;;position:absolute;;top:15px;;left:10px&amp;quot;).STY(FW_makeImage(&amp;quot;measure_battery_0&amp;quot;)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
defmod HMdummy_Labor dummy&lt;br /&gt;
attr HMdummy_Labor group Labor: uiTable&lt;br /&gt;
attr HMdummy_Labor room DOIF_Labor&lt;br /&gt;
attr HMdummy_Labor userReadings desired-temp {ReadingsNum($name,&amp;quot;state&amp;quot;,7)}&lt;br /&gt;
&lt;br /&gt;
defmod HMsensor_Labor DOIF ([+1])\&lt;br /&gt;
  (setreading HMdummy_Labor measured-temp {(if ([HMdummy_Labor:measured-temp] &amp;lt; [HMdummy_Labor:desired-temp]){[HMdummy_Labor:measured-temp]+.5} else {7})},\&lt;br /&gt;
  setreading HMdummy_Labor level {(if ([HMdummy_Labor:level] &amp;lt; 100){[HMdummy_Labor:level]+5} else {0})})&lt;br /&gt;
attr HMsensor_Labor do always&lt;br /&gt;
attr HMsensor_Labor group Labor: uiTable&lt;br /&gt;
attr HMsensor_Labor room DOIF_Labor&lt;br /&gt;
attr HMsensor_Labor webCmd enable:disable&lt;br /&gt;
&lt;br /&gt;
setstate HMdummy_Labor desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-10 12:36:07 desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-10 12:36:07 level 85&lt;br /&gt;
setstate HMdummy_Labor 2017-11-10 12:36:07 measured-temp 28&lt;br /&gt;
setstate HMdummy_Labor 2017-11-06 12:04:39 state desired-temp 29&lt;br /&gt;
&lt;br /&gt;
setstate HMsensor_Labor disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 cmd 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 cmd_event timer_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 cmd_nr 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 last_cmd cmd_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 mode disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 state disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 13:26:42 timer_01_c01 10.11.2017 13:26:43&lt;br /&gt;
&lt;br /&gt;
setstate verticalGradiend_Labor initialized&lt;br /&gt;
setstate verticalGradiend_Labor 2017-11-09 08:59:32 cmd 0&lt;br /&gt;
setstate verticalGradiend_Labor 2017-11-09 08:59:32 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Abwechselnde Anzeige zweier Größen an gleicher Position ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* HTML-Attribute &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Datei und Attribute &amp;lt;code&amp;gt;@keyframes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;animation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;overflow&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;opacity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:UiTable_swapValues1.png|height 100px|thumb|right|Feuchte als erste Größe]][[Datei:Uitable_swapValues2.png|height 100px|thumb|right|Temperatur als zweite Größe]]&lt;br /&gt;
&lt;br /&gt;
Die Größen Feuchte und Temperatur werden abwechselnd angezeigt&lt;br /&gt;
&lt;br /&gt;
=== Aufbau der Kombination ===&lt;br /&gt;
Der Zelleninhalt hat folgende Struktur.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div 1. Klasse mit Wert als Inhalt&amp;gt;Wert&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div 2. Klasse mit Wert als Inhalt&amp;gt;Wert&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;lt;div class=&#039;humchange&#039; &amp;gt;&amp;quot;.STY([$SELF:humidity],&amp;quot;font-size:16pt;font-weight:bold;color:red;&amp;quot;).&amp;quot; relH%&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div class=&#039;tempchange&#039; &amp;gt;&amp;quot;.STY([$SELF:temperature:d1],&amp;quot;font-size:16pt;font-weight:bold;color:blue;&amp;quot;).&amp;quot;°C&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die dazu gehörende CSS-Definition === &lt;br /&gt;
Damit die Wechselnde Anzeige funktioniert, muss die Definition in eine Datei kopiert werden, die Dateiendung muss &#039;&#039;css&#039;&#039; sein (uitable_changer.css). Die Datei ist in das Verzeichniss ./pgm2 zu kopieren. Sie muss dann über das FHEMWEB-Attribut &amp;lt;code&amp;gt;attr &amp;lt;fhemwebname&amp;gt; CssFiles pgm2/uitable_changer.css&amp;lt;/code&amp;gt; eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
div.humchange {&lt;br /&gt;
  opacity: 0; &lt;br /&gt;
  height: 0;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  animation: humidity 15s infinite ease-in;&lt;br /&gt;
}&lt;br /&gt;
div.tempchange {&lt;br /&gt;
  opacity: 1 &lt;br /&gt;
  height: auto;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  animation: temperature 15s infinite ease-in;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes humidity {&lt;br /&gt;
  0% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  0.001% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  5% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  45% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  49.999% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  50% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
  100% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
@keyframes temperature {&lt;br /&gt;
  0% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
  49.999% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
  50% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  55% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  95% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  100% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod swapValues_Labor DOIF (1) ## HMsensor_Labor HMdummy_Labor&lt;br /&gt;
attr swapValues_Labor group Labor: uiTable&lt;br /&gt;
attr swapValues_Labor room DOIF_Labor,DOIFalone&lt;br /&gt;
attr swapValues_Labor uiTable &amp;quot;&amp;lt;div class=&#039;humchange&#039; &amp;gt;&amp;quot;.STY([$SELF:humidity],&amp;quot;font-size:16pt;;font-weight:bold;;color:red;;&amp;quot;).&amp;quot; relH%&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div class=&#039;tempchange&#039; &amp;gt;&amp;quot;.STY([$SELF:temperature:d1],&amp;quot;font-size:16pt;;font-weight:bold;;color:blue;;&amp;quot;).&amp;quot;°C&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate swapValues_Labor initialized&lt;br /&gt;
setstate swapValues_Labor 2017-11-13 10:44:16 cmd 0&lt;br /&gt;
setstate swapValues_Labor 2017-11-14 17:01:24 humidity 82&lt;br /&gt;
setstate swapValues_Labor 2017-11-13 10:44:16 state initialized&lt;br /&gt;
setstate swapValues_Labor 2017-11-14 17:01:24 temperature 20.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anzeige der uiTable anderer DOIF als Popup-Fenster ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* DOIF-Funktion &amp;lt;code&amp;gt;PUP(&amp;lt;Name des anderen DOIF&amp;gt;,&amp;lt;Iconname@optionale Farbe&amp;gt;)&amp;lt;/code&amp;gt;, wenn das Icon nicht existiert wird der Text als Link in Standardfarbe angezeigt.&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:UiTable_PopUp.png|height 100px|thumb|right|Link oder Icon zur Anzeige eines Popup-Fensters]]&lt;br /&gt;
&lt;br /&gt;
In einer uiTable können die UI-Tabellen anderer DOIF als Popup-Fenster angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; ===&lt;br /&gt;
Die Funktion &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;  inline&amp;gt;PUP(&amp;quot;Grundriss_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_eg\@orange&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt; erzeugt einen Link mit einem orange gefäbten Icon &#039;&#039;&#039;control_building_modern_s_okg_eg&#039;&#039;&#039;, der die UI-Tabelle des DOIF &#039;&#039;&#039;Grundriss_Labor&#039;&#039;&#039; in einem Popup-Fenster anzeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
PUP(&amp;quot;Grundriss_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_eg\@orange&amp;quot;)&lt;br /&gt;
PUP(&amp;quot;Grundriss_position_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_og\@orange&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod PopUp_Labor DOIF (1) ## Grundriss_position_Labor Grundriss_Labor&lt;br /&gt;
attr PopUp_Labor group Labor: uiTable&lt;br /&gt;
attr PopUp_Labor room myHome,DOIF_Labor&lt;br /&gt;
attr PopUp_Labor uiTable PUP(&amp;quot;Grundriss_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_eg\@orange&amp;quot;)\&lt;br /&gt;
PUP(&amp;quot;Grundriss_position_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_og\@orange&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
defmod Grundriss_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_Labor uiTable {\&lt;br /&gt;
  $TABLE = &amp;quot; text-align:center;;width:300px;; height:300px;; background-image:url(./fhem/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TR{1,3} = &amp;quot;class=&#039;&#039;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch})|&amp;quot;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch})|&amp;quot; Bad&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Bad],$TPL{switch})\&lt;br /&gt;
&amp;quot; &amp;quot;|&amp;quot; &amp;quot;|&amp;quot; Diele &amp;quot;,WID([$SELF:Diele],$TPL{switch})\&lt;br /&gt;
&amp;quot;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Kind &amp;quot;,WID([$SELF:Ki],$TPL{switch})|&amp;quot; &amp;quot;\&lt;br /&gt;
&amp;quot;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Balkon&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Balkon],$TPL{switch})|&amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
defmod Grundriss_position_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_position_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_position_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_position_Labor uiTable {\&lt;br /&gt;
  $ATTRIBUTESFIRST = 1;;\&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;;position:relative;; text-align:center;;width:300px;; height:300px;; background-image:url(./fhem/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
 }\&lt;br /&gt;
\&lt;br /&gt;
DEF TPL_Objekt(&amp;quot;&amp;lt;div style=&#039;position:absolute;; Left:&amp;quot;.$1.&amp;quot;px;; top:&amp;quot;.$2.&amp;quot;px;;&#039;&amp;gt;&amp;quot;.$3.WID($4,$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Schlafen&amp;lt;br&amp;gt;&amp;quot;,[$SELF:SZ])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Küche&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Kue])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;225&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Bad&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Bad])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;105&amp;quot;,&amp;quot;Diele &amp;quot;,[$SELF:Diele])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Wohnen A&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ1])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;220&amp;quot;,&amp;quot;Wohnen B&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ2])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Kind&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Ki])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;250&amp;quot;,&amp;quot;Balkon&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Balkon])&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_Labor initialized&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Bad off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:22 Balkon off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Diele off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:42 Ki on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:30 Kue on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:31 SZ on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:46 WZ1 on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:23 WZ2 off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 cmd 0&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 state initialized&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_position_Labor initialized&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:22 Bad off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:46 Balkon off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:30 Diele off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-29 14:04:19 Ki off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-26 16:21:37 Kue off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-29 14:05:41 SZ off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:43 WZ1 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-29 14:04:46 WZ2 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 cmd 0&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 state initialized&lt;br /&gt;
&lt;br /&gt;
setstate PopUp_Labor initialized&lt;br /&gt;
setstate PopUp_Labor 2017-11-29 16:04:05 cmd 0&lt;br /&gt;
setstate PopUp_Labor 2017-11-29 16:04:05 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anzeige einer uiTable über [[weblink]] als Popup-Fenster ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* DOIF-Funktion &amp;lt;code&amp;gt;DOIF_tablePopUp(&amp;lt;Name des DOIF auf dessen UI-Tabelle verwiesen werden soll&amp;gt;,&amp;lt;Name des DOIF auf dessen UI-Tabelle verwiesen werden soll&amp;gt;,&amp;lt;Iconname@optionale Farbe&amp;gt;)&amp;lt;/code&amp;gt;, wenn das Icon nicht existiert wird der Text als Link in Standardfarbe angezeigt.&lt;br /&gt;
}}&lt;br /&gt;
In einer [[weblink]] Definition kann ein Link auf eine uiTable angelegt werden. Damit kann die UI-Tabelle eines DOIF als Popup-Fenster angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Die Definition des [[weblink]] ===&lt;br /&gt;
Die Funktion &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;DOIF_tablePopUp(&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;rc_PLUS\@orange&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt; erzeugt einen Link mit einem orange gefäbten Icon &#039;&#039;&#039;rc_PLUS&#039;&#039;&#039;, der die UI-Tabelle des DOIF &#039;&#039;&#039;PopUp_Labor&#039;&#039;&#039; in einem Popup-Fenster anzeigt. Aus Gründen der Kompatibilität muss der Name des DOIF auf dessen UI-Tabelle der Link verweisen soll, zweimal angegeben werden. Der Kurzname &amp;lt;code&amp;gt;PUP&amp;lt;/code&amp;gt; kann hier nicht verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
Das Beispiel funktioniert nur, wenn die Definitionen aus dem vorhergehenden Beispile angelegt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod WebLink_Labor weblink htmlCode {DOIF_tablePopUp(&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;rc_PLUS\@orange&amp;quot;)}&lt;br /&gt;
attr WebLink_Labor group Labor: uiTable&lt;br /&gt;
attr WebLink_Labor room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
setstate WebLink_Labor initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uhrzeit und Datum ==&lt;br /&gt;
=== Darstellung einer Analoguhr ===&lt;br /&gt;
[[Datei:Analoguhr_uiTable.png|100px|thumb|right|Beispiel für eine Analoguhr]]&lt;br /&gt;
Auf der Seite [http://3quarks.com/de/Bahnhofsuhr/ http://3quarks.com/de/Bahnhofsuhr/] wird ein Javascript für eine Analoguhr bereitgestellt und die Konfiguration beschrieben.&lt;br /&gt;
&lt;br /&gt;
Das in diesem Forenbeitrag {{Link2Forum|Topic=77690|Message=727276|LinkText=Analoguhr für uiTable}} bereitgestellte Script &#039;&#039;doifanaloguhr.js&#039;&#039; zum Laden und Starten des Uhrenscriptes &#039;&#039;station-clock.js&#039;&#039;, ist in der betroffenen FHEMWEB-Instanz über das Attribut JavaScripts einzubinden.&lt;br /&gt;
Die beiden Javascripte &#039;&#039;station-clock.js&#039;&#039; und &#039;&#039;doifanaloguhr.js&#039;&#039; müssen in dem Verzeichnis pgm2 enthalten sein. Die Datei &#039;&#039;doifanaloguhr.js&#039;&#039; ersetzt &#039;&#039;excanvas.js&#039;&#039;. In &#039;&#039;doifanaloguhr.js&#039;&#039; ist bei Bedarf die Konfiguration des Erscheinungsbildes der Uhr vorzunehmen. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;Name der FHEMWEB-Instanz&amp;gt; pgm2/station-clock.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Attribut &#039;&#039;&#039;uiTable&#039;&#039;&#039; eines DOIF ist Uhr mit einem canvas-Element einzubinden, z.B.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;quot;&amp;lt;canvas id=&#039;doifanaloguhr&#039; width=&#039;50&#039; height=&#039;50&#039;&amp;gt;error&amp;lt;/canvas&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Darstellung von Zeit und Datum ===&lt;br /&gt;
[[Datei:Timedate Labor.png|200px|thumb|right|Beispiele für Zeit und Datum]]&lt;br /&gt;
&lt;br /&gt;
Mit dem in diesem Forenbeitrag {{Link2Forum|Topic=77690|Message=729761|LinkText=Zeit und Datum in uiTable}} bereitgestellten Script &#039;&#039;doiftimedate.js&#039;&#039; können Datum und Uhrzeit in verschiedenen Darstellungsweisen angezeigt werden.&lt;br /&gt;
Das Script muss in das Verzeichnis pgm2 kopiert werden und in die entsprechende FHEMWEB-Instanz eingebunden werden über:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;Name der FHEMWEB-Instanz&amp;gt; pgm2/doiftimedate.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Attribut &#039;&#039;&#039;uiTable&#039;&#039;&#039; eines DOIF sind die Zeit- u. Datumteile über einen Klassennamen einzubinden, z.B.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;quot;&amp;lt;span class=&#039;doif-hour&#039;&amp;gt;hour&amp;lt;/span&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
um Stunden anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
Die drei ersten Zeilen des Bildes sind eingebaute Darstellungsweisen, die vierte Zeile ist aus den einzelnen Bestandteilen eines Datums zusammengesetzt.&lt;br /&gt;
&lt;br /&gt;
Die möglichen Klassennamen gehen aus der nachstehenden uiTable-Definition hervor.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;lt;div class=&#039;doif-hourminute&#039;&amp;gt;hourminute&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-date&#039;&amp;gt;date&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-hourminutedate&#039;&amp;gt;hourminutedate&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;&amp;lt;div style=&#039;color:orange;font-size:16pt;font-weight:bold;&#039;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&#039;doif-hour&#039;&amp;gt;hour&amp;lt;/span&amp;gt;&lt;br /&gt;
:&amp;lt;span class=&#039;doif-minute&#039;&amp;gt;minute&amp;lt;/span&amp;gt;&lt;br /&gt;
:&amp;lt;span class=&#039;doif-second&#039;&amp;gt;second&amp;lt;/span&amp;gt;&lt;br /&gt;
, &amp;lt;span class=&#039;doif-day&#039;&amp;gt;day&amp;lt;/span&amp;gt;&lt;br /&gt;
.&amp;lt;span class=&#039;doif-month&#039;&amp;gt;month&amp;lt;/span&amp;gt;&lt;br /&gt;
.&amp;lt;span class=&#039;doif-year&#039;&amp;gt;year&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod timedate_Labor DOIF (#1)&lt;br /&gt;
attr timedate_Labor group Labor: uiTable&lt;br /&gt;
attr timedate_Labor room DOIF_Labor&lt;br /&gt;
attr timedate_Labor uiTable &amp;quot;&amp;lt;div class=&#039;doif-hourminute&#039;&amp;gt;hourminute&amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
\&lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-date&#039;&amp;gt;date&amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
 \&lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-hourminutedate&#039;&amp;gt;hourminutedate&amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
 \&lt;br /&gt;
 &amp;quot;&amp;lt;div style=&#039;color:orange;;font-size:16pt;;font-weight:bold;;&#039;&amp;gt;\&lt;br /&gt;
&amp;lt;span class=&#039;doif-hour&#039;&amp;gt;hour&amp;lt;/span&amp;gt;\&lt;br /&gt;
:&amp;lt;span class=&#039;doif-minute&#039;&amp;gt;minute&amp;lt;/span&amp;gt;\&lt;br /&gt;
:&amp;lt;span class=&#039;doif-second&#039;&amp;gt;second&amp;lt;/span&amp;gt;\&lt;br /&gt;
, &amp;lt;span class=&#039;doif-day&#039;&amp;gt;day&amp;lt;/span&amp;gt;\&lt;br /&gt;
.&amp;lt;span class=&#039;doif-month&#039;&amp;gt;month&amp;lt;/span&amp;gt;\&lt;br /&gt;
.&amp;lt;span class=&#039;doif-year&#039;&amp;gt;year&amp;lt;/span&amp;gt;\&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
=== Arbeitsfläche der Detailansicht für die Bearbeitung von uiTable einrichten === &lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Steuervariable &amp;lt;code&amp;gt;$ATTRIBUTESFIRST=1;&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Attributesfirst.png|200px|thumb|right|Beispiel für die veränderte Detailansicht]]&lt;br /&gt;
Zum Erstellen der UI-Tabelle, wird das Attribut uiTable häufiger gesetzt, um Veränderungen in der uiTable sichtbar zu machen.&lt;br /&gt;
Damit beim Wechsel zwischen der Ansicht der UI-Tabelle und der Attributbearbeitung nicht immer über den DEF-Bereich und die Readings gescrollt werden muss können die Attribute unter die UI-Tabelle geschoben werden.&lt;br /&gt;
Wenn die Steuervariable &amp;lt;code&amp;gt;$ATTRIBUTESFIRST=1;&amp;lt;/code&amp;gt; im oberen Bereich der Tabellendefinition angegeben wird, dann werden die Attribute vor den DEF-Bereich verschoben.&lt;br /&gt;
&lt;br /&gt;
=== Browserunterstützung ===&lt;br /&gt;
Die verschiedenen Browser, Versionen und Mobile-Varianten unterstützen CSS unterschiedlich, siehe z.B. [https://www.w3schools.com/cssref/css3_browsersupport.asp W3Schools CSS Browser Support Reference]&lt;br /&gt;
&lt;br /&gt;
Zur Problemlösung können die entsprechenden Entwicklerseiten beitragen.&lt;br /&gt;
&lt;br /&gt;
* Mozilla [https://developer.mozilla.org/de/docs/Web/CSS https://developer.mozilla.org/de/docs/Web/CSS]&lt;br /&gt;
* Google [https://developers.google.com/web/tools/chrome-devtools/css/ https://developers.google.com/web/tools/chrome-devtools/css/]&lt;br /&gt;
* Apple [https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariCSSRef/Introduction.html https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariCSSRef/Introduction.html]&lt;br /&gt;
* Microsoft [https://msdn.microsoft.com/de-de/library/cc351024(v=vs.85).aspx https://msdn.microsoft.com/de-de/library/cc351024(v=vs.85).aspx]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[DOIFtools#Farbtabellen_erzeugen|DOIFtools Farbtabellen anzeigen]]&lt;br /&gt;
* Style-Attribute [https://www.w3schools.com/cssref/default.asp https://www.w3schools.com/cssref/default.asp]&lt;br /&gt;
* Liste der aktuellen HTML-Elemente [https://developer.mozilla.org/de/docs/Web/HTML/HTML5/HTML5_element_list https://developer.mozilla.org/de/docs/Web/HTML/HTML5/HTML5_element_list]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DOIF/uiTable&amp;diff=24272</id>
		<title>DOIF/uiTable</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DOIF/uiTable&amp;diff=24272"/>
		<updated>2018-01-03T22:28:58Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Frontendelemente über einem Hintergrund (Grundriss) platzieren */Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das DOIF-Attribut &#039;&#039;&#039;uiTable&#039;&#039;&#039; dient der Definition eines User Interface im Kontext von FHEMWEB.&lt;br /&gt;
Die Syntax ist in der Befehlsreferenz zu [https://fhem.de/commandref_DE.html#DOIF_uiTable uiTable] beschrieben und wird hier nicht behandelt.&lt;br /&gt;
An dieser Stelle werden Beispiele zur Gestaltung der &#039;&#039;&#039;uiTable&#039;&#039;&#039; gezeigt.&lt;br /&gt;
&lt;br /&gt;
== Sensorauswahl mit WID und DOIF_Readings == &lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* funktionsloses DOIF &amp;lt;code&amp;gt;Sensorauswahl_Labor DOIF (1)&amp;lt;/code&amp;gt;&lt;br /&gt;
* DOIF_Readings &amp;lt;code&amp;gt;showtemp:ReadingsVal([$SELF:sensorselect],&amp;quot;temperature&amp;quot;,&amp;quot;nix&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Aggregationsfunktion &amp;lt;code&amp;gt;[@&amp;quot;:temperature&amp;quot;:temperature]&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Uitable_sensorauswahl.png|300px|thumb|right|Sensorauswahl mit Wertanzeige des ausgewählten Sensors]]&lt;br /&gt;
Im Auswahlfeld werden alle [[Gerät|Geräte]], die ein [[Readings|Reading]] &#039;&#039;&#039;temperature&#039;&#039;&#039; enthalten aufgelistet. Die Temperatur des gewählten [[Gerät|Gerätes]] wird angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
&amp;lt;code&amp;gt;WID([$SELF:sensorselect],[@&amp;quot;&amp;quot;:temperature])&amp;lt;/code&amp;gt; legt in &#039;&#039;&#039;uiTable&#039;&#039;&#039; ein [[FHEMWEB/Widgets|Select-Widget]] für das [[Readings|Reading]] &#039;&#039;&#039;sensorselect&#039;&#039;&#039; an. Die Liste des [[FHEMWEB/Widgets|Widgets]] wird über die Aggregationsfunktion &amp;lt;code&amp;gt;[@&amp;quot;:temperature&amp;quot;:temperature]&amp;lt;/code&amp;gt; erzeugt.&lt;br /&gt;
Über das [[Attribute|Attribut]] &#039;&#039;&#039;DOIF_Readings&#039;&#039;&#039; &amp;lt;code&amp;gt;showtemp:ReadingsVal([$SELF:sensorselect],&amp;quot;temperature&amp;quot;,&amp;quot;nix&amp;quot;)&amp;lt;/code&amp;gt; wird ein [[Readings|Reading]] &#039;&#039;&#039;showtemp&#039;&#039;&#039; mit der Temperatur des ausgewählten Sensors gesetzt.&lt;br /&gt;
In &#039;&#039;&#039;uiTable&#039;&#039;&#039; zeigt &amp;lt;code&amp;gt;[$SELF:showtemp]&amp;lt;/code&amp;gt; den in &#039;&#039;&#039;showtemp&#039;&#039;&#039; enthaltenen Wert an.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Sensorauswahl_Labor DOIF (1)&lt;br /&gt;
attr Sensorauswahl_Labor DOIF_Readings showtemp:ReadingsVal([$SELF:sensorselect],&amp;quot;temperature&amp;quot;,&amp;quot;nix&amp;quot; )&lt;br /&gt;
attr Sensorauswahl_Labor room DOIF_Labor&lt;br /&gt;
attr Sensorauswahl_Labor uiTable &amp;quot;Sensor auswählen&amp;quot;|&amp;quot;T/°C&amp;quot;\&lt;br /&gt;
WID([$SELF:sensorselect],[@&amp;quot;:temperature&amp;quot;:temperature])|[$SELF:showtemp]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kombination von WID und STY zu einem Thermostat Widget ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* HTML-Elemente &amp;lt;code&amp;gt;&amp;amp;lt;div&amp;gt;&amp;amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Styleattribute &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text-align&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;font-weight&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;font-size&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable Templates &amp;lt;code&amp;gt;$TPL{&amp;lt;name&amp;gt;}=&amp;quot;&amp;lt;template content&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable Funktionen &amp;lt;code&amp;gt;WID([&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;],&amp;lt;widget parameter&amp;gt;)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;STY(&amp;lt;content&amp;gt;,&amp;lt;style attributes&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Uitable_widget_kombi_thermostat.png|300px|thumb|right|Kombination von FHEMWEB-Widgets zu einem Thermostat-Widget]]&lt;br /&gt;
Das Thermostat Widget zeigt mit dem inneren Teilkreis die Isttemperatur an und mit dem äusseren Teilkreis wird die Solltemperatur gesetzt. Das obere Textfeld zeigt den Zahlenwert der Solltemperatur, der Untere den der Isttemperatur. Die Farbe, der Soll- und Isttemperatur ändert sich mit ihrem Wert.&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung der Kombination ===&lt;br /&gt;
&#039;&#039;&#039;uiTable&#039;&#039;&#039; ist tabellenförmig aufgebaut, in einer Tabellenzelle können mehrere Elemente kombiniert werden. Da zwei gleich große knob-Widgets übereinander liegen ist nur das obere Widget, die Solltemperatur, bedienbar.&lt;br /&gt;
Die Widgetkombination wird durch den folgenden Code-Auszug beschrieben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 $TPL{style2}=&amp;quot;text-align:right;width:23px;position:absolute;left:13px;top:26px;font-weight:bold;font-size:12px;color:&amp;quot;;&lt;br /&gt;
 $TPL{style3}=&amp;quot;text-align:right;width:23px;position:absolute;left:13px;top:13px;font-weight:bold;font-size:12px;color:&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 $TPL{knob1}=&amp;quot;knob,thickness:.4,fgColor:#00A5FF,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;&lt;br /&gt;
 $TPL{knob2}=&amp;quot;knob,thickness:.3,fgColor:#FFA500,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative;width:50px;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID([HMdummy_Labor:measured-temp],$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID([HMdummy_Labor:desired-temp],$TPL{knob2},&amp;quot;set&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY([HMdummy_Labor:measured-temp:d1],$TPL{style2}.DOIF_hsv([HMdummy_Labor:measured-temp],7,25,240,360,100,100)).STY([HMdummy_Labor:desired-temp:d1],$TPL{style3}.DOIF_hsv([HMdummy_Labor:desired-temp],7,25,240,360,100,100)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit style2, style3, knob1 und knob2 werden vier Templates gespeichert. Sie werden jeweils nur einmal verwendet, verkürzen aber die Tabellendefinition.&lt;br /&gt;
Die Templates knob1 und knob2 beschreiben die [[FHEMWEB/Widgets|Knob-Widgets]].&lt;br /&gt;
Die Templates style2 und style3 beschreiben die Textfelder für die Soll- und Isttemperatur durch die Angabe der entsprechenden CSS-Attribute.&lt;br /&gt;
&lt;br /&gt;
==== Struktur der Kombination ====&lt;br /&gt;
Die Tabellenzelle wird mit div-Elementen nach folgenden Schema strukturiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div mit relativer Position zum Elternelement&amp;gt;&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Knob-Widget Isttemperatur &amp;lt;/div&amp;gt; unterste Ebene&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Knob-Widget Solltemperatur &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Solltemperatur &amp;lt;/div&amp;gt; in STY enthalten und beschrieben durch style3&lt;br /&gt;
    &amp;lt;div mit absoluter Position zum Elternelement&amp;gt; Isttemperatur &amp;lt;/div&amp;gt; in STY enthalten und beschrieben durch style2, oberste Ebene&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit &amp;lt;code&amp;gt;position:relative;width:50px;height:50px&amp;lt;/code&amp;gt; wird das oberste div-Element in der Tabellenzelle positioniert. Durch die Verwendung des CSS-Attributes &#039;&#039;&#039;position&#039;&#039;&#039; wird das div-Element zum Bezugspunkt der nachfolgenden Elemente mit absoluter Positionsangabe.&lt;br /&gt;
&lt;br /&gt;
==== Positionierung der FHEMWEB-Widgets ====&lt;br /&gt;
Mit &amp;lt;code&amp;gt;position:absolute;left:0px;top:0px&amp;lt;/code&amp;gt; werden die das knob-Widget umschliessenden div-Elemente in die linke obere Ecke ihres Elternelementes positioniert.&lt;br /&gt;
&lt;br /&gt;
==== Position und Format der Textanzeige ====&lt;br /&gt;
&amp;lt;code&amp;gt;position:absolute;left:13px;top:26px&amp;lt;/code&amp;gt; positioniert das div-Element absolut zum Bezugspunkt, 13 Pixel nach rechts und 26 Pixel nach unten, von links oben aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;width:23px&amp;lt;/code&amp;gt; legt die Breite des div-Elements auf 23 Pixel fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt; formatiert den Text fett.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;font-size:12px&amp;lt;/code&amp;gt; legt die Schriftgröße auf 12 Pixel fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;text-align:right&amp;lt;/code&amp;gt; richtet den Text rechtsbündig aus.&lt;br /&gt;
&lt;br /&gt;
==== Dynamische Farben ====&lt;br /&gt;
&amp;lt;code&amp;gt;color:#&amp;amp;lt;berechnete Farbe&amp;amp;gt;&amp;lt;/code&amp;gt; legt die Farbe fest.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;$TPL{style2}.DOIF_hsv([HMdummy_Labor:measured-temp],7,25,240,360,100,100)&amp;lt;/code&amp;gt; wird die Farbnummer an das Template &#039;&#039;&#039;style3&#039;&#039; angehängt.&lt;br /&gt;
Die Farbnummer wird mit der DOIF internen Funktion DOIF_hsv berechnet. Die Funktion wird mit den Parametern &amp;amp;lt;laufender Wert&amp;amp;gt;,&amp;amp;lt;unterer Wert&amp;amp;gt;,&amp;amp;lt;oberer Wert&amp;amp;gt;,&amp;amp;lt;HUE-Startwert&amp;amp;gt;,&amp;amp;lt;HUE-Endwert&amp;amp;gt;,&amp;amp;lt;Farbsättigung&amp;amp;gt;,&amp;amp;lt;Hellwert&amp;amp;gt; aufgerufen. Der laufende Wert ergibt sich aus dem [[Readings|Reading]] &#039;&#039;&#039;measured-temp&#039;&#039;&#039; des [[Gerät|Gerätes]] &#039;&#039;&#039;HMdummy_Labor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Alternativ, die Nutzung von Methodentemplates ===&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Methodentemplates definieren&amp;lt;code&amp;gt;DEF TPL_&amp;amp;lt;name&amp;amp;gt;(&amp;amp;lt;template definition&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Methodentemplates anwenden &amp;lt;code&amp;gt;TPL_&amp;amp;lt;name&amp;amp;gt;(&amp;amp;lt;parameter1;,&amp;amp;lt;parameter2;, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Die Kombination wird als Template einer Methode angelegt. Damit wird die Tabellendefinition übersichtlicher und das Template kann mit anderen Parametern aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Das Template mit den Platzhaltern &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;$1&amp;lt;/syntaxhighlight&amp;gt; bis &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;$4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
DEF TPL_Thermostat(&amp;quot;&amp;lt;div style=&#039;position:relative;width:50px;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID($1,$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px&#039;&amp;gt;&amp;quot;.WID($2,$TPL{knob2},&amp;quot;set&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY($3,$TPL{style2}.DOIF_hsv($1,7,25,240,360,100,100)).STY($4,$TPL{style3}.DOIF_hsv($2,7,25,240,360,100,100)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und die Definition des Widgets in der Tabelle mit vier Parametern in DOIF-Syntax.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
TPL_Thermostat([HMdummy_Labor:measured-temp],[HMdummy_Labor:desired-temp],[HMdummy_Labor:measured-temp:d1],[HMdummy_Labor:desired-temp:d1])&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] (nur das Attribut uiTable) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr widgetkombi_Labor uiTable {\&lt;br /&gt;
$TPL{style2}=&amp;quot;text-align:right;;width:23px;;position:absolute;;left:13px;;top:26px;;font-weight:bold;;font-size:12px;;color:&amp;quot;;;\&lt;br /&gt;
$TPL{style3}=&amp;quot;text-align:right;;width:23px;;position:absolute;;left:13px;;top:13px;;font-weight:bold;;font-size:12px;;color:&amp;quot;;;\&lt;br /&gt;
\&lt;br /&gt;
$TPL{knob1}=&amp;quot;knob,thickness:.4,fgColor:#00A5FF,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;;\&lt;br /&gt;
$TPL{knob2}=&amp;quot;knob,thickness:.3,bgColor:#808080,fgColor:#FFA500,min:7,max:30,width:50,height:50,step:.5,angleArc:270,angleOffset:225,displayInput:false&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
DEF TPL_Thermostat(&amp;quot;&amp;lt;div style=&#039;position:relative;;width:50px;;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:0px;;top:0px&#039;&amp;gt;&amp;quot;.WID($1,$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:0px;;top:0px&#039;&amp;gt;&amp;quot;.WID($2,$TPL{knob2},&amp;quot;set&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY($3,$TPL{style2}.DOIF_hsv($1,7,25,240,360,100,100)).STY($4,$TPL{style3}.DOIF_hsv($2,7,25,240,360,100,100)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable,disabled&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
TPL_Thermostat([HMdummy_Labor:measured-temp],[HMdummy_Labor:desired-temp],[HMdummy_Labor:measured-temp:d1],[HMdummy_Labor:desired-temp:d1])&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kombination von WID und STY zum Festlegen zweier Grenzwerte ==&lt;br /&gt;
[[Datei:Uitable_widget_kombi_grenzwert.png|100px|right]]&lt;br /&gt;
Die Kombination ist so angelegt, dass beide Widgets bedienbar sind.&lt;br /&gt;
Es wird jeweils ein Reading durch ein Widget gesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Positionierung der knob-Widgets ===&lt;br /&gt;
Die Widget sind unterschiedlich groß.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=perl&amp;gt;&lt;br /&gt;
$TPL{knob1}=&amp;quot;... width:50,height:50 ...&amp;quot;&lt;br /&gt;
$TPL{knob2}=&amp;quot;... width:38,height:38 ...&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daher muss &#039;&#039;&#039;knob2&#039;&#039;&#039; 6px nach rechts und unten positioniert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&amp;lt;div style=&#039;... left:6px;;top:6px&#039;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit wird erreicht, dass beide Widgets bedienbar bleiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=perl&amp;gt;&lt;br /&gt;
defmod widgetkombi2_Labor DOIF (1)&lt;br /&gt;
attr widgetkombi2_Labor group Labor: uiTable&lt;br /&gt;
attr widgetkombi2_Labor room DOIF_Labor&lt;br /&gt;
attr widgetkombi2_Labor uiTable {\&lt;br /&gt;
$TPL{style2}=&amp;quot;text-align:center;;width:23px;;position:absolute;;left:13px;;top:13px;;font-weight:bold;;font-size:12px;;color:red&amp;quot;;;\&lt;br /&gt;
$TPL{style3}=&amp;quot;text-align:center;;width:23px;;position:absolute;;left:13px;;top:26px;;font-weight:bold;;font-size:12px;;color:blue&amp;quot;;;\&lt;br /&gt;
\&lt;br /&gt;
$TPL{knob1}=&amp;quot;knob,thickness:.23,bgColor:lightgrey,fgColor:#FF0000,min:0,max:100,width:50,height:50,step:1,angleArc:270,angleOffset:225,displayInput:false,cursor:1,lineCap:round&amp;quot;;;\&lt;br /&gt;
$TPL{knob2}=&amp;quot;knob,thickness:.32,bgColor:#808080,fgColor:#0000FF,min:0,max:100,width:38,height:38,step:1,angleArc:270,angleOffset:225,displayInput:false,cursor:1,lineCap:round&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative;;width:50px;;height:50px&#039;&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:px;;top:0px&#039;&amp;gt;&amp;quot;.WID([$SELF:obererGrenzwert],$TPL{knob1}).&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div style=&#039;position:absolute;;left:6px;;top:6px&#039;&amp;gt;&amp;quot;.WID([$SELF:untererGrenzwert],$TPL{knob2}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;.STY([$SELF:obererGrenzwert],$TPL{style2}).STY([$SELF:untererGrenzwert],$TPL{style3}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate widgetkombi2_Labor initialized&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:20:15 cmd 0&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:55:42 obererGrenzwert 87&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:20:15 state initialized&lt;br /&gt;
setstate widgetkombi2_Labor 2017-10-25 11:55:45 untererGrenzwert 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FHEM-Befehl mit Icon und Text-Overlay ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* HTML-Elemente &amp;lt;code&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Link-Attribute &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable Formatierung einer Tabellenzelle &amp;lt;code&amp;gt;$TD{row}{col}=&amp;quot;&amp;lt;HTML-Attribute&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute , &amp;lt;code&amp;gt;background-color&amp;lt;/code&amp;gt;&lt;br /&gt;
* FHEMWEB-Funktion &amp;lt;code&amp;gt;FW_makeImage(&amp;lt;image name&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* FHEMWEB-Variablen &amp;lt;code&amp;gt;$FW_ME&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$FW_CSRF&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Uitable_widget_cmdlink_icon_text.png|300px|thumb|right|Befehlslink mit Icon, Text und Hinweistext]]&lt;br /&gt;
Mit dieser Widgetkombination wird ein FHEM-Befehl als Link in eine Tabellenzelle der &#039;&#039;&#039;uiTable&#039;&#039;&#039; eingefügt. Als Linktext wird ein Icon eingebunden und ein Text über das Icon positioniert. Der Link enthält einen Hinweistext. Siehe auch {{Link2Forum|Topic=80835|Message=729002|LinkText=Link mit Icon und FHEM-Befehl}} ff.&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
Mit &amp;lt;code&amp;gt;$TD{0}{0}=&amp;quot;style=&#039;position:relative&#039;&amp;quot;;&amp;lt;/code&amp;gt; wird die oberste linke Zelle als der Bezugspunkt für die Textpositionierung festgelegt. Als erstes wird der der Link mit dem a-Element angelegt. Mit dem Attribut &amp;lt;code&amp;gt;target=&#039;_blank&#039;&amp;lt;/code&amp;gt; erfolgt die Ausgabe der aufgerufenen Seite in einem neuen Browser-Tab. Die URL wird in dem Attribut &amp;lt;code&amp;gt;href=&#039;$FW_ME?detail=$SELF&amp;amp;cmd.$SELF=list $SELF$FW_CSRF&#039; title=&#039;list $SELF&#039;&amp;lt;/code&amp;gt; angegeben. Darin liefert &amp;lt;code&amp;gt;$FW_ME&amp;lt;/code&amp;gt; den Webnamen von FHEM, &amp;lt;code&amp;gt;$SELF&amp;lt;/code&amp;gt; den Eigennamen des DOIF, und &amp;lt;code&amp;gt;$FW_CSRF&amp;lt;/code&amp;gt; das aktuelle CSRF-Token. Das Attribut &amp;lt;code&amp;gt;title=&#039;list $SELF&#039;&amp;lt;/code&amp;gt; gibt den Hinweistext an. Als Linktext liefert die Funktion &amp;lt;code&amp;gt;FW_makeImage(&amp;quot;time_note\@lightblue&amp;quot;)&amp;lt;/code&amp;gt; den HTML-code zum Anzeigen des Icons, dabei beschreibt &amp;lt;code&amp;gt;&amp;quot;time_note\@lightblue&amp;quot;&amp;lt;/code&amp;gt; den Iconnamen und die Einfärbung des Icons. Auch der über das Icon gelegte Text gehört zum Linktext, er wird aber durch die Positionsangaben &amp;lt;code&amp;gt;style=&#039;position:absolute; left:12px; top:20px;&amp;lt;/code&amp;gt; auf das Icon geschoben. Die Angaben &amp;lt;code&amp;gt;font-size:12px; background-color:lightblue; color:darkred;&amp;lt;/code&amp;gt; dienen der Formatierung des Textes.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod widget_cmdlink_icon_text DOIF (1)&lt;br /&gt;
attr widget_cmdlink_icon_text group Labor: uiTable&lt;br /&gt;
attr widget_cmdlink_icon_text room DOIF_Labor,DOIFalone&lt;br /&gt;
attr widget_cmdlink_icon_text uiTable {\&lt;br /&gt;
  $TD{0}{0}=&amp;quot;style=&#039;position:relative&#039;&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;a target=&#039;_blank&#039; href=&#039;$FW_ME?cmd.$SELF=list $SELF$FW_CSRF&#039; title=&#039;list $SELF&#039;&amp;gt;&amp;quot;.FW_makeImage(&amp;quot;time_note\@lightblue&amp;quot;).&amp;quot;&amp;lt;div style=&#039;position:absolute;; left:12px;; top:20px;; font-size:12px;; background-color:lightblue;; color:darkred&#039;&amp;gt;list&amp;lt;/div&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;\&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Frontendelemente über einem Hintergrund (Grundriss) platzieren ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Formatierung des table-Element &amp;lt;code&amp;gt;$TABLE&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute &amp;lt;code&amp;gt;background-image:url&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background-size&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt;&lt;br /&gt;
* HTML Zeilenumbruch &amp;lt;code&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt;, Leerzeichen &amp;lt;code&amp;gt;&amp;amp;amp;nbsp&amp;amp;#59;&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Grundriss1.png|300px|thumb|right|Positionierung von Text und Widget auf einem Hintergrundbild]]&lt;br /&gt;
In diesem Beispiel wird ein Hintergundbild geladen und das Bild mit Widgets und Text beschriftet.&lt;br /&gt;
Dem table-Element der uiTable wird über &amp;lt;code&amp;gt;$TABLE = &amp;quot;CSS-Attribute&amp;quot;;&amp;lt;/code&amp;gt; eine Formatierung zugewiesen. Die Formatierung beinhaltet das Laden eine Hintergrundbildes mit &amp;lt;code&amp;gt;background-image:url($FW_ME/www/pgm2/images/Grundriss.svg);&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Positionierung über die Matrixstruktur einer Tabelle ===&lt;br /&gt;
Durch die Formatierung &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; werden wird der Zelleninhalt zentriert. Die Positionierung  von Text und Widget, die Verschiebung aus der Mitte der Zelle, erfolgt durch Zeilenumbruch &amp;lt;code&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; und Leerzeichen &amp;lt;code&amp;gt;&amp;amp;amp;nbsp&amp;amp;#59;&amp;lt;/code&amp;gt;. Da Text und Widget in der Tabellenzelle durch ein Komma getrennt werden, erfolgt dort ein Zeilenumbruch.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
Das Beispiel funktioniert nur, wenn das Hintergrundbild in das Verzeichnis &amp;lt;code&amp;gt;/www/pgm2/images/&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
* Download von  [[Medium:Grundriss.svg|Grundriss.svg]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Grundriss_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_Labor uiTable {\&lt;br /&gt;
  $TABLE = &amp;quot; text-align:center;;width:300px;; height:300px;; background-image:url($FW_ME/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TR{1,3} = &amp;quot;class=&#039;&#039;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch})|&amp;quot;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch})|&amp;quot; Bad&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Bad],$TPL{switch})\&lt;br /&gt;
&amp;quot; &amp;quot;|&amp;quot; &amp;quot;|&amp;quot; Diele &amp;quot;,WID([$SELF:Diele],$TPL{switch})\&lt;br /&gt;
&amp;quot;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Kind &amp;quot;,WID([$SELF:Ki],$TPL{switch})|&amp;quot; &amp;quot;\&lt;br /&gt;
&amp;quot;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Balkon&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Balkon],$TPL{switch})|&amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_Labor initialized&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Bad off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:22 Balkon off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Diele off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:42 Ki on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:30 Kue on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:31 SZ on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:46 WZ1 on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:23 WZ2 off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 cmd 0&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alternativ, freie Positionierung von Text und Widgets ===&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Festlegen des Positionierungsbezugspunktes mit &amp;lt;code&amp;gt;position:relative;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Positionierung der Frontendelemente mit &amp;lt;code&amp;gt;position:absolute; Left:&amp;amp;lt;Pixel nach rechts&amp;amp;gt;px; top:&amp;amp;lt;Pixel nach unten&amp;amp;gt;px;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Verwendung nur einer Tabellenzelle&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Grundriss2.png|300px|thumb|right|Absolute Positionierung]]Widgets und Texte werden auf dem Hintergrundbild durch Angabe ihrer absoluten Position zur linken oberen Ecke der Tabelle, bzw. des Hintergrundbilder positioniert. Die Positionierung kann pixelgenau angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Der gesamte Text und die Widgets werden nur in einer Tabellenzelle platziert. Die linke obere Ecke der Tabelle wird mit &amp;lt;code&amp;gt;position:relative;&amp;lt;/code&amp;gt; zum Bezugspunkt. Die zu positionierenden Elemente werden mit &amp;lt;code&amp;gt;position:absolute; Left:&amp;amp;lt;Pixel nach rechts&amp;amp;gt;px; top:&amp;amp;lt;Pixel nach unten&amp;amp;gt;px;&amp;lt;/code&amp;gt; platziert. Text u. Widget sind von einem div-Element umschlossen, so dass sie als Einheit positioniert werden können.&lt;br /&gt;
&lt;br /&gt;
Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; mit absoluten Positionsangaben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;position:relative; text-align:center;width:300px; height:300px; background-image:url($FW_ME/www/pgm2/images/Grundriss.svg); background-size: 300px 300px;&amp;quot;;&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:absolute; left:35px; top:25px;&#039;&amp;gt;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:25px;&#039;&amp;gt;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:225px; top:25px;&#039;&amp;gt;Bad&amp;quot;,WID([$SELF:Bad],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:105px;&#039;&amp;gt;Diele &amp;quot;.WID([$SELF:Diele],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:35px; top:160px;&#039;&amp;gt;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:35px; top:220px;&#039;&amp;gt;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:160px;&#039;&amp;gt;Kind&amp;quot;,WID([$SELF:Ki],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute; left:145px; top:250px;&#039;&amp;gt;Balkon&amp;quot;,WID([$SELF:Balkon],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1 für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
In diesem Beispiel wurde gegenüber dem vorhergehenden Beispiel nur die Definiton des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; geändert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Grundriss_position_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_position_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_position_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_position_Labor uiTable {\&lt;br /&gt;
  $ATTRIBUTESFIRST = 1;;\&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;;position:relative;; text-align:center;;width:300px;; height:300px;; background-image:url($FW_ME/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
 }\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:absolute;; Left:35px;; top:25px;;&#039;&amp;gt;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:25px;;&#039;&amp;gt;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:225px;; top:25px;;&#039;&amp;gt;Bad&amp;quot;,WID([$SELF:Bad],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:105px;;&#039;&amp;gt;Diele &amp;quot;.WID([$SELF:Diele],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:35px;; top:160px;;&#039;&amp;gt;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:35px;; top:220px;;&#039;&amp;gt;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:160px;;&#039;&amp;gt;Kind&amp;quot;,WID([$SELF:Ki],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div style=&#039;position:absolute;; Left:145px;; top:250px;;&#039;&amp;gt;Balkon&amp;quot;,WID([$SELF:Balkon],$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_position_Labor initialized&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:22 Bad off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:46 Balkon off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:30 Diele off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:27 Ki on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:28 Kue on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:27 SZ off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:43 WZ1 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:29 WZ2 on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 cmd 0&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2 für [[Import_von_Code_Snippets|Raw definition]], mit Methodentemplate ===&lt;br /&gt;
In diesem Beispiel wurde gegenüber dem vorhergehenden Beispiel nur die Definiton des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; geändert.&lt;br /&gt;
In dieser Variante wird ein Methodentemplate für das Objekt aus Text und Widget verwendet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod Grundriss_position_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_position_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_position_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_position_Labor uiTable {\&lt;br /&gt;
  $ATTRIBUTESFIRST = 1;;\&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;;position:relative;; text-align:center;;width:300px;; height:300px;; background-image:url(./fhem/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
 }\&lt;br /&gt;
\&lt;br /&gt;
DEF TPL_Objekt(&amp;quot;&amp;lt;div style=&#039;position:absolute;; Left:&amp;quot;.$1.&amp;quot;px;; top:&amp;quot;.$2.&amp;quot;px;;&#039;&amp;gt;&amp;quot;.$3.WID($4,$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Schlafen&amp;lt;br&amp;gt;&amp;quot;,[$SELF:SZ])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Küche&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Kue])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;225&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Bad&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Bad])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;105&amp;quot;,&amp;quot;Diele &amp;quot;,[$SELF:Diele])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Wohnen A&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ1])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;220&amp;quot;,&amp;quot;Wohnen B&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ2])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Kind&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Ki])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;250&amp;quot;,&amp;quot;Balkon&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Balkon])&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_position_Labor initialized&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:22 Bad off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:46 Balkon off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:30 Diele off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:27 Ki on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:28 Kue on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:27 SZ off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:43 WZ1 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:30:29 WZ2 on&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 cmd 0&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 state initialized&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Icon mit animierter Füllung ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* benutzerdefinierte Perl-Funktion &amp;lt;code&amp;gt;sub FUNC_&amp;amp;lt;name&amp;amp;gt;{&amp;amp;lt;Funktionsblock&amp;amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute &amp;lt;code&amp;gt;linear-gradient&amp;lt;/code&amp;gt;&lt;br /&gt;
* RGB-Farbangabe mit &amp;amp;alpha;-Kanal &amp;lt;code&amp;gt;rgba(&amp;amp;lt;rotwert&amp;amp;gt;,&amp;amp;lt;grünwert&amp;amp;gt;,&amp;amp;lt;blauwert&amp;amp;gt;,&amp;amp;lt;transparenzwert&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:uiTable_gradiend_Labor.png|300px|thumb|right|Icon mit animierter Füllung]]&lt;br /&gt;
Das Icon für eine Zisterne wird mit einem veränderlichen Hintergrund angezeigt, der den Füllstand darstellt.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau der Kombination ===&lt;br /&gt;
Der Zelleninhalt hat folgende Struktur.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div Bezugspunkt&amp;gt;&lt;br /&gt;
  &amp;lt;div dynamischer Gradiend untere Ebene&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div obere Ebene mit SVG als Inhalt&amp;gt;SVG&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Bezugspunkt und die Größe wird mit &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;&amp;quot;&amp;lt;div style=&#039;width:32px;height:35px;position:relative;&#039;&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; angegeben.&lt;br /&gt;
&lt;br /&gt;
Die untere Ebene wird durch &amp;lt;code&amp;gt;STY&amp;lt;/code&amp;gt; beschrieben, der Inhalt wird durch &amp;lt;code&amp;gt;FUNC_zisterne([HMdummy_Labor:level])&amp;lt;/code&amp;gt; erzeugt, die Formatierung erfolgt über &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;positon:absolute;left:0px;top:0px;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die obere Ebene wird durch das div-Element &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;&amp;quot;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px;&#039;&amp;gt;&amp;quot;.FW_makeImage(&#039;zisterne&#039;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; beschrieben, wobei der Inhalt, das Icon, durch die Funktion &amp;lt;code&amp;gt;FW_makeImage(&#039;zisterne&#039;)&amp;lt;/code&amp;gt; zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Die selbst definierte Funktion &amp;lt;code&amp;gt;FUNC_zisterne&amp;lt;/code&amp;gt; gibt ein div-Element zurück, dass die Form der Füllung des Icons, die Richtung der Füllung &amp;lt;code&amp;gt;to top&amp;lt;/code&amp;gt; mit der Position der Farbgrenze &amp;lt;code&amp;gt;rgba(0,0,230,0.5) ($val*24/100)px, rgba(0,0,0,0) ($val*24/100)px);&amp;lt;/code&amp;gt; durch den &amp;lt;code&amp;gt;linear-gradient&amp;lt;/code&amp;gt; festlegt.&lt;br /&gt;
&lt;br /&gt;
Durch ein Verschieben der Farbgrenze über den Wert des [[Readings]] &amp;lt;code&amp;gt;HMdummy_Labor:level&amp;lt;/code&amp;gt;, wird die Füllhöhe animiert. &lt;br /&gt;
&lt;br /&gt;
Die Füllhöhe der Zisterne (0-100) wird umgerechnet auf die Füllhöhe des Icons (0px-24px) mit &amp;lt;code&amp;gt;$val*24/100&amp;lt;/code&amp;gt;, dabei ist &amp;lt;code&amp;gt;$val&amp;lt;/code&amp;gt; die aktuelle Füllhöhe der Zisterne, dargestellt durch das [[Readings|Reading]] &amp;lt;code&amp;gt;HMdummy_Labor:level&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; mit absoluten Positionsangaben ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
sub FUNC_zisterne {&lt;br /&gt;
    my($val)= @_;&lt;br /&gt;
    my $ret= &amp;quot;&amp;lt;div style=\&amp;quot;position:absolute;bottom:3px;left:6px;width:20px;height:24px;background:linear-gradient( to top, rgba(0,0,230,0.5)  &amp;quot;.($val*24/100).&amp;quot;px, rgba(0,0,0,0) &amp;quot;.($val*24/100).&amp;quot;px);\&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
    return $ret;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;width:32px;height:35px;position:relative;&#039;&amp;gt;&amp;quot;.STY(FUNC_zisterne([HMdummy_Labor:level]),&amp;quot;positon:absolute;left:0px;top:0px;&amp;quot;).&amp;quot;&amp;lt;div style=&#039;position:absolute;left:0px;top:0px;&#039;&amp;gt;&amp;quot;.FW_makeImage(&#039;zisterne&#039;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
Das Beispiel funktioniert nur, wenn das Icon &#039;&#039;&#039;zisterne.svg&#039;&#039;&#039; in ein Verzeichnis unterhalb von &amp;lt;code&amp;gt;/www/images/&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
&lt;br /&gt;
* Download von  [[Medium:zisterne.svg|zisterne.svg]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod gradiend_Labor DOIF (1) ## HMsensor_Labor HMdummy_Labor&lt;br /&gt;
attr gradiend_Labor group Labor: uiTable&lt;br /&gt;
attr gradiend_Labor room DOIF_Labor,DOIFalone&lt;br /&gt;
attr gradiend_Labor uiTable {\&lt;br /&gt;
sub FUNC_zisterne {\&lt;br /&gt;
    my($val)= @_;;\&lt;br /&gt;
    my $ret= &amp;quot;&amp;lt;div style=\&amp;quot;position:absolute;;bottom:3px;;left:6px;;width:20px;;height:24px;;background:linear-gradient( to top, rgba(0,0,230,0.5)  &amp;quot;.($val*24/100).&amp;quot;px, rgba(0,0,0,0) &amp;quot;.($val*24/100).&amp;quot;px);;\&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;;\&lt;br /&gt;
    return $ret;;\&lt;br /&gt;
  }\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;width:32px;;height:35px;;position:relative;;&#039;&amp;gt;&amp;quot;.STY(FUNC_zisterne([HMdummy_Labor:level]),&amp;quot;positon:absolute;;left:0px;;top:0px;;&amp;quot;).&amp;quot;&amp;lt;div style=&#039;position:absolute;;left:0px;;top:0px;;&#039;&amp;gt;&amp;quot;.FW_makeImage(&#039;zisterne&#039;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
defmod HMdummy_Labor dummy&lt;br /&gt;
attr HMdummy_Labor group Labor: uiTable&lt;br /&gt;
attr HMdummy_Labor room DOIF_Labor&lt;br /&gt;
attr HMdummy_Labor userReadings desired-temp {ReadingsNum($name,&amp;quot;state&amp;quot;,7)}&lt;br /&gt;
&lt;br /&gt;
defmod HMsensor_Labor DOIF ([+1])\&lt;br /&gt;
  (setreading HMdummy_Labor measured-temp {(if ([HMdummy_Labor:measured-temp] &amp;lt; [HMdummy_Labor:desired-temp]){[HMdummy_Labor:measured-temp]+.5} else {7})},\&lt;br /&gt;
  setreading HMdummy_Labor level {(if ([HMdummy_Labor:level] &amp;lt; 100){[HMdummy_Labor:level]+5} else {0})})&lt;br /&gt;
attr HMsensor_Labor do always&lt;br /&gt;
attr HMsensor_Labor group Labor: uiTable&lt;br /&gt;
attr HMsensor_Labor room DOIF_Labor&lt;br /&gt;
attr HMsensor_Labor webCmd enable:disable&lt;br /&gt;
&lt;br /&gt;
setstate HMdummy_Labor desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-08 23:34:23 desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-08 23:34:23 level 75&lt;br /&gt;
setstate HMdummy_Labor 2017-11-08 23:34:23 measured-temp 27&lt;br /&gt;
setstate HMdummy_Labor 2017-11-06 12:04:39 state desired-temp 29&lt;br /&gt;
&lt;br /&gt;
setstate HMsensor_Labor disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 cmd 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 cmd_event timer_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 cmd_nr 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 last_cmd cmd_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 mode disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:34:23 state disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-08 23:54:37 timer_01_c01 08.11.2017 23:54:38&lt;br /&gt;
&lt;br /&gt;
setstate gradiend_Labor initialized&lt;br /&gt;
setstate gradiend_Labor 2017-11-08 23:35:44 cmd 0&lt;br /&gt;
setstate gradiend_Labor 2017-11-08 23:35:44 state initialized&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ladezustand als vertikaler, linearer Gradiend ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* benutzerdefinierte Perl-Funktion &amp;lt;code&amp;gt;sub FUNC_&amp;amp;lt;name&amp;amp;gt;{&amp;amp;lt;Funktionsblock&amp;amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* uiTable-Funktion &amp;lt;code&amp;gt;STY&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Attribute &amp;lt;code&amp;gt;linear-gradient&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;border-style&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;border-width&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;border-color&amp;lt;/code&amp;gt;&lt;br /&gt;
* RGB-Farbangabe mit &amp;amp;alpha;-Kanal &amp;lt;code&amp;gt;rgba(&amp;amp;lt;rotwert&amp;amp;gt;,&amp;amp;lt;grünwert&amp;amp;gt;,&amp;amp;lt;blauwert&amp;amp;gt;,&amp;amp;lt;transparenzwert&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:uiTable_verticalGradient.png|height 100px|thumb|right|Vertikaler Gradiend mit animierter Überlagerung]]&lt;br /&gt;
Der farbige Gradiend (rot, gelb, grün von unten nach oben) wird zu dem Teil abgedeckt, welcher der Ergänzung des Ladezustandes zu 100 entspricht.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau der Kombination ===&lt;br /&gt;
Der Zelleninhalt hat folgende Struktur.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div Bezugspunkt und statischer Gradiend (rot,gelb,grün) als Hintergrung&amp;gt;&lt;br /&gt;
  &amp;lt;div untere Ebene dynamischem Gradienten&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div obere Ebene mit Wert als Inhalt&amp;gt;Wert&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Bezugspunkt, die Größe, der Rahmen und der statische Gradiend wird mit &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; inline&amp;gt;&amp;lt;div style=&#039;border-width:2px;border-style:solid;border-color:gray;position:relative;width:25px;height:100px;background:linear-gradient( to top, red 0px,yellow 50px,green 100px);&#039;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; festgelegt.&lt;br /&gt;
&lt;br /&gt;
Der dynamische Gradiend wird durch die benutzerdefinierte Funktion &amp;lt;code&amp;gt;FUNC_batt&amp;lt;/code&amp;gt; zurückgegeben, &amp;lt;code&amp;gt;(100-$val)&amp;lt;/code&amp;gt; berechnet den abzudeckenden Teil des rot, gelb, grünen Gradienten.&lt;br /&gt;
&lt;br /&gt;
Durch &amp;lt;code&amp;gt;STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:9px;position:absolute;top:45px;right:1px&amp;quot;)&amp;lt;/code&amp;gt; wird der Wert positioniert und angezeigt.&lt;br /&gt;
 &lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; mit absoluten Positionsangaben ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  $TD{0}{0}=&amp;quot; colspan=2 &amp;quot;;&lt;br /&gt;
  sub FUNC_batt {&lt;br /&gt;
    my($val)=@_;&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;left:0px;width:25px;height:100px;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;px,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;px);&amp;quot;;&lt;br /&gt;
    return $ret;&lt;br /&gt;
  }&lt;br /&gt;
  sub FUNC_batt2 {&lt;br /&gt;
    my($val)=@_;&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;left:9px;top:6px;width:14px;height:27px;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;%,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;%);&amp;quot;;&lt;br /&gt;
    return $ret;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;border-width:2px;border-style:solid;border-color:gray;position:relative;width:25px;height:100px;background:linear-gradient( to top, red 0px,yellow 50px,green 100px);&#039;&amp;gt;&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:9px;position:absolute;top:45px;right:1px&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;|&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative&#039;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;position:absolute;left:9px;top:6px;width:14px;height:27px;background:linear-gradient( to top, red 0%,yellow 50%,green 100%);&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt2([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:6px;position:absolute;top:15px;left:10px&amp;quot;).STY(FW_makeImage(&amp;quot;measure_battery_0&amp;quot;)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Anwendung des Anwendung der überlagerten Gradienten auf ein Batterieicon wird durch den nachstehenden Codeteil erzeugt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative&#039;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;position:absolute;left:9px;top:6px;width:14px;height:27px;background:linear-gradient( to top, red 0%,yellow 50%,green 100%);&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt2([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:6px;position:absolute;top:15px;left:10px&amp;quot;).STY(FW_makeImage(&amp;quot;measure_battery_0&amp;quot;)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod verticalGradiend_Labor DOIF (1) ## HMsensor_Labor HMdummy_Labor&lt;br /&gt;
attr verticalGradiend_Labor group Labor: uiTable&lt;br /&gt;
attr verticalGradiend_Labor room DOIF_Labor&lt;br /&gt;
attr verticalGradiend_Labor uiTable {\&lt;br /&gt;
  $TD{0}{0}=&amp;quot; colspan=2 &amp;quot;;;\&lt;br /&gt;
  sub FUNC_batt {\&lt;br /&gt;
    my($val)=@_;;\&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;;left:0px;;width:25px;;height:100px;;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;px,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;px);;&amp;quot;;;\&lt;br /&gt;
    return $ret;;\&lt;br /&gt;
  }\&lt;br /&gt;
  sub FUNC_batt2 {\&lt;br /&gt;
    my($val)=@_;;\&lt;br /&gt;
    my $ret=&amp;quot;position:absolute;;left:9px;;top:6px;;width:14px;;height:27px;;background:linear-gradient( to bottom,#F8F8E0 &amp;quot;.(100-$val).&amp;quot;%,rgba(0,0,0,0) &amp;quot;.(100-$val).&amp;quot;%);;&amp;quot;;;\&lt;br /&gt;
    return $ret;;\&lt;br /&gt;
  }\&lt;br /&gt;
}\&lt;br /&gt;
WID([HMsensor_Labor],&amp;quot;uzsuSelectRadio,enable,disable&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:25px;;height:100px;;background:linear-gradient( to top, red 0px,yellow 50px,green 100px);;&#039;&amp;gt;&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:9px;;position:absolute;;top:45px;;right:1px&amp;quot;).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;|\&lt;br /&gt;
&amp;quot;&amp;lt;div style=&#039;position:relative&#039;&amp;gt;\&lt;br /&gt;
&amp;lt;div style=&#039;position:absolute;;left:9px;;top:6px;;width:14px;;height:27px;;background:linear-gradient( to top, red 0%,yellow 50%,green 100%);;&#039;&amp;gt;&amp;lt;/div&amp;gt;\&lt;br /&gt;
&amp;quot;.STY(&amp;quot; &amp;quot;,FUNC_batt2([HMdummy_Labor:level])).STY([HMdummy_Labor:level].&amp;quot;%&amp;quot;,&amp;quot;font-size:6px;;position:absolute;;top:15px;;left:10px&amp;quot;).STY(FW_makeImage(&amp;quot;measure_battery_0&amp;quot;)).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
defmod HMdummy_Labor dummy&lt;br /&gt;
attr HMdummy_Labor group Labor: uiTable&lt;br /&gt;
attr HMdummy_Labor room DOIF_Labor&lt;br /&gt;
attr HMdummy_Labor userReadings desired-temp {ReadingsNum($name,&amp;quot;state&amp;quot;,7)}&lt;br /&gt;
&lt;br /&gt;
defmod HMsensor_Labor DOIF ([+1])\&lt;br /&gt;
  (setreading HMdummy_Labor measured-temp {(if ([HMdummy_Labor:measured-temp] &amp;lt; [HMdummy_Labor:desired-temp]){[HMdummy_Labor:measured-temp]+.5} else {7})},\&lt;br /&gt;
  setreading HMdummy_Labor level {(if ([HMdummy_Labor:level] &amp;lt; 100){[HMdummy_Labor:level]+5} else {0})})&lt;br /&gt;
attr HMsensor_Labor do always&lt;br /&gt;
attr HMsensor_Labor group Labor: uiTable&lt;br /&gt;
attr HMsensor_Labor room DOIF_Labor&lt;br /&gt;
attr HMsensor_Labor webCmd enable:disable&lt;br /&gt;
&lt;br /&gt;
setstate HMdummy_Labor desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-10 12:36:07 desired-temp 29&lt;br /&gt;
setstate HMdummy_Labor 2017-11-10 12:36:07 level 85&lt;br /&gt;
setstate HMdummy_Labor 2017-11-10 12:36:07 measured-temp 28&lt;br /&gt;
setstate HMdummy_Labor 2017-11-06 12:04:39 state desired-temp 29&lt;br /&gt;
&lt;br /&gt;
setstate HMsensor_Labor disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 cmd 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 cmd_event timer_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 cmd_nr 1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 last_cmd cmd_1&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 mode disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 12:36:07 state disabled&lt;br /&gt;
setstate HMsensor_Labor 2017-11-10 13:26:42 timer_01_c01 10.11.2017 13:26:43&lt;br /&gt;
&lt;br /&gt;
setstate verticalGradiend_Labor initialized&lt;br /&gt;
setstate verticalGradiend_Labor 2017-11-09 08:59:32 cmd 0&lt;br /&gt;
setstate verticalGradiend_Labor 2017-11-09 08:59:32 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Abwechselnde Anzeige zweier Größen an gleicher Position ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* HTML-Attribute &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt;&lt;br /&gt;
* CSS-Datei und Attribute &amp;lt;code&amp;gt;@keyframes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;animation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;overflow&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;opacity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:UiTable_swapValues1.png|height 100px|thumb|right|Feuchte als erste Größe]][[Datei:Uitable_swapValues2.png|height 100px|thumb|right|Temperatur als zweite Größe]]&lt;br /&gt;
&lt;br /&gt;
Die Größen Feuchte und Temperatur werden abwechselnd angezeigt&lt;br /&gt;
&lt;br /&gt;
=== Aufbau der Kombination ===&lt;br /&gt;
Der Zelleninhalt hat folgende Struktur.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div 1. Klasse mit Wert als Inhalt&amp;gt;Wert&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div 2. Klasse mit Wert als Inhalt&amp;gt;Wert&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;lt;div class=&#039;humchange&#039; &amp;gt;&amp;quot;.STY([$SELF:humidity],&amp;quot;font-size:16pt;font-weight:bold;color:red;&amp;quot;).&amp;quot; relH%&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div class=&#039;tempchange&#039; &amp;gt;&amp;quot;.STY([$SELF:temperature:d1],&amp;quot;font-size:16pt;font-weight:bold;color:blue;&amp;quot;).&amp;quot;°C&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die dazu gehörende CSS-Definition === &lt;br /&gt;
Damit die Wechselnde Anzeige funktioniert, muss die Definition in eine Datei kopiert werden, die Dateiendung muss &#039;&#039;css&#039;&#039; sein (uitable_changer.css). Die Datei ist in das Verzeichniss ./pgm2 zu kopieren. Sie muss dann über das FHEMWEB-Attribut &amp;lt;code&amp;gt;attr &amp;lt;fhemwebname&amp;gt; CssFiles pgm2/uitable_changer.css&amp;lt;/code&amp;gt; eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
div.humchange {&lt;br /&gt;
  opacity: 0; &lt;br /&gt;
  height: 0;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  animation: humidity 15s infinite ease-in;&lt;br /&gt;
}&lt;br /&gt;
div.tempchange {&lt;br /&gt;
  opacity: 1 &lt;br /&gt;
  height: auto;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  animation: temperature 15s infinite ease-in;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes humidity {&lt;br /&gt;
  0% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  0.001% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  5% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  45% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  49.999% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  50% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
  100% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
@keyframes temperature {&lt;br /&gt;
  0% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
  49.999% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: 0;&lt;br /&gt;
  }&lt;br /&gt;
  50% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  55% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  95% {&lt;br /&gt;
    opacity: 1; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
  100% {&lt;br /&gt;
    opacity: 0; &lt;br /&gt;
    height: auto;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod swapValues_Labor DOIF (1) ## HMsensor_Labor HMdummy_Labor&lt;br /&gt;
attr swapValues_Labor group Labor: uiTable&lt;br /&gt;
attr swapValues_Labor room DOIF_Labor,DOIFalone&lt;br /&gt;
attr swapValues_Labor uiTable &amp;quot;&amp;lt;div class=&#039;humchange&#039; &amp;gt;&amp;quot;.STY([$SELF:humidity],&amp;quot;font-size:16pt;;font-weight:bold;;color:red;;&amp;quot;).&amp;quot; relH%&amp;lt;/div&amp;gt;\&lt;br /&gt;
 &amp;lt;div class=&#039;tempchange&#039; &amp;gt;&amp;quot;.STY([$SELF:temperature:d1],&amp;quot;font-size:16pt;;font-weight:bold;;color:blue;;&amp;quot;).&amp;quot;°C&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
setstate swapValues_Labor initialized&lt;br /&gt;
setstate swapValues_Labor 2017-11-13 10:44:16 cmd 0&lt;br /&gt;
setstate swapValues_Labor 2017-11-14 17:01:24 humidity 82&lt;br /&gt;
setstate swapValues_Labor 2017-11-13 10:44:16 state initialized&lt;br /&gt;
setstate swapValues_Labor 2017-11-14 17:01:24 temperature 20.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anzeige der uiTable anderer DOIF als Popup-Fenster ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* DOIF-Funktion &amp;lt;code&amp;gt;PUP(&amp;lt;Name des anderen DOIF&amp;gt;,&amp;lt;Iconname@optionale Farbe&amp;gt;)&amp;lt;/code&amp;gt;, wenn das Icon nicht existiert wird der Text als Link in Standardfarbe angezeigt.&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:UiTable_PopUp.png|height 100px|thumb|right|Link oder Icon zur Anzeige eines Popup-Fensters]]&lt;br /&gt;
&lt;br /&gt;
In einer uiTable können die UI-Tabellen anderer DOIF als Popup-Fenster angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Die Definition des [[Attribute|Attributes]] &#039;&#039;&#039;uiTable&#039;&#039;&#039; ===&lt;br /&gt;
Die Funktion &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;  inline&amp;gt;PUP(&amp;quot;Grundriss_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_eg\@orange&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt; erzeugt einen Link mit einem orange gefäbten Icon &#039;&#039;&#039;control_building_modern_s_okg_eg&#039;&#039;&#039;, der die UI-Tabelle des DOIF &#039;&#039;&#039;Grundriss_Labor&#039;&#039;&#039; in einem Popup-Fenster anzeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
PUP(&amp;quot;Grundriss_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_eg\@orange&amp;quot;)&lt;br /&gt;
PUP(&amp;quot;Grundriss_position_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_og\@orange&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod PopUp_Labor DOIF (1) ## Grundriss_position_Labor Grundriss_Labor&lt;br /&gt;
attr PopUp_Labor group Labor: uiTable&lt;br /&gt;
attr PopUp_Labor room myHome,DOIF_Labor&lt;br /&gt;
attr PopUp_Labor uiTable PUP(&amp;quot;Grundriss_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_eg\@orange&amp;quot;)\&lt;br /&gt;
PUP(&amp;quot;Grundriss_position_Labor&amp;quot;,&amp;quot;control_building_modern_s_okg_og\@orange&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
defmod Grundriss_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_Labor uiTable {\&lt;br /&gt;
  $TABLE = &amp;quot; text-align:center;;width:300px;; height:300px;; background-image:url(./fhem/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TR{1,3} = &amp;quot;class=&#039;&#039;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
}\&lt;br /&gt;
\&lt;br /&gt;
&amp;quot;Schlafen&amp;quot;,WID([$SELF:SZ],$TPL{switch})|&amp;quot;Küche&amp;quot;,WID([$SELF:Kue],$TPL{switch})|&amp;quot; Bad&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Bad],$TPL{switch})\&lt;br /&gt;
&amp;quot; &amp;quot;|&amp;quot; &amp;quot;|&amp;quot; Diele &amp;quot;,WID([$SELF:Diele],$TPL{switch})\&lt;br /&gt;
&amp;quot;Wohnen A&amp;quot;,WID([$SELF:WZ1],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Kind &amp;quot;,WID([$SELF:Ki],$TPL{switch})|&amp;quot; &amp;quot;\&lt;br /&gt;
&amp;quot;Wohnen B&amp;quot;,WID([$SELF:WZ2],$TPL{switch})|&amp;quot;&amp;amp;nbsp;;&amp;lt;br&amp;gt;Balkon&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;quot;,WID([$SELF:Balkon],$TPL{switch})|&amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
defmod Grundriss_position_Labor DOIF (1)&lt;br /&gt;
attr Grundriss_position_Labor group Labor: uiTable&lt;br /&gt;
attr Grundriss_position_Labor room DOIF_Labor&lt;br /&gt;
attr Grundriss_position_Labor uiTable {\&lt;br /&gt;
  $ATTRIBUTESFIRST = 1;;\&lt;br /&gt;
  $TABLE = &amp;quot;font-size:10pt;;position:relative;; text-align:center;;width:300px;; height:300px;; background-image:url(./fhem/www/pgm2/images/Grundriss.svg);; background-size: 300px 300px;;&amp;quot;;;\&lt;br /&gt;
  $TPL{switch}=&amp;quot;iconSwitch,on,off,off,on&amp;quot;;;\&lt;br /&gt;
 }\&lt;br /&gt;
\&lt;br /&gt;
DEF TPL_Objekt(&amp;quot;&amp;lt;div style=&#039;position:absolute;; Left:&amp;quot;.$1.&amp;quot;px;; top:&amp;quot;.$2.&amp;quot;px;;&#039;&amp;gt;&amp;quot;.$3.WID($4,$TPL{switch}).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;)\&lt;br /&gt;
\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Schlafen&amp;lt;br&amp;gt;&amp;quot;,[$SELF:SZ])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Küche&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Kue])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;225&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;Bad&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Bad])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;105&amp;quot;,&amp;quot;Diele &amp;quot;,[$SELF:Diele])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Wohnen A&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ1])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;35&amp;quot;,&amp;quot;220&amp;quot;,&amp;quot;Wohnen B&amp;lt;br&amp;gt;&amp;quot;,[$SELF:WZ2])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;160&amp;quot;,&amp;quot;Kind&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Ki])|\&lt;br /&gt;
TPL_Objekt(&amp;quot;145&amp;quot;,&amp;quot;250&amp;quot;,&amp;quot;Balkon&amp;lt;br&amp;gt;&amp;quot;,[$SELF:Balkon])&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_Labor initialized&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Bad off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:22 Balkon off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:28 Diele off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:42 Ki on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:30 Kue on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 18:47:31 SZ on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:46 WZ1 on&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 07:45:23 WZ2 off&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 cmd 0&lt;br /&gt;
setstate Grundriss_Labor 2017-11-04 19:10:03 state initialized&lt;br /&gt;
&lt;br /&gt;
setstate Grundriss_position_Labor initialized&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:22 Bad off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:46 Balkon off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:39:30 Diele off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-29 14:04:19 Ki off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-26 16:21:37 Kue off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-29 14:05:41 SZ off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-05 14:38:43 WZ1 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-29 14:04:46 WZ2 off&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 cmd 0&lt;br /&gt;
setstate Grundriss_position_Labor 2017-11-04 21:29:59 state initialized&lt;br /&gt;
&lt;br /&gt;
setstate PopUp_Labor initialized&lt;br /&gt;
setstate PopUp_Labor 2017-11-29 16:04:05 cmd 0&lt;br /&gt;
setstate PopUp_Labor 2017-11-29 16:04:05 state initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anzeige einer uiTable über [[weblink]] als Popup-Fenster ==&lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten &lt;br /&gt;
* DOIF-Funktion &amp;lt;code&amp;gt;DOIF_tablePopUp(&amp;lt;Name des DOIF auf dessen UI-Tabelle verwiesen werden soll&amp;gt;,&amp;lt;Name des DOIF auf dessen UI-Tabelle verwiesen werden soll&amp;gt;,&amp;lt;Iconname@optionale Farbe&amp;gt;)&amp;lt;/code&amp;gt;, wenn das Icon nicht existiert wird der Text als Link in Standardfarbe angezeigt.&lt;br /&gt;
}}&lt;br /&gt;
In einer [[weblink]] Definition kann ein Link auf eine uiTable angelegt werden. Damit kann die UI-Tabelle eines DOIF als Popup-Fenster angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Die Definition des [[weblink]] ===&lt;br /&gt;
Die Funktion &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; inline&amp;gt;DOIF_tablePopUp(&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;rc_PLUS\@orange&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt; erzeugt einen Link mit einem orange gefäbten Icon &#039;&#039;&#039;rc_PLUS&#039;&#039;&#039;, der die UI-Tabelle des DOIF &#039;&#039;&#039;PopUp_Labor&#039;&#039;&#039; in einem Popup-Fenster anzeigt. Aus Gründen der Kompatibilität muss der Name des DOIF auf dessen UI-Tabelle der Link verweisen soll, zweimal angegeben werden. Der Kurzname &amp;lt;code&amp;gt;PUP&amp;lt;/code&amp;gt; kann hier nicht verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ===&lt;br /&gt;
Das Beispiel funktioniert nur, wenn die Definitionen aus dem vorhergehenden Beispile angelegt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod WebLink_Labor weblink htmlCode {DOIF_tablePopUp(&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;PopUp_Labor&amp;quot;,&amp;quot;rc_PLUS\@orange&amp;quot;)}&lt;br /&gt;
attr WebLink_Labor group Labor: uiTable&lt;br /&gt;
attr WebLink_Labor room DOIF_Labor&lt;br /&gt;
&lt;br /&gt;
setstate WebLink_Labor initialized&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uhrzeit und Datum ==&lt;br /&gt;
=== Darstellung einer Analoguhr ===&lt;br /&gt;
[[Datei:Analoguhr_uiTable.png|100px|thumb|right|Beispiel für eine Analoguhr]]&lt;br /&gt;
Auf der Seite [http://3quarks.com/de/Bahnhofsuhr/ http://3quarks.com/de/Bahnhofsuhr/] wird ein Javascript für eine Analoguhr bereitgestellt und die Konfiguration beschrieben.&lt;br /&gt;
&lt;br /&gt;
Das in diesem Forenbeitrag {{Link2Forum|Topic=77690|Message=727276|LinkText=Analoguhr für uiTable}} bereitgestellte Script &#039;&#039;doifanaloguhr.js&#039;&#039; zum Laden und Starten des Uhrenscriptes &#039;&#039;station-clock.js&#039;&#039;, ist in der betroffenen FHEMWEB-Instanz über das Attribut JavaScripts einzubinden.&lt;br /&gt;
Die beiden Javascripte &#039;&#039;station-clock.js&#039;&#039; und &#039;&#039;doifanaloguhr.js&#039;&#039; müssen in dem Verzeichnis pgm2 enthalten sein. Die Datei &#039;&#039;doifanaloguhr.js&#039;&#039; ersetzt &#039;&#039;excanvas.js&#039;&#039;. In &#039;&#039;doifanaloguhr.js&#039;&#039; ist bei Bedarf die Konfiguration des Erscheinungsbildes der Uhr vorzunehmen. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;Name der FHEMWEB-Instanz&amp;gt; pgm2/station-clock.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Attribut &#039;&#039;&#039;uiTable&#039;&#039;&#039; eines DOIF ist Uhr mit einem canvas-Element einzubinden, z.B.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;quot;&amp;lt;canvas id=&#039;doifanaloguhr&#039; width=&#039;50&#039; height=&#039;50&#039;&amp;gt;error&amp;lt;/canvas&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Darstellung von Zeit und Datum ===&lt;br /&gt;
[[Datei:Timedate Labor.png|200px|thumb|right|Beispiele für Zeit und Datum]]&lt;br /&gt;
&lt;br /&gt;
Mit dem in diesem Forenbeitrag {{Link2Forum|Topic=77690|Message=729761|LinkText=Zeit und Datum in uiTable}} bereitgestellten Script &#039;&#039;doiftimedate.js&#039;&#039; können Datum und Uhrzeit in verschiedenen Darstellungsweisen angezeigt werden.&lt;br /&gt;
Das Script muss in das Verzeichnis pgm2 kopiert werden und in die entsprechende FHEMWEB-Instanz eingebunden werden über:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;Name der FHEMWEB-Instanz&amp;gt; pgm2/doiftimedate.js&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Attribut &#039;&#039;&#039;uiTable&#039;&#039;&#039; eines DOIF sind die Zeit- u. Datumteile über einen Klassennamen einzubinden, z.B.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;quot;&amp;lt;span class=&#039;doif-hour&#039;&amp;gt;hour&amp;lt;/span&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
um Stunden anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
Die drei ersten Zeilen des Bildes sind eingebaute Darstellungsweisen, die vierte Zeile ist aus den einzelnen Bestandteilen eines Datums zusammengesetzt.&lt;br /&gt;
&lt;br /&gt;
Die möglichen Klassennamen gehen aus der nachstehenden uiTable-Definition hervor.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;&amp;lt;div class=&#039;doif-hourminute&#039;&amp;gt;hourminute&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-date&#039;&amp;gt;date&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-hourminutedate&#039;&amp;gt;hourminutedate&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;&amp;lt;div style=&#039;color:orange;font-size:16pt;font-weight:bold;&#039;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&#039;doif-hour&#039;&amp;gt;hour&amp;lt;/span&amp;gt;&lt;br /&gt;
:&amp;lt;span class=&#039;doif-minute&#039;&amp;gt;minute&amp;lt;/span&amp;gt;&lt;br /&gt;
:&amp;lt;span class=&#039;doif-second&#039;&amp;gt;second&amp;lt;/span&amp;gt;&lt;br /&gt;
, &amp;lt;span class=&#039;doif-day&#039;&amp;gt;day&amp;lt;/span&amp;gt;&lt;br /&gt;
.&amp;lt;span class=&#039;doif-month&#039;&amp;gt;month&amp;lt;/span&amp;gt;&lt;br /&gt;
.&amp;lt;span class=&#039;doif-year&#039;&amp;gt;year&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel für [[Import_von_Code_Snippets|Raw definition]] ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod timedate_Labor DOIF (#1)&lt;br /&gt;
attr timedate_Labor group Labor: uiTable&lt;br /&gt;
attr timedate_Labor room DOIF_Labor&lt;br /&gt;
attr timedate_Labor uiTable &amp;quot;&amp;lt;div class=&#039;doif-hourminute&#039;&amp;gt;hourminute&amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
\&lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-date&#039;&amp;gt;date&amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
 \&lt;br /&gt;
 &amp;quot;&amp;lt;div class=&#039;doif-hourminutedate&#039;&amp;gt;hourminutedate&amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
 \&lt;br /&gt;
 &amp;quot;&amp;lt;div style=&#039;color:orange;;font-size:16pt;;font-weight:bold;;&#039;&amp;gt;\&lt;br /&gt;
&amp;lt;span class=&#039;doif-hour&#039;&amp;gt;hour&amp;lt;/span&amp;gt;\&lt;br /&gt;
:&amp;lt;span class=&#039;doif-minute&#039;&amp;gt;minute&amp;lt;/span&amp;gt;\&lt;br /&gt;
:&amp;lt;span class=&#039;doif-second&#039;&amp;gt;second&amp;lt;/span&amp;gt;\&lt;br /&gt;
, &amp;lt;span class=&#039;doif-day&#039;&amp;gt;day&amp;lt;/span&amp;gt;\&lt;br /&gt;
.&amp;lt;span class=&#039;doif-month&#039;&amp;gt;month&amp;lt;/span&amp;gt;\&lt;br /&gt;
.&amp;lt;span class=&#039;doif-year&#039;&amp;gt;year&amp;lt;/span&amp;gt;\&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Hinweise ==&lt;br /&gt;
=== Arbeitsfläche der Detailansicht für die Bearbeitung von uiTable einrichten === &lt;br /&gt;
{{Randnotiz|RNText=Besonderheiten&lt;br /&gt;
* Steuervariable &amp;lt;code&amp;gt;$ATTRIBUTESFIRST=1;&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Attributesfirst.png|200px|thumb|right|Beispiel für die veränderte Detailansicht]]&lt;br /&gt;
Zum Erstellen der UI-Tabelle, wird das Attribut uiTable häufiger gesetzt, um Veränderungen in der uiTable sichtbar zu machen.&lt;br /&gt;
Damit beim Wechsel zwischen der Ansicht der UI-Tabelle und der Attributbearbeitung nicht immer über den DEF-Bereich und die Readings gescrollt werden muss können die Attribute unter die UI-Tabelle geschoben werden.&lt;br /&gt;
Wenn die Steuervariable &amp;lt;code&amp;gt;$ATTRIBUTESFIRST=1;&amp;lt;/code&amp;gt; im oberen Bereich der Tabellendefinition angegeben wird, dann werden die Attribute vor den DEF-Bereich verschoben.&lt;br /&gt;
&lt;br /&gt;
=== Browserunterstützung ===&lt;br /&gt;
Die verschiedenen Browser, Versionen und Mobile-Varianten unterstützen CSS unterschiedlich, siehe z.B. [https://www.w3schools.com/cssref/css3_browsersupport.asp W3Schools CSS Browser Support Reference]&lt;br /&gt;
&lt;br /&gt;
Zur Problemlösung können die entsprechenden Entwicklerseiten beitragen.&lt;br /&gt;
&lt;br /&gt;
* Mozilla [https://developer.mozilla.org/de/docs/Web/CSS https://developer.mozilla.org/de/docs/Web/CSS]&lt;br /&gt;
* Google [https://developers.google.com/web/tools/chrome-devtools/css/ https://developers.google.com/web/tools/chrome-devtools/css/]&lt;br /&gt;
* Apple [https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariCSSRef/Introduction.html https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariCSSRef/Introduction.html]&lt;br /&gt;
* Microsoft [https://msdn.microsoft.com/de-de/library/cc351024(v=vs.85).aspx https://msdn.microsoft.com/de-de/library/cc351024(v=vs.85).aspx]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[DOIF]]&lt;br /&gt;
* [[DOIFtools#Farbtabellen_erzeugen|DOIFtools Farbtabellen anzeigen]]&lt;br /&gt;
* Style-Attribute [https://www.w3schools.com/cssref/default.asp https://www.w3schools.com/cssref/default.asp]&lt;br /&gt;
* Liste der aktuellen HTML-Elemente [https://developer.mozilla.org/de/docs/Web/HTML/HTML5/HTML5_element_list https://developer.mozilla.org/de/docs/Web/HTML/HTML5/HTML5_element_list]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=21759</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=21759"/>
		<updated>2017-06-27T21:46:03Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Implementation in Modulen */ Pioneer stateAV &amp;amp; playStatus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist {{Link2Forum|Topic=13784|LinkText=hier}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power. Das Reading gilt auch als Ersatz für das normale state Reading, wenn dieses z.B. bei Verwendung von DevIO nicht die genannten Status annimmt, sondern denen von DevIO entspricht (appeared, disappeared).&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Push&amp;diff=21618</id>
		<title>FTUI Widget Push</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Push&amp;diff=21618"/>
		<updated>2017-05-30T19:42:12Z</updated>

		<summary type="html">&lt;p&gt;50watt: /* Lampe für 5 Minuten einschalten */ Tippfehler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [[{{PAGENAME}}|Push Widget]] ist ein Widget für [[FHEM Tablet UI]] in Form eines Button-förmigen Knopfes, der, ähnlich einem Taster, einen einfachen Befehl an FHEM sendet (zum Beispiel hoch/runter, Play/Pause, Nächster/vorheriger Titel, usw.). Der Befehl kann beim Drücken, beim Loslassen, oder beide Male ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Ftui_widget_push.PNG&lt;br /&gt;
File:Push1.png&lt;br /&gt;
File:Push2.png&lt;br /&gt;
File:Ftui_widget_push_on-for-timer.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Standard-Wert&lt;br /&gt;
!Beispiel&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-device&#039;&#039;&#039;||FHEM-Device, dessen Reading gesetzt werden soll (&amp;lt;command&amp;gt; &#039;&#039;&#039;&amp;lt;device&amp;gt;&#039;&#039;&#039; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;)||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-set&#039;&#039;&#039;||Reading, das gesetzt werden soll (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &#039;&#039;&#039;&amp;lt;reading&amp;gt;&#039;&#039;&#039; &amp;lt;value&amp;gt;)||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-set-on&#039;&#039;&#039;||Wert, der beim Drücken gesendet werden soll. Kann auch ein Array sein, um verschiedene Werte abwechselnd zu schalten||on||data-set-on=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-set-off&#039;&#039;&#039;||Wert, der nach dem Loslassen gesendet werden soll||||data-set-off=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-cmd&#039;&#039;&#039;||Befehl, der gesendet werden soll (&#039;&#039;&#039;&amp;lt;command&amp;gt;&#039;&#039;&#039; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) (z.B. setstate, set, setreading, trigger)||set||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-doubleclick&#039;&#039;&#039;||Zeit, die vergehen muss, bis das Element ein zweites mal betätigt werden kann. &#039;0&#039; schaltet dieses Verhalten ab.||0||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-countdown&#039;&#039;&#039;||Sekunden für Fortschrittsanzeige (progress control / &#039;on-for-timer&#039;)||Automatische Erkennung von &#039;on-for-timer&#039; bei &#039;&#039;&#039;data-set-on&#039;&#039;&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-warn&#039;&#039;&#039;||Reading, dessen Inhalt als rotes Kennzeichen angezeigt wird. Der Inhalt des Readings muss eine Ganzzahl (Integer) sein.||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get&#039;&#039;&#039;||Reading, dessen Inhalt zur Zustandsanzeige (ON/OFF) wird||keiner (muss explizit angegeben werden)||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get-on&#039;&#039;&#039;||Zeichenkette, die als Zustand ON interpretiert wird||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get-off&#039;&#039;&#039;||Zeichenkette, die als Zustand OFF interpretiert wird||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-hide&#039;&#039;&#039;||Reading zum Verstecken des Push-Elementes. Das Element verschwindet, wenn der Wert mit &#039;&#039;&#039;data-hide-on&#039;&#039;&#039; übereinstimmt.||STATE||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-hide-on&#039;&#039;&#039;||Zeichenkette, bei der das Element versteckt wird||true,1,on||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-hide-off&#039;&#039;&#039;||Zeichenkette, bei der das Element angezeigt wird||!on||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-hideparents&#039;&#039;&#039;||jQuery-Selector, um auch die Eltern-Elemente zu verstecken||||data-hideparents=&amp;quot;#Name&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-lock&#039;&#039;&#039;||Reading, mit dem das Element für eine Bedienung gesperrt wird. Gültige Werte sind &#039;&#039;true&#039;&#039;, &#039;&#039;1&#039;&#039; oder &#039;&#039;on&#039;&#039;||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-reachable&#039;&#039;&#039;||Reading, dessen Inhalt angibt, ob das Device erreichbar ist, oder nicht. Der Inhalt des Readings muss eine Ganzzahl (Integer) sein.||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-icon&#039;&#039;&#039;||Name des Icons im Vordergrund||fa-power-off||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-background-icon&#039;&#039;&#039;||Name des Icons, das als Hintergrund verwendet werden soll||fa-circle-thin||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-on-color&#039;&#039;&#039;||Feste Iconfarbe für den Zustand ON, oder &#039;&#039;&#039;&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&#039;&#039;&#039;, um einen entsprechenden Wert dynamisch aus FHEM abzurufen.||#aa6900||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-on-background-color&#039;&#039;&#039;||Feste Hintergrundfarbe für den Zustand ON, oder &#039;&#039;&#039;&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&#039;&#039;&#039;||#aa6900||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-off-color&#039;&#039;&#039;||Feste Iconfarbe für den Zustand OFF, oder &#039;&#039;&#039;&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&#039;&#039;&#039;, um einen entsprechenden Wert dynamisch aus FHEM abzurufen.||#505050||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-off-background-color&#039;&#039;&#039;||Feste Hintergrundfarbe für den Zustand OFF, oder &#039;&#039;&#039;&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&#039;&#039;&#039;||#505050||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==CSS Klassen==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Klasse!!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
{{FTUI Klasse|height-narrow}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Weitere Möglichkeiten==&lt;br /&gt;
Das Push-Widget kann auch dazu verwendet werden, Readings darzustellen. Über &#039;&#039;&#039;data-get&#039;&#039;&#039; und &#039;&#039;&#039;data-get-on&#039;&#039;&#039; wird beispielsweise der Kreis (Hintergrund-Icon) eingefärbt. Der Wert des Readings selbst wird dann per [[FTUI_Widget_Label|Label]] angezeigt, welches innerhalb des Push-Widgets platziert wird. Siehe hierzu auch den {{Link2Forum|Topic=66800|LinkText=Hinweis im Forum}}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;push&amp;quot; ...&amp;gt;&lt;br /&gt;
	&amp;lt;div data-type=&amp;quot;label&amp;quot; ...&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
===Alle Lampen einschalten===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;push&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;LightAll&amp;quot; &lt;br /&gt;
     data-cmd=&amp;quot;trigger&amp;quot; &lt;br /&gt;
     data-set-on=&amp;quot;on&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Steuerung hoch/runter (horizontal)===&lt;br /&gt;
[[File:Push1.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;doublebox-h&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Rollo&amp;quot; &lt;br /&gt;
             data-icon=&amp;quot;fa-angle-up&amp;quot; data-background-icon=&amp;quot;fa-square-o&amp;quot; &lt;br /&gt;
             data-set-on=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Rollo&amp;quot; &lt;br /&gt;
             data-icon=&amp;quot;fa-angle-down&amp;quot; data-background-icon=&amp;quot;fa-square-o&amp;quot; &lt;br /&gt;
             data-set-on=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Steuerung hoch/runter (vertikal)===&lt;br /&gt;
[[File:Push2.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;doublebox-v&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Rollo&amp;quot; &lt;br /&gt;
             data-icon=&amp;quot;fa-chevron-up&amp;quot; data-background-icon=&amp;quot;fa-square-o&amp;quot; &lt;br /&gt;
             data-set-on=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;Rollo&amp;quot; &lt;br /&gt;
            data-icon=&amp;quot;fa-chevron-down&amp;quot; data-background-icon=&amp;quot;fa-square-o&amp;quot; &lt;br /&gt;
            data-set-on=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Lampe für 5 Minuten einschalten===&lt;br /&gt;
Das Push-Widget zeigt einen abnehmenden Kreis, solange der Countdown läuft. Die Dauer wird automatisch aus dem &#039;&#039;&#039;on-for-timer&#039;&#039;&#039;-Befehl erkannt. Mit &#039;&#039;&#039;data-countdown&#039;&#039;&#039; kann jedoch auch auch ein eigener Wert angegeben werden.&lt;br /&gt;
Wenn das Device ein Dummy ist, muss in diesem das FHEM-Attribut &amp;lt;code&amp;gt;useSetExtensions 1&amp;lt;/code&amp;gt; gesetzt werden. Weitere Beispiele für Timer sind [[FTUI_Zeitschaltung|hier]] zu finden.&lt;br /&gt;
&lt;br /&gt;
[[File:Ftui_widget_push_on-for-timer.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;MyLamp&amp;quot; data-set-on=&amp;quot;on-for-timer 300&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push-Widget verstecken===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;hbox&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;vbox&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;ftuitest&amp;quot; data-set-on=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div&amp;gt;on&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;vbox&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;ftuitest&amp;quot; data-set-on=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div&amp;gt;off&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;vbox&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;dummy1&amp;quot; data-get=&amp;quot;STATE&amp;quot; data-get-on=&amp;quot;on&amp;quot; data-hide=&amp;quot;ftuitest:STATE&amp;quot; data-hide-on=&amp;quot;1&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>50watt</name></author>
	</entry>
</feed>