<?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=Amenophis86</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=Amenophis86"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Amenophis86"/>
	<updated>2026-04-10T05:25:34Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog-MySQL&amp;diff=35489</id>
		<title>DbLog-MySQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog-MySQL&amp;diff=35489"/>
		<updated>2021-04-12T07:56:14Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* db.conf */ Hinweis auf Port 3307 bei MariaDB10&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Da bei der Inbetriebnahme und der Migration von MySQL bzw MariaDB-Datenbanken einige kleine Fallen auftreten können, gibt&#039;s hier ein paar Hinweise.&lt;br /&gt;
&lt;br /&gt;
== Server version: 10.1.40-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04 ==&lt;br /&gt;
=== db.conf ===&lt;br /&gt;
[[DbLog]] wird durch zwei verschiedene Einträge aktiviert/definiert. In einer Datei namens &#039;&#039;&#039;db.conf&#039;&#039;&#039; werden die Parameter für eine Verbindung zur Datenbank (host, username, password, etc.) hinterlegt. Diese Datei kann in einem beliebigen Verzeichnis angelegt werden. Für eine MariaDB-Datenbank sieht die db.conf folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[Anmerkung: MariaDB10 benutzt Port 3307 und nicht 3306. Dies ist zum Beispiel bei Synology NAS der Fall.]&lt;br /&gt;
&lt;br /&gt;
 %dbconfig= (&lt;br /&gt;
     connection =&amp;gt; &amp;quot;mysql:database=fhem;host=db;port=3306&amp;quot;,&lt;br /&gt;
     user =&amp;gt; &amp;quot;fhemuser&amp;quot;,&lt;br /&gt;
     password =&amp;gt; &amp;quot;fhempassword&amp;quot;,&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation befindet sich eine Beispielkonfiguration mit der Syntax für jeden unterstützen Datenbanktyp. Bei der Verwendung von MariaDB muss die MySQL-Datei verwendet werden.&lt;br /&gt;
Es wird empfohlen, diese Datei zu kopieren und erst dann entsprechend zu bearbeiten. Am Besten kopiert man diese Datei in das FHEM Home Directory /opt/fhem/ und achtet auf die entsprechenden Rechte!&lt;br /&gt;
 chown fhem:dialout /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Die Datenbank ist relativ simpel gestaltet und besteht lediglich aus den folgenden beiden Tabellen:&lt;br /&gt;
* current&lt;br /&gt;
* history&lt;br /&gt;
&lt;br /&gt;
DbLog ist auf eine feste Tabellenstruktur angewiesen. Man muss daher in seiner Datenbank eine Tabelle mit folgenden Spalten anlegen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Spalte&lt;br /&gt;
! Beschreibung (en)&lt;br /&gt;
! Beschreibung (de)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TIMESTAMP&#039;&#039;&#039;&lt;br /&gt;
| timestamp of event&lt;br /&gt;
| Zeitstempel&lt;br /&gt;
| 2007-12-30 21:45:22 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEVICE&#039;&#039;&#039;&lt;br /&gt;
| device name&lt;br /&gt;
| Device-Name&lt;br /&gt;
| Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TYPE&#039;&#039;&#039;&lt;br /&gt;
| device type&lt;br /&gt;
| Device-Typ&lt;br /&gt;
| KS300&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;EVENT&#039;&#039;&#039;&lt;br /&gt;
| event specification as full string&lt;br /&gt;
| Eventspezifikation als Text&lt;br /&gt;
| humidity: 71 (%)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;READING&#039;&#039;&#039;&lt;br /&gt;
| name of reading extracted from event&lt;br /&gt;
| Bezeichnung des Readings&lt;br /&gt;
| humidity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VALUE&#039;&#039;&#039;&lt;br /&gt;
| actual reading extracted from event&lt;br /&gt;
| Wert des Readings&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UNIT&#039;&#039;&#039;&lt;br /&gt;
| unit extracted from event&lt;br /&gt;
| Einheit des Readings&lt;br /&gt;
| %&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; befindet sich das Script &#039;&#039;&#039;db_create_mysql.sql&#039;&#039;&#039; , welches eine neue Datenbank samt Tabellenstruktur anlegt. Ausserdem wird ein Benutzer &amp;quot;fhemuser&amp;quot; mit einem (zu ändernden) &amp;quot;fhempasswort&amp;quot; angelegt.&lt;br /&gt;
&lt;br /&gt;
==== Primary Keys ====&lt;br /&gt;
===== current =====&lt;br /&gt;
Die Tabelle current enthält für jedes zu loggende Device lediglich den letzten Wert. Falls noch kein Wert geloggt wurde, ist diese Tabelle leer. &lt;br /&gt;
Falls der Inhalt gelöscht wird, bauen sich die Daten automatisch wieder auf. Es gehen durch das löschen der Tabelle current keine Log-Informationen verloren.&lt;br /&gt;
Der Inhalt wird aber u.a. für die Dropdown-Felder beim Plot-Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
Um doppelte Einträge in der Tabelle zu vermeiden, wurde die Möglichkeit geschaffen, Primary Keys zu definieren. Da in der Spalte &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; u.U. bei verschiedenen Geräten gleiche Namen vorkommen können, sollte der Primary Key um den Gerätenamen erweitert werden. Der Primary Key sollte also aus &amp;lt;code&amp;gt;DEVICE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; bestehen. Um in der Datenbank &#039;&#039;fhem&#039;&#039; diesen PK zu setzen, kann folgender SQL Code verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`current` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== history =====&lt;br /&gt;
Die Tabelle history enthält alle bisher geloggten Daten. Löschen in dieser Tabelle bedeutet automatisch Datenverlust (gewollt oder nicht ... )&lt;br /&gt;
Der Inhalt dieser Tabelle wird verwendet, um die Plots zu zeichnen oder Auswertungen mit [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] anzufertigen&lt;br /&gt;
&lt;br /&gt;
Um Probleme beim Import von cacheFiles zu vermeiden, kann in der Datenbank ein PK angelegt werden, welcher Timestamp, Device und Reading umfasst. Dadurch werden doppelte Einträge wirksam verhindert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`history` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`TIMESTAMP`,`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer MariaDB-Datenbank ==&lt;br /&gt;
Anstatt nano kann jeder andere kompatible Editor verwendet werden. Weiterhin bitte beachten, dass die hier genannten Befehle teilweise root-Rechte voraussetzen. Entweder komplett als root arbeiten oder mittels sudo. In den nachfolgenden Beispielen wird daher stets sudo in Klammern geschrieben, &#039;&#039;&#039;dies bitte aber nicht so eingeben&#039;&#039;&#039;, sondern eben sudo su grundsätzlich voranstellen oder vor jedem Befehl sudo einsetzen. &lt;br /&gt;
&lt;br /&gt;
Hinweis: im Folgenden ist &amp;quot;#&amp;quot; der Shell-Prompt und &amp;quot;mysql&amp;gt;&amp;quot; der MariaDB-Prompt innerhalb mysql, dieser kann mit exit verlassen werden. &lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu/debian: &lt;br /&gt;
 # (sudo) apt-get update &amp;amp;&amp;amp; apt-get install mariadb-server&lt;br /&gt;
&lt;br /&gt;
Nach der Installation muss das Script &lt;br /&gt;
 # (sudo) mysql_secure_installation&lt;br /&gt;
ausgeführt werden. Dieses legt ein root-Passwort fest, entfernt die anonymen User und entfernt die test-Datenbank.&lt;br /&gt;
Empfohlen wird, alle Fragen mit &#039;&#039;&#039;Y&#039;&#039;&#039; zu beantworten.&lt;br /&gt;
&lt;br /&gt;
Zum Test mit MariaDB verbinden:&lt;br /&gt;
 # (sudo) mysql -u root -p&lt;br /&gt;
 Enter password:&lt;br /&gt;
 MariaDB [(none)]&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
Sollte hier eine Fehlermeldung &amp;quot;Access denied for user &#039;root&#039;@&#039;localhost&#039;&amp;quot; trotz richtigem Passwort erscheinen, muss man sich als root mit der Datenbank verbinden; also sudo mysql...&lt;br /&gt;
&lt;br /&gt;
Jetzt die Tabellenstruktur anlegen. &lt;br /&gt;
Hierfür kann die Datei /opt/fhem/contrib/dblog/db_create_mysql.sql als Vorlage verwendet und das Passwort und der Benutzername geändert werden. &lt;br /&gt;
 cd /opt/fhem/contrib/dblog/&lt;br /&gt;
 (sudo) nano db_create_mysql.sql&lt;br /&gt;
Dann wird die Datei eingelesen:&lt;br /&gt;
&lt;br /&gt;
 # (sudo) mysql -u root -p &amp;lt; db_create_mysql.sql&lt;br /&gt;
 Enter password:&lt;br /&gt;
 MariaDB [(none)]&amp;gt;  exit&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man den Zugang als fhemuser testen (eventuell muss der Befehl sudo mysql lauten): &lt;br /&gt;
&lt;br /&gt;
 # (sudo) mysql -p -u &amp;lt;fhemuser&amp;gt;&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 MariaDB [(none)]&amp;gt;  show databases;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis lautet&lt;br /&gt;
 MariaDB [(none)]&amp;gt; show databases;&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | Database           |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | fhem               |&lt;br /&gt;
 | information_schema |&lt;br /&gt;
 | mysql              |&lt;br /&gt;
 | performance_schema |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
&lt;br /&gt;
Nun müsste eine Datenbank &amp;quot;fhem&amp;quot; angezeigt werden.&lt;br /&gt;
Um die Tabellen zu sehen, kann man den folgenden Befehl eingeben: &lt;br /&gt;
&lt;br /&gt;
 MariaDB [(none)]&amp;gt; use fhem; show tables;&lt;br /&gt;
&lt;br /&gt;
und das Ergebnis lautet&lt;br /&gt;
 &lt;br /&gt;
 MariaDB [fhem]&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0.001 sec), &lt;br /&gt;
die die Tabellen current und history enthält.&lt;br /&gt;
&lt;br /&gt;
Nun in der Datei db.conf den mysql-Block auskommentieren und ebenfalls Benutzername, Passwort UND HOST anpassen. Leider ist hier nichts standardmäßig eingestellt.&lt;br /&gt;
 (sudo) nano /opt/fhem/contrib/dblog/db.conf&lt;br /&gt;
&lt;br /&gt;
Jetzt kann unter FHEM ein DbLog-Device angelegt werden (mit dem beispiel wird alles geloggt: &lt;br /&gt;
 define logdb DbLog ./contrib/dblog/db.conf .*:.*&lt;br /&gt;
Als State muss ein &amp;quot;connected&amp;quot; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Ein rereadcfg in FHEM stellt sicher, dass die neue Konfiguration übernommen wird - ein Neustart ist nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Nun kann die Funktion noch einmal überprüft werden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 # mysql -u &amp;lt;fhemuser&amp;gt; -p&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; use fhem;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0,00 sec)&lt;br /&gt;
 mysql&amp;gt; select * from history; # Achtung, kann sehr groß werden .... #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Abfragescript PHP/MySQL ==&lt;br /&gt;
Um eine schnelle Übersicht zu bekommen habe ich mir dieses Script geschrieben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php $pdo = new PDO(&#039;mysql:host=localhost;dbname=fhem&#039;, &#039;fhemuser&#039;, &#039;fhempasswort&#039;);&lt;br /&gt;
echo &#039;&amp;lt;h2&amp;gt;Tabelle Current&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Anzahl&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Readings&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
$sql = &amp;quot;SELECT COUNT(*), DEVICE, GROUP_CONCAT(DISTINCT READING ORDER BY READING DESC SEPARATOR &#039;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&#039;) FROM current GROUP BY DEVICE;&amp;quot;; foreach ($pdo-&amp;gt;query($sql) as&lt;br /&gt;
$row) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[0] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[1] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;quot; . $row[2] . &amp;quot;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &#039;&amp;lt;h2&amp;gt;Tabelle History&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Anzahl&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
$sql = &amp;quot;SELECT COUNT(*), DEVICE FROM history GROUP BY DEVICE;&amp;quot;; foreach ($pdo-&amp;gt;query($sql) as&lt;br /&gt;
$row) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[0] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[1] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitte passt fhemuser und fhempasswort an. Das Ganze kommt dann nach &#039;&#039;/var/www/html/fhemdb.php&#039;&#039; und ist mit &#039;&#039;&amp;lt;IP&amp;gt;/fhemdb.php&#039;&#039; aufrufbar. Wenn ihr den 2. Block für die history Tabelle ausklammert oder entfernt läuft das Script viel schneller ab - klar die history Tabelle ist meist randvoll.&lt;br /&gt;
&lt;br /&gt;
== Bearbeitung von Datenbank-Einträgen ==&lt;br /&gt;
{{Hinweis|Dieser Abschnitt soll lediglich eine kleine Einführung in die Datenbank-Bearbeitung liefern. Für vertiefende Informationen sollte man sich grundsätzlich mit SQL beschäftigen. Eine umfassende und gut verständliche Anleitung zu SQL bietet bspw. [http://www.w3schools.com/sql/default.asp w3schools].}}&lt;br /&gt;
Irgendwann wird der Fall eintreten, dass in der Datenbank Einträge drinstehen, die geändert oder gelöscht werden sollen (zB. fehlerhafte Sensor-Rückmeldungen, umbenannte Readings). In klassischen Log-Dateien würde man diese einfach bearbeiten und löschen/anpassen (wobei man aber tunlichst zuvor FHEM stoppt, um Datenfehler zu vermeiden). Eine Datenbank kann bearbeitet werden, ohne FHEM stoppen zu müssen. &lt;br /&gt;
&lt;br /&gt;
Datenbanken kann man ohne weitere Hilfsmittel direkt von der Kommandozeile/Shell aus bearbeiten. Alternativ gibt es auch verschiedenste Tools (webbasiert oder als Applikation), die einen dabei unterstützen (Bsp. findet man u.a. [https://wiki.ubuntuusers.de/SQLite/#Grafische-Benutzeroberflaechen hier]). Für einfache Arbeiten reicht allerdings idR. Shell.&lt;br /&gt;
&lt;br /&gt;
=== phpMyAdmin ===&lt;br /&gt;
Ein sehr beliebtes Tool ist phpMyAdmin. &lt;br /&gt;
 # apt-get install phpmyadmin&lt;br /&gt;
Bei der Installation wird man nach einem Passwort für den User &amp;quot;phpMyAdmin&amp;quot; gefragt, der im weiteren Verlauf erstmal nutzlos ist.&lt;br /&gt;
Nun kann man sich unter &amp;lt;meine-fhem-Domain&amp;gt;/phpMyAdmin mit der Seite verbinden.&lt;br /&gt;
Zum einloggen kann nun der in der config-datei angegebene fhemuser mit dem fhempasswort verwendet werden, oder, sofern ein Passwort vergeben ist, auch den User root. &lt;br /&gt;
Der Unterschied liegt darin, dass root *alle* Datenbanken sehen und ändern darf (was zum ändern von Datenbankeigenschaften sowie Benutzerkonten notwendig ist), während dem fhemuser nur die fhemdatenbank angezeigt wird(was für suchabfragen, deletes und inserts sowie Tabellenänderungen völlig ausreicht.&lt;br /&gt;
&lt;br /&gt;
== Datenbank migrieren ==&lt;br /&gt;
Eine schöne Anleitung zur Migration von SQLite zu MySQL/MariaDB mit Hilfe von [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] findet sich hier: [https://demaya.de/fhem-umzug-sqlite-mysql-mariadb/].&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die SQLite-DB sehr groß wird, kann es sein, dass der oben beschriebene Weg nicht funktioniert (konkret war dies bei meiner 15 GB großen DB nicht möglich, der Prozess hat sich immer nach mehreren Stunden aufgehängt).&lt;br /&gt;
&lt;br /&gt;
== Nützliche Codeschnipsel ==&lt;br /&gt;
Anbei ein paar nützliche Codeschnipsel rund um DbLog&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateigrösse mitloggen ===&lt;br /&gt;
Da die Datenbank ins Unermessliche wachsen kann, empfiehlt es sich - je nach Speicherplatz - ab einer bestimmten Grösse tätig zu werden. Dazu muss diese Grösse allerdings ermittelt werden. &lt;br /&gt;
Zur Ermittlung der MariaDB-Größe kann wie [[DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Gr.C3.B6.C3.9Fe_der_FHEM-Datenbank_ermitteln | hier]] beschrieben vorgegangen werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Heizleistung_und_Gasverbrauch|Beispiel das DbLog-Daten für SVG-Plots verwendet]]&lt;br /&gt;
* [[SVG-Plots von FileLog auf DbLog umstellen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Logging]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=35488</id>
		<title>DbLog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=35488"/>
		<updated>2021-04-12T07:55:07Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Datenbank-Anbindung mittels db.conf */ Hinweis darauf erstell, dass Maria DB 10 Port 3307 nutzt und nicht 3306&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Protokolliert Ereignisse in einer Datenbank&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=93_DbLog.pm&lt;br /&gt;
|ModOwner=tobiasfaust ({{Link2FU|118|Forum}}/[[Benutzer Diskussion:Tobias.faust|Wiki]])&amp;lt;br /&amp;gt;DS_Starter ({{Link2FU|16933|Forum}}/[[Benutzer Diskussion:DS_Starter|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit der Zeit entstehen in FHEM recht umfangreiche Log-Daten für die verschiedensten konfigurierten Devices. Die übliche Einstiegs-[[Konfiguration]] sieht vor, dass die Logs als {{Link2CmdRef|Lang=de|Anker=FileLog|Label=FileLog}} gespeichert werden - je nach Einstellung in wenigen sehr großen oder vielen kleineren Dateien. Der Datei-basierte Zugriff ist allerdings nicht wirklick performant und kann schnell zum Flaschenhals werden (z.B. bei der Darstellung von Graphen über einen längeren Zeitraum).&lt;br /&gt;
&lt;br /&gt;
Alternativ kann FHEM die Log-Daten mittels {{Link2CmdRef|Lang=de|Anker=DbLog|Label=DbLog}} in einer Datenbank speichern. Diese kann lokal als einfache SQLite- oder als zentrale Server-Datenbank (s.u.) gestaltet sein. Schon eine lokale einfache SQLite-Datenbank ist in der Regel deutlich performanter als File-basierte Logs.&lt;br /&gt;
&lt;br /&gt;
Damit eine Datenbank-Nutzung möglich ist, müssen folgende Anpassungen gemacht werden:&lt;br /&gt;
# [[#Datenbank|Erstellen einer entsprechenden Datenbank]]&lt;br /&gt;
# [[#Datenbank-Anbindung mittels db.conf|Konfiguration der Datenbank-Anbindung in FHEM]]&lt;br /&gt;
# [[#Konfiguration als Device in fhem.cfg|Anpassen aller (oder einzelner) Konfigurationen von FileLog nach DbLog]]&lt;br /&gt;
# [[#Anpassen der gplot-Konfigurationen|Ggf. Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&lt;br /&gt;
;Hinweis:&lt;br /&gt;
Reporting und Management von DbLog-Datenbankinhalten kann mit dem Modul [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] stattfinden.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
=== Datenbank-Anbindung mittels db.conf ===&lt;br /&gt;
DbLog wird durch 2 verschiedene Einträge aktiviert/definiert. In einer Datei namens &#039;&#039;&#039;db.conf&#039;&#039;&#039; werden die Parameter für eine Verbindung zur Datenbank (host, username, password, etc.) hinterlegt. Diese Datei kann in einem beliebigen Verzeichnis angelegt werden. Für eine MySQL-Datenbank sieht die db.conf folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
[Anmerkung: MariaDB10 nutzt nicht Port 3306 sondern 3307. Dies ist zum Beispiel bei Synology NAS der Fall]&lt;br /&gt;
&lt;br /&gt;
 %dbconfig= (&lt;br /&gt;
     connection =&amp;gt; &amp;quot;mysql:database=fhem;host=db;port=3306&amp;quot;,&lt;br /&gt;
     user =&amp;gt; &amp;quot;fhemuser&amp;quot;,&lt;br /&gt;
     password =&amp;gt; &amp;quot;fhempassword&amp;quot;,&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation befindet sich eine Beispielkonfiguration mit der Syntax für jeden unterstützen Datenbanktyp.&lt;br /&gt;
Es wird empfohlen diese Datei zu kopieren und erst dann entsprechend zu bearbeiten. Am Besten kopiert man diese Datei in das FHEM Home Directory /opt/fhem/ und achtet auf die entsprechenden Rechte!&lt;br /&gt;
 chown fhem:dialout /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration als Device ===&lt;br /&gt;
Das DbLog Device wird dann definiert mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; DbLog &amp;lt;configfilename&amp;gt; &amp;lt;regexp&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;configfilename&amp;gt;&#039;&#039; dem Pfad zur zuvor angelegten db.conf entspricht.&lt;br /&gt;
Ein Beispiel hierfür wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;&lt;br /&gt;
Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit vielen teils irrelevanten Werten gefüllt wird. Man kann daher die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Dies ist in [[#Finetuning des Loggings]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
Unbedingt beachten: bei Verwendung des Moduls configdb wird die Konfigurationsdatei aus der &#039;&#039;&#039;&#039;&#039;Datenbank&#039;&#039;&#039;&#039;&#039; gelesen. Deshalb ist es erforderlich, das File mittels &amp;lt;code&amp;gt;configdb fileimport db.conf &amp;lt;/code&amp;gt; vorher zu importieren !&lt;br /&gt;
&lt;br /&gt;
=== Finetuning des Loggings ===&lt;br /&gt;
Bei der Konfiguration des Log-Devices werden die zu loggenden Daten definiert - in der einfachsten Form sieht das so aus: &amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;. Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit sehr vielen und teils nicht benötigten Werten gefüllt wird und schnell wächst. Die Datenbank ist zwar deutlich leistungsfähiger, was große Datenmengen angeht, Datensparsamkeit kann aber schnell sinnvoll werden...&lt;br /&gt;
&lt;br /&gt;
Um das Log-Aufkommen einzugrenzen gibt es mehrere Ansätze:&lt;br /&gt;
* Einschränkung über den &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag&lt;br /&gt;
* Einschränkung über DbLogExclude-Einträge der jeweiligen Devices&lt;br /&gt;
* Einschränkung über DbLogInclude-Einträge des jeweiligen Devices&lt;br /&gt;
* Ausschluß von Device/Reading-Kombinationen über das Attribut &amp;quot;excludeDevs&amp;quot;. Es können {{Link2CmdRef|Anker=devspec|Lang=de|Label=devspec}} verwendet werden. &lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über den zentralen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag ====&lt;br /&gt;
Man kann die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Die erste Wildcard, also das erste &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt;, entspricht dem in FHEM verwendeten Device-Namen. Die zweite Wildcard entspricht dem vom Device ausgegebenen zu loggenden Wert. Separiert werden beiden Angaben durch einen Doppelpunkt. &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel, um zwar alle definierten Devices zu erfassen, aber nur die Werte Temperatur, Ventilposition und Luftfeuchte in die Datenbank zu schreiben wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).* &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über die jeweiligen Devices ====&lt;br /&gt;
Man kann die zu loggenden Werte für einzelne Devices separat einschränken, ohne dies im zentralen define-Eintrag machen zu müssen. Dies kann interessant sein, wenn beispielsweise ein Device Fehlerwerte meldet, die uninteressant sind, oder es meldet unnötig häufig Werte - beides ist z.B. bei 1-wire-Temperatursensoren gerne der Fall.&lt;br /&gt;
&lt;br /&gt;
Um das einzuschränken gibt es 2 Stellparameter, die als Attribute direkt zum jeweiligen Device konfiguriert werden:&lt;br /&gt;
* DbLogExclude - definiert Werte, die nicht geloggt werden sollen&lt;br /&gt;
* DbLogInclude - definiert Werte, die geloggt werden sollen ( siehe attr DbLogSelectionMode )&lt;br /&gt;
* event-min-interval, event-on-change-reading und event-on-update-reading beeinflussen, wie häufig Werte geloggt werden (vgl. {{Link2CmdRef|Lang=de|Anker=event-on-update-reading}})&lt;br /&gt;
&lt;br /&gt;
Eine konkrete Konfiguration für einen sehr gesprächigen 1-wire-Temperatursensor könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define EG_Balkon GPIO4 BUSMASTER&lt;br /&gt;
attr EG_Balkon DbLogExclude failures,T,85     # logge keine &amp;quot;failures&amp;quot;, &amp;quot;T&amp;quot;-Werte und &amp;quot;85&amp;quot;-Werte (default-Werte, wenn keine Temperatur gelesen werden kann)&lt;br /&gt;
attr EG_Balkon event-on-change-reading state  # logge nur, wenn sich ein Wert ändert (wenn sich die Temperatur nicht ändert, logge das nicht)&lt;br /&gt;
attr EG_Balkon event-min-interval state:900   # logge spätestens alle 900sec = 15min&lt;br /&gt;
attr EG_Balkon event-on-update-reading .*     # logge alle Werte, die aktualisiert werden&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;1-Wire-Device vom Typ OWTHERM oder OWSWITCH&amp;gt; DbLogExclude data.*      # verhindert das Logging der state-Eintragungen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine in diesem {{Link2Forum|Topic=33697|Message=264127}} vorgestellte Strategie zur Vermeidung unnötigen Loggings ist, dass bei der Definition von Devices durch das nachfolgende &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; automatisch ein DbLogExclude für alle Werte (.*) des Devices zugewiesen wird und dies nur bei Interesse an geloggten Werten gelöscht bzw. angepasst wird:&lt;br /&gt;
&amp;lt;code&amp;gt;define nDbLogExclude notify global:DEFINED.* attr $EVTPART1 DbLogExclude .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es mittlerweile möglich, lediglich erwünschte Werte (Positiv-Liste) zu loggen und alle anderen zu verwerfen. Hierfür wird im LogDevice das attribut DbLogSelectionMode Include verwendet. Nun kann für jedes Device mit DbLogInclude &amp;lt;Reading1&amp;gt;,&amp;lt;Reading2&amp;gt;,... angegeben werden, welche Readings geloggt werden sollen. &lt;br /&gt;
Integriert ist ebenfalls ein &amp;quot;min-interval&amp;quot;, siehe {{Link2CmdRef}}.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
Unterstützte Datenbanksysteme (Auswahl):&lt;br /&gt;
* Sqlite&lt;br /&gt;
* MySQL&lt;br /&gt;
* PostGreSql&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Die Datenbank ist relativ simpel gestaltet und besteht lediglich aus den folgenden beiden Tabellen:&lt;br /&gt;
* current&lt;br /&gt;
* history&lt;br /&gt;
&lt;br /&gt;
DbLog ist auf eine feste Tabellenstruktur angewiesen. Man muss daher in seiner Datenbank eine Tabelle mit folgenden Spalten anlegen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Spalte&lt;br /&gt;
! Beschreibung (en)&lt;br /&gt;
! Beschreibung (de)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TIMESTAMP&#039;&#039;&#039;&lt;br /&gt;
| timestamp of event&lt;br /&gt;
| Zeitstempel&lt;br /&gt;
| 2007-12-30 21:45:22 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEVICE&#039;&#039;&#039;&lt;br /&gt;
| device name&lt;br /&gt;
| Device-Name&lt;br /&gt;
| Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TYPE&#039;&#039;&#039;&lt;br /&gt;
| device type&lt;br /&gt;
| Device-Typ&lt;br /&gt;
| KS300&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;EVENT&#039;&#039;&#039;&lt;br /&gt;
| event specification as full string&lt;br /&gt;
| Eventspezifikation als Text&lt;br /&gt;
| humidity: 71 (%)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;READING&#039;&#039;&#039;&lt;br /&gt;
| name of reading extracted from event&lt;br /&gt;
| Bezeichnung des Readings&lt;br /&gt;
| humidity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VALUE&#039;&#039;&#039;&lt;br /&gt;
| actual reading extracted from event&lt;br /&gt;
| Wert des Readings&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UNIT&#039;&#039;&#039;&lt;br /&gt;
| unit extracted from event&lt;br /&gt;
| Einheit des Readings&lt;br /&gt;
| %&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Vorlagen zur Anlage von Tabellen und Indizes sind für jeden unterstützten Datenbanktyp im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation, oder hier zu finden: [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/dblog/ Link]. Das MySQL-Skript (db_create_mysql.sql) legt eine neue Datenbank, das PostGres-Skript (db_create_postgresql.sql) ein neues Schema mit Namen &amp;quot;fhem&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
==== current ====&lt;br /&gt;
Die Tabelle current enthält für jedes zu loggende Device lediglich den letzten Wert. Falls noch kein Wert geloggt wurde, ist diese Tabelle leer. &lt;br /&gt;
Falls der Inhalt gelöscht wird, bauen sich die Daten automatisch wieder auf. Es gehen durch das löschen der Tabelle current keine Log-Informationen verloren.&lt;br /&gt;
Der Inhalt wird aber u.a. für die Dropdown-Felder beim Plot-Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
Um doppelte Einträge in der Tabelle zu vermeiden, wurden die Möglichkeit geschaffen Primary Keys zu definieren. Da in der Spalte &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; u.U. bei verschiedenen Geräten gleiche Namen vorkommen können, sollte der Primary Key um den Gerätenamen erweitert werden. Der Primary Key sollte also aus &amp;lt;code&amp;gt;DEVICE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; bestehen. Um in der Datenbank &#039;&#039;fhem&#039;&#039; diesen PK zu setzen, kann folgender SQL Code verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`current` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Achtung: Die Tabelle &amp;quot;current&amp;quot; wird nur befüllt, wenn das Attribut DbLogType auf Current oder Current/History gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
==== history ====&lt;br /&gt;
Die Tabelle history enthält alle bisher geloggten Daten. Löschen in dieser Tabelle bedeutet automatisch Datenverlust (gewollt oder nicht ... )&lt;br /&gt;
Der Inhalt dieser Tabelle wird verwendet, um die Plots zu zeichnen oder Auswertungen mit [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] anzufertigen&lt;br /&gt;
&lt;br /&gt;
{{Todo|Ausbauen}}&lt;br /&gt;
&lt;br /&gt;
Um Problem beim Import von cacheFiles zu vermeiden, kann in der Datenbank ein PK angelegt werden, welcher Timestamp, Device und Reading umfasst. Dadurch werden doppelte Einträge wirksam verhindert.&lt;br /&gt;
&lt;br /&gt;
== Anpassen der gplot-Konfigurationen ==&lt;br /&gt;
Die meisten gplot-Konfigurationen sind bisher lediglich auf FileLog-Konfigurationen ausgelegt. Deshalb müssen sie für die Verwendung mit DbLog angepasst werden. Glücklicherweise beschränkt sich dies auf die reinen FileLog-Zeilen - es müssen die DbLog-Äquivalente hinzugefügt werden. Die FileLog-Einträge müssen zwar nicht gelöscht werden, wenn man aber FileLog und DbLog parallel betreibt, sollte man getrennte gplot-Dateien für beide Logging-Typen haben um Auswertungsprobleme erkennen zu können.&lt;br /&gt;
&lt;br /&gt;
Für die fht.gplot Konfiguration sähe die Anpassung wie folgt aus (lediglich die vier DbLog-Zeilen wurden hinzugefügt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2014-12-25 21:53:30&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 ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid y2tics&lt;br /&gt;
set ylabel &amp;quot;Actuator/Window (%)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set yrange 0:100&lt;br /&gt;
set y2range 5:25&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:.measured-temp\x3a:0:&lt;br /&gt;
#FileLog 4:.actuator\x3a:0:int&lt;br /&gt;
#FileLog 4:.desired-temp::&lt;br /&gt;
#FileLog 4:.window\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.measured-temp:0:&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.actuator:0:int&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.desired-temp::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.window::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Measured temperature&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Actuator (%)&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Desired Temperature&#039; ls l2 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Window&#039; ls l3 lw 1 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren ist zu beachten: &lt;br /&gt;
&lt;br /&gt;
On-Off-Plots&lt;br /&gt;
&lt;br /&gt;
 EG_Bad:window:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:0/eg&lt;br /&gt;
&lt;br /&gt;
unter Berücksichtigung von dim-Werten:&lt;br /&gt;
&lt;br /&gt;
 EG_WoZi_Licht:value:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:($1eq&amp;quot;dim&amp;quot;?$2*0.01:0)/eg&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer SQLite-Datenbank ==&lt;br /&gt;
Im folgenden wird eine lokale SQLite-Datenbank auf einen Ubuntu-System angelegt (nach Quelle: http://www.tatsch-it.de/fhem-dblog/)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Installation von SQLite:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo aptitude install sqlite3 libdbi-perl libdbd-sqlite3-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Anlegen der SQLite-Datenbank fhem.db&#039;&#039; (öffnet auch direkt eine SQL-Kommandozeile):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE history (TIMESTAMP TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE TABLE current (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE INDEX Search_Idx ON `history` (DEVICE, READING, TIMESTAMP);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Anpassen des Besitzers und der Rechte der Datenbank-Datei:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chown fhem /opt/fhem/fhem.db&lt;br /&gt;
sudo chmod 600 /opt/fhem/fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Datenbank-Anbindung des FHEM konfigurieren:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/db.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%dbconfig= (&lt;br /&gt;
  connection =&amp;gt; &amp;quot;SQLite:dbname=/opt/fhem/fhem.db&amp;quot;,&lt;br /&gt;
  user =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  password =&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Logging des FHEM auf die Datenbank konfigurieren:&#039;&#039; (hier sind nur die Anpassungen aufgeführt)&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/fhem.cfg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
attr global userattr DbLogExclude ...  # erlaubt es einzelne Einträge nicht zu loggen&lt;br /&gt;
...&lt;br /&gt;
define logdb DbLog ./db.conf .*:.*     # logt alle(!) auflaufenden Events aller Konfigurationen&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da durch diese &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Definition alle auflaufenden Events gelogt werden, müssen keine weiteren Anpassungen in der Konfiguration gemacht werden. Die FileLog-Einträge können bedenkenlos bestehen bleiben - dann wird in Datenbank und FileLog gelogt und man verliert keine Daten, falls etwas nicht klappt. Wenn alles wie geplant läuft, können die FileLog-Definitionen gelöscht werden (ebenso die Log-Dateien). Ebenso können die zu loggenden Daten später eingegrenzt werden (s. [[#Finetuning des Loggings]]).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;FHEM neu starten:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service fhem stop&lt;br /&gt;
sudo service fhem start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Kontrollieren, ob Logs in die Datenbank geschrieben werden:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from history order by TIMESTAMP;       # dies gibt alle(!) Logs chronologisch aus (kann nach längerem Betrieb recht lange dauern)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Anpassung der glot-Dateien:&#039;&#039; siehe [[#Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer Mysql-Datenbank ==&lt;br /&gt;
Hierfür gibt es eine [[DbLog-MySQL|extra Seite]], die die Unterschiede und Feinheiten zwischen den verschiedenen Versionen berücksichtigt&lt;br /&gt;
&lt;br /&gt;
Anstatt nano kann jeder andere kompatible Editor verwendet werden. Weiterhin bitte beachten, dass die hier genannten Befehle teilweise root-Rechte voraussetzen. Entweder komplett als root arbeiten, oder mittels sudo.&lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu/debian: &lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get install mysql-server mysql-client libdbd-mysql libdbd-mysql-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Installation sollte man aus Sicherheitsgründen ein Passwort für den mysql-root vergeben, wenn man nicht sogar ganz den Login verbietet.&lt;br /&gt;
&lt;br /&gt;
Hinweis: im Folgenden ist &amp;quot;#&amp;quot; der normale Prompt und &amp;quot;mysql&amp;gt;&amp;quot; der prompt innerhalb mysql, dieser kann mit exit verlassen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Test mal mit mysql verbinden:&lt;br /&gt;
 # mysql -p -u root&lt;br /&gt;
 Enter password:&lt;br /&gt;
 mysql&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
Jetzt die Tabellenstruktur anlegen. &lt;br /&gt;
Hierfür kann die Datei /opt/fhem/contrib/dblog/db_create_mysql.sql als Vorlage verwendet und das Passwort und der Benutzername geändert werden. &lt;br /&gt;
 cd /opt/fhem/contrib/dblog/&lt;br /&gt;
 nano db_create_mysql.sql&lt;br /&gt;
Dann wird die Datei eingelesen (root Passwort wird abgefragt): &lt;br /&gt;
&lt;br /&gt;
 # mysql -u root -p &amp;lt; db_create_mysql.sql&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man den Zugang testen: &lt;br /&gt;
&lt;br /&gt;
 # mysql -p -u &amp;lt;fhemuser&amp;gt;&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; show databases;&lt;br /&gt;
&lt;br /&gt;
Nun müsste eine Datenbank &amp;quot;fhem&amp;quot; angezeigt werden, die die Tabellen current und history enthält.&lt;br /&gt;
&lt;br /&gt;
Nun in der Datei db.conf den mysql-Block auskommentieren und ebenfalls Benutzername, Passwort UND HOST anpassen. Leider ist hier nicht standardmäßig localhost eingestellt.&lt;br /&gt;
 nano /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
Jetzt kann unter FHEM ein DbLog-Device angelegt werden (mit dem beispiel wird alles geloggt: &lt;br /&gt;
 define logdb DbLog ./db.conf .*:.*&lt;br /&gt;
Als State muss ein &amp;quot;connected&amp;quot; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Ein rereadcfg in FHEM stellt sicher, dass die neue Konfiguration übernommen wird - ein Neustart ist nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Nun kann die Funktion noch einmal überprüft werden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 # mysql -u &amp;lt;fhemuser&amp;gt; -p&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; use fhem;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0,00 sec)&lt;br /&gt;
 mysql&amp;gt; select * from history; # Achtung, kann sehr groß werden .... #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anscheinend gibt es bei der neuen Version MariaDB (im Gegensatz zu mysql) ein neues Anmeldeverfahren, so dass in der Datenbank selbst Veränderungen vorgenommen werden müssen, damit der Zugriff durch FHEM funktioniert: https://kofler.info/root-login-problem-mit-mariadb/&lt;br /&gt;
&lt;br /&gt;
Die Daten im MySQL können auch für die längere Aufbewahrung partitioniert werden. Dabei wird pro Partition eine Datei erzeugt statt einer gemeinsamen Datei für alle Daten. Je nach Wunsch zum Beispiel partitioniert nach Jahr.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Alter table history PARTITION BY RANGE ( UNIX_TIMESTAMP(timestamp) ) (&lt;br /&gt;
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP(&#039;2019-01-01 00:00:00&#039;) ),&lt;br /&gt;
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP(&#039;2020-01-01 00:00:00&#039;) ),&lt;br /&gt;
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP(&#039;2021-01-01 00:00:00&#039;) ),&lt;br /&gt;
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP(&#039;2022-01-01 00:00:00&#039;) ),&lt;br /&gt;
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP(&#039;2023-01-01 00:00:00&#039;) ),&lt;br /&gt;
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP(&#039;2024-01-01 00:00:00&#039;) ),&lt;br /&gt;
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP(&#039;2025-01-01 00:00:00&#039;) ),&lt;br /&gt;
    PARTITION p7 VALUES LESS THAN (MAXVALUE) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Abfragescript PHP/MySQL ==&lt;br /&gt;
Um eine schnelle Übersicht zu bekommen habe ich mir dieses Script geschrieben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php $pdo = new PDO(&#039;mysql:host=localhost;dbname=fhem&#039;, &#039;fhemuser&#039;, &#039;fhempasswort&#039;);&lt;br /&gt;
echo &#039;&amp;lt;h2&amp;gt;Tabelle Current&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Anzahl&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Readings&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
$sql = &amp;quot;SELECT COUNT(*), DEVICE, GROUP_CONCAT(DISTINCT READING ORDER BY READING DESC SEPARATOR &#039;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&#039;) FROM current GROUP BY DEVICE;&amp;quot;; foreach ($pdo-&amp;gt;query($sql) as&lt;br /&gt;
$row) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[0] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[1] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;quot; . $row[2] . &amp;quot;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &#039;&amp;lt;h2&amp;gt;Tabelle History&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Anzahl&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
$sql = &amp;quot;SELECT COUNT(*), DEVICE FROM history GROUP BY DEVICE;&amp;quot;; foreach ($pdo-&amp;gt;query($sql) as&lt;br /&gt;
$row) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[0] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[1] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitte passt &#039;&#039;fhemuser&#039;&#039; und &#039;&#039;fhempasswort&#039;&#039; an. Das Ganze kommt dann nach &amp;lt;code&amp;gt;/var/www/html/fhemdb.php&amp;lt;/code&amp;gt; und ist mit &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;IP&amp;gt;/fhemdb.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; aufrufbar. Wenn ihr den zweiten Block für die history Tabelle ausklammert oder entfernt, läuft das Script viel schneller ab - klar die history Tabelle ist meist randvoll.&lt;br /&gt;
&lt;br /&gt;
== Integration von DBLog in eigene Module ==&lt;br /&gt;
=== Bereitstellung der UNITS ===&lt;br /&gt;
Mit der DbLog_splitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Dazu muss der Modulautor in der [[DevelopmentModuleIntro#X_Initialize|Initialize-Funktion]] eine &amp;lt;code&amp;gt;DbLog_splitFn&amp;lt;/code&amp;gt; bereitstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{DbLog_splitFn}      = &amp;quot;X_DbLog_splitFn&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genaue Aufrufsyntax und Funktionweise einer DbLog_split-Funktion findet man [[DevelopmentModuleIntro#X_DbLog_split|hier]].&lt;br /&gt;
&lt;br /&gt;
== Werte auslesen ==&lt;br /&gt;
Manchmal möchte man Daten aus den Logs abrufen ohne händisch in der Datenbank herumzuwühlen (s.u.). Dies ist insbesondere auch dann hilfreich, wenn man eigene Funktionen, Notifys oder spezielle Plots entwirft, bei denen man auf Logdaten zugreifen möchte.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich beschrieben ist dies in der {{Link2CmdRef|Lang=de|Anker=DbLog}} und unterscheidet sich minimal (aber entscheidend) von der Struktur bei [[FileLog#Werte_auslesen|FileLogs]].&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, was man damit anstellen kann:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01 2016-10-03 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor vom 01.10.-03.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor von 8-16 Uhr am 01.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor:temperature&amp;lt;/code&amp;gt; nur die temperature Werte&lt;br /&gt;
* &amp;lt;code&amp;gt;{ ReadingsTimestamp(&amp;quot;meinSensor&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;0&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des aktuellen state des meinSensor&lt;br /&gt;
* &amp;lt;code&amp;gt;{ OldTimestamp(&amp;quot;meinSensor&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des letzten state des FHT_3a32&lt;br /&gt;
* &amp;lt;code&amp;gt;{ time_str2num(OldTimestamp(&amp;quot;meinSensor&amp;quot;)) }&amp;lt;/code&amp;gt; Timestamp in Sekunden des letzten state des meinSensor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Bearbeitung von Datenbank-Einträgen ==&lt;br /&gt;
{{Hinweis|Dieser Abschnitt soll lediglich eine kleine Einführung in die Datenbank-Bearbeitung liefern. Für vertiefende Informationen sollte man sich grundsätzlich mit SQL beschäftigen. Eine umfassende und gut verständliche Anleitung zu SQL bietet bspw. [http://www.w3schools.com/sql/default.asp w3schools].}}&lt;br /&gt;
Irgendwann wird der Fall eintreten, dass in der Datenbank Einträge drinstehen, die geändert oder gelöscht werden sollen (zB. fehlerhafte Sensor-Rückmeldungen, umbenannte Readings). In klassischen Log-Dateien würde man diese einfach bearbeiten und löschen/anpassen (wobei man aber tunlichst zuvor FHEM stoppt, um Datenfehler zu vermeiden). Eine Datenbank kann bearbeitet werden, ohne FHEM stoppen zu müssen. &lt;br /&gt;
&lt;br /&gt;
Datenbanken kann man ohne weitere Hilfsmittel direkt von der Kommandozeile/Shell aus bearbeiten. Alternativ gibt es auch verschiedenste Tools (webbasiert oder als Applikation), die einen dabei unterstützen (Bsp. findet man u.a. [https://wiki.ubuntuusers.de/SQLite/#Grafische-Benutzeroberflaechen hier]). Für einfache Arbeiten reicht allerdings idR. Shell.&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
&#039;&#039;&#039;Öffnen der DB unter Linux:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(Es werden Schreibrechte benötigt,ohne kann man die DB zwar öffnen, aber nichts machen)&lt;br /&gt;
 sudo sqlite3 fhem.db&lt;br /&gt;
Dadurch öffnet sich ein SQL-Konsole, auf der alle weiteren Befehle ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schliessen der DB:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hilfe anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Tabellen anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Schema der DB anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(vgl. oben [[DbLog#Datenbanken]] und [[DbLog#Beispiel: Anlegen und Nutzung einer SQLite-Datenbank]])&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .schema&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Eintäge anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Die Einträge liegen alle in der Tabelle &amp;quot;History&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ganz wichtig&#039;&#039;&#039; ist immer das &amp;quot;;&amp;quot; am Ende Zeile (bei allen Kommandos, die nicht mit einem &amp;quot;.&amp;quot; anfangen). Wenn es vergessen wurde zeigt die Konsole solange neue Zeilen bis ein &amp;quot;;&amp;quot; eingegeben wird. So kann ein Befehl auch bequem über mehrere Zeilen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY;&lt;br /&gt;
&lt;br /&gt;
Dies kann sehr lange dauern und kann ggf. mit &amp;lt;code&amp;gt;STRG-C&amp;lt;/code&amp;gt; abgebrochen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-Statements werden Strings in einfache Anführungsstriche gesetzt, Zahlen nicht.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LÖSCHEN aller Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Löschen kann nicht rückgängig gemacht werden!! Also IMMER erst die entsprechenden SELECT-Statements solange verfeinern bis wirklich nur die gewünschten Einträge angezeigt werden. Dann das &amp;lt;code&amp;gt;select *&amp;lt;/code&amp;gt; durch &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ersetzen.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; delete from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenbank reparieren ==&lt;br /&gt;
Es kann immer wieder mal vorkommen, dass Datenbanken Fehler enthalten. Das muss im Alltag garnicht auffallen und auch nicht immer schlimm enden. Wenn man auf der SQL-Konsole aber bspw. eine Meldung &amp;lt;code&amp;gt;Error: database disk image is malformed&amp;lt;/code&amp;gt; erhält, sollte man ein Reparatur vornehmen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Ist ein DbRep-Device definiert, kann eine Reparatur einfach mit dem eingebauten Befehl &#039;&#039;&#039;set &amp;lt;name&amp;gt; repairSQlite&#039;&#039;&#039; ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
Die folgenden Schritte beschreiben, wie man eine SQLite-DB reparieren kann (Quelle: [http://techblog.dorogin.com/2011/05/sqliteexception-database-disk-image-is.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;DB öffnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Integritäts-Check durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sqlite&amp;gt; pragma integrity_check;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt hier ein &amp;quot;ok&amp;quot; ist die DB gesund. Ansonsten erscheint etwas wie&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** in database main ***&lt;br /&gt;
On tree page 118786 cell 1: Rowid 75 out of order (previous was 816660)&lt;br /&gt;
On tree page 118786 cell 4: Rowid 815704 out of order (previous was 816727)&lt;br /&gt;
Corruption detected in cell 0 on page 118786&lt;br /&gt;
Multiple uses for byte 132 of page 118786&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Datenbank-Dump erstellen (Export gesamten DB in die Datei &amp;quot;dump_all_20160516_1043.sql&amp;quot;) und DB verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .mode insert&lt;br /&gt;
sqlite&amp;gt; .output dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; .dump&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Neue Datenbank erstellen und den Dump einlesen, Integritäts-Check machen und verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem-neu.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .read dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; pragma integrity_check;&lt;br /&gt;
ok&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Spätestens jetzt FHEM stoppen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem stop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Alte DB sichern und neue aktivieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv fhem.db fhem.db.sv_20160516&lt;br /&gt;
sudo mv fhem-neu.db fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Kontrollieren, dass die neue DB die gleichen Rechte wie die alte DB hat (und ggf. korrigieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 root root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
~/fhem$ sudo chown fhem:root fhem.db&lt;br /&gt;
&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 fhem root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;FHEM wieder starten (und natürlich kontrollieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem start&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweise für sehr große Datenbanken ===&lt;br /&gt;
Wenn die SQLite-DB sehr groß wird, kann es sein, dass der oben beschriebene Weg nicht ohne manuelle Anpassungen funktioniert. Konkret war dies bei einem Nutzer für eine 15 GB große DB nicht möglich, der Prozess hat sich immer nach mehreren Stunden aufgehängt. Die Ursache liegt darin, dass ein Dump alle Daten in einer einzigen Transaktion einfügt. Das Problem kann man lösen, indem man den Dump in mehreren Transaktionen einfügt, also aufteilt. Konkret konnte eine 23GB große DB erfolgreich eingelesen und damit repariert werden, indem alle 10.000.000 Zeilen folgende 2 Zeilen eingefügt wurden:&lt;br /&gt;
&amp;lt;pre&amp;gt;BEGIN TRANSACTION;&lt;br /&gt;
COMMIT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hinweis 1: Mit dem Editor joe kann man unter Linux auch sehr große Dateien flüssig bearbeiten, das Springen zu hohen Zeilennumer dauert trotzdem. &lt;br /&gt;
* Hinweis 2: joe verwendet eine temporäre Kopie der Datei. Diese liegt per default unter /tmp. Der Ort kann aber auch durch &amp;lt;code&amp;gt;export TEMP=...&amp;lt;/code&amp;gt; geändert werden. Falls also unter /tmp nicht Platz für eine Kopie des Datenbank-Dumps ist, sollte diese Variable vor dem Starten von joe entsprechend gesetzt werden. &lt;br /&gt;
* Hinweis 3: Beim Speichern legt joe im gleichen Verzeichnis eine Sicherungskopie an, d.h. im Verzeichnis des Datenbank-Dumps sollte weiterer Platz in Höhe der Dateigröße frei sein. &lt;br /&gt;
* Hinweis 4: Der reopen Mechanismus von DbLog kann verwendet werden, um eine manuelle Datenbankreparatur ohne Logunterbrechung durchzuführen (vor dem Wieder-Öffnen der DbLog Datei- und Verzeichnisrechte prüfen!). Damit kann man das harte Stoppen und Starten von FHEM in obiger Anleitung umgehen.&lt;br /&gt;
* Letzter Hinweis: Weiter gilt: bei großen DbLog-Datenbanken sollte man immer darüber nachdenken,&lt;br /&gt;
** Welche dieser Logdaten man wirklich braucht und im Zweifel per DbRep ausdünnen&lt;br /&gt;
** Zu einer echten Datenbank wie MySQL/MariaDB zu wechseln.&lt;br /&gt;
&lt;br /&gt;
== Datenbank migrieren ==&lt;br /&gt;
Eine schöne Anleitung zur Migration von SQLite zu MySQL/MariaDB mit Hilfe von [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] findet sich hier: [https://demaya.de/fhem-umzug-sqlite-mysql-mariadb/].&lt;br /&gt;
&lt;br /&gt;
== Nützliche Codeschnipsel ==&lt;br /&gt;
Anbei ein paar nützliche Codeschnipsel rund um DbLog&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateigrösse mitloggen ===&lt;br /&gt;
Da die Datenbank ins Unermessliche wachsen kann, empfiehlt es sich - je nach Speicherplatz - ab einer bestimmten Grösse tätig zu werden. Dazu muss diese Grösse allerdings ermittelt werden. Diese geschieht mittels des Userreadings, welches man vorteilshafterweise mit im DbLog-device anlegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;attr myDbLog userReadings DbFileSize:reduceLogState.* { (split(&#039; &#039;,`du -m fhem.db`))[0] }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels dieses Attributs wird die Grösse der .db-Datei immer nach dem Ausführen des ReduceLog in das Reading &amp;quot;DbFileSize&amp;quot; in ganzzahligen MByte abgelegt.&lt;br /&gt;
&lt;br /&gt;
Basierend auf diesem Reading können dann weitere Aktionen, beispielsweise ein Plot, erstellt werden.&lt;br /&gt;
&lt;br /&gt;
Die oben beschriebene Möglichkeit ist für SQLite verwendbar. Zur Ermittlung der DB-Größe andere DB-Typen (aber auch für SQLite nutzbar) kann wie [[DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Gr.C3.B6.C3.9Fe_der_FHEM-Datenbank_ermitteln | hier]] beschrieben vorgegangen werden.&lt;br /&gt;
&lt;br /&gt;
== Performance-Optimierung ==&lt;br /&gt;
Auch eine Datenbank kann mit der Zeit langsamer werden. Dies hängt von mehreren Faktoren ab:&lt;br /&gt;
* Menge der gelogten Daten (zB. &amp;gt; 4-5 GB)&lt;br /&gt;
* Eingesetzte Hardware (zB. langsame SD-Karte vs. schnelle SSD)&lt;br /&gt;
* Eingesetztes Datenbanksystem (zB. SQLite, MySQL)&lt;br /&gt;
* Komplexität der Abfragen (zB. für aufwändige Graphen oder Berechnungen)&lt;br /&gt;
&lt;br /&gt;
Diese Punkte sollen im folgenden diskutiert werden:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Komplexität der Abfragen ===&lt;br /&gt;
Dies ist kein Problem der Datenbank, sondern rein der Abfrage. Dem entsprechend muss die Optimierung auch in der Abfrage oder im Skript gesucht werden. Dies ist nicht Ziel dieses Abschnittes und wird hier nicht weiter behandelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eingesetztes Datenbanksystem ===&lt;br /&gt;
Welches Datenbanksystem eingesetzt wird (zB. SQLite oder MySQL) hat auf die Performance der Datenbank gar keinen so großen Einfluss, wie vielleicht zuerst gedacht. Selbst SQLite kann problemlos Datenbanken mit etlichen GB Größe performant verarbeiten. Der Flaschenhals ist hier viel mehr die darunter liegende Hardware (s.u.).&lt;br /&gt;
&lt;br /&gt;
Die Performance der Datenbank an sich, kann aber durch verschiedene Maßnahmen verbessert werden:&lt;br /&gt;
* Pflegemaßnahmen bzgl. der Daten&lt;br /&gt;
* &#039;&#039;&#039;Erstellung von Indizes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Menge der Daten und Pflegemaßnahmen bzgl. der Daten ====&lt;br /&gt;
Die Menge der geloggten Daten hat natürlich Einfluss auf die Geschwindigkeit von Abfragen - je mehr Daten vorhanden sind, desto mehr Daten müssen auch durchforstet werden um eine Abfrage zu bedienen. Die Reduzierung der geloggten Datenmenge hat also direkten Einfluss auf die Größe und damit auch die Geschwindigkeit der Datenbank. Die Menge der zu loggenden Daten lässt sich an zwei Stellen einschränken:&lt;br /&gt;
* bei der Definition jedes Devices (s. Kapitel oben)&lt;br /&gt;
* bei der Festlegung des FHEM-weiten Log-Levels (s. [[Loglevel]])&lt;br /&gt;
&lt;br /&gt;
Die Menge der bereits geloggten Daten kann zB. mit Hilfe von [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] verringert und optimiert werden, bspw.&lt;br /&gt;
* löschen unnötiger Daten&lt;br /&gt;
* vacuum der Datenbank&lt;br /&gt;
&lt;br /&gt;
Insgesamt haben diese Maßnahmen aber nur einen eingeschränkten Effekt auf die Performance der DB. Deutlich effektiver ist die Erstellung eines Index (s.u.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erstellung von Indizes ====&lt;br /&gt;
Die Erstellung von Indizes hat mit Abstand den größten Einfluss auf die Performance einer Datenbank (auf unveränderter Hardware). Extrem zusammengefasst ist ein Index eine extrem optimiertes Nachschlageverzeichnis für einen bestimmten Typ Daten (ein Index wie im Buch halt). Eine wunderbare Einführung in Indizes bietet [[https://use-the-index-luke.com/de|https://use-the-index-luke.com]].&lt;br /&gt;
&lt;br /&gt;
In FHEM sind Indizes sogar sehr einfach einzurichten da die Datenbank-Nutzung sehr stark vorgegeben ist. Nahezu jede Abfrage folgt dem Schema &#039;&#039;Device -&amp;gt; Reading -&amp;gt; Datum -&amp;gt; Wert&#039;&#039;. Ein Index kann genau diese Abfrage bedienen und beschleunigen. Ein Index nur über die Devices wäre ein erster Schritt, brächte aber noch keinen großen Gewinn (wie um Link oben gut beschrieben). Über die gesamten ersten drei Schritte erstellt (Device -&amp;gt; Reading -&amp;gt; Datum) bringt der Index aber sofort eine deutliche Geschwindigkeitssteigerung.&lt;br /&gt;
&lt;br /&gt;
Die Erstellung eines Index erfolgt direkt in der Datenbank (und nicht aus FHEM heraus), hier am Beispiel einer SQLite-DB:&lt;br /&gt;
&lt;br /&gt;
Öffnen der DB:&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo sqlite3 fhem.db &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugen des Index auf der DB-Konsole (das Semikolon am Ende ist wichtig):&lt;br /&gt;
&amp;lt;pre&amp;gt; create index idx_device_reading_timestamp on history (device, reading, timestamp); &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verlassen der DB:&lt;br /&gt;
&amp;lt;pre&amp;gt; .exit &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einzig zu berücksichtigen ist, dass dieser Index die Datenbank um bis zu 1/3 vergrößert. Er kann aber bei Bedarf auch wieder entfernt werden. Bei meiner 15 GB SQLite-Datei (auf einem Mac Mini mit SSD) hat dies ca. 15 min gedauert (den FHEM hatte ich vorsichtshalber währenddessen deaktiviert).&lt;br /&gt;
&lt;br /&gt;
Sollte jemand spezielle Berechnungen oder Skripte ausführen, die nach einem anderen Abfrage-Schema arbeiten, könnte man dafür spezialisierte zusätzliche Indizes erstellen. Das sollte aber dann mit dem Wissen des obigen Links erarbeitet werden, da dann etwas mehr Hintergrundwissen sehr hilfreich ist.&lt;br /&gt;
&lt;br /&gt;
==== DB-Backup ====&lt;br /&gt;
Ein anderer Aspekt, der eigentlich nichts mit der Performance der DB zu tun hat, ist der Einfluss aufs Backup. Wird bspw. ein Systembackup per RSYNC gemacht, muss bei SQLite immer die komplette ggf. riesige Datei gesynct werden - bei MySQL würden nur die veränderten DB-Elemente gesynct. Dies soll hier nicht weiter vertieft werden, sollte aber bei einer Gesamtstrategie bedacht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eingesetzte Hardware ===&lt;br /&gt;
FHEM hat grundsätzlich sehr viele kleine Datenzugriffe, unabhängig davon ob FileLog oder DbLog eingesetzt wird. Deshalb ist der absolut größte Performance-Gewinn durch den Einsatz schneller Festplatten zu erreichen - ganz einfache Aussage: &#039;&#039;je schneller desto besser ;-)&#039;&#039;. Konkret bietet eine SSD mit mind. 250MB/s Datenzugriff eine ordentliche Basis für jedes datengestützte System, wie den FHEM.&lt;br /&gt;
&lt;br /&gt;
Wenn die Datenmenge größer und die Abfragen komplexer werden, müssen natürlich irgendwann auch die Prozessorleistung und der Arbeitsspeicher mit wachsen. Aber auch an einem Raspi wird eine SSD deutlich performanter sein, als eine einfache SD-Karte oder eine klassische rotierende Festplatte.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Heizleistung_und_Gasverbrauch|Beispiel das DbLog-Daten für SVG-Plots verwendet]]&lt;br /&gt;
* [[SVG-Plots von FileLog auf DbLog umstellen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Logging]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog-MySQL&amp;diff=35475</id>
		<title>DbLog-MySQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog-MySQL&amp;diff=35475"/>
		<updated>2021-04-10T18:52:12Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* phpMyAdmin */ in phpymyadmin geändert, da mit Großbuchstaben das Paket nicht gefunden wird.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Da bei der Inbetriebnahme und der Migration von MySQL bzw MariaDB-Datenbanken einige kleine Fallen auftreten können, gibt&#039;s hier ein paar Hinweise.&lt;br /&gt;
&lt;br /&gt;
== Server version: 10.1.40-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04 ==&lt;br /&gt;
=== db.conf ===&lt;br /&gt;
[[DbLog]] wird durch zwei verschiedene Einträge aktiviert/definiert. In einer Datei namens &#039;&#039;&#039;db.conf&#039;&#039;&#039; werden die Parameter für eine Verbindung zur Datenbank (host, username, password, etc.) hinterlegt. Diese Datei kann in einem beliebigen Verzeichnis angelegt werden. Für eine MariaDB-Datenbank sieht die db.conf folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
 %dbconfig= (&lt;br /&gt;
     connection =&amp;gt; &amp;quot;mysql:database=fhem;host=db;port=3306&amp;quot;,&lt;br /&gt;
     user =&amp;gt; &amp;quot;fhemuser&amp;quot;,&lt;br /&gt;
     password =&amp;gt; &amp;quot;fhempassword&amp;quot;,&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation befindet sich eine Beispielkonfiguration mit der Syntax für jeden unterstützen Datenbanktyp. Bei der Verwendung von MariaDB muss die MySQL-Datei verwendet werden.&lt;br /&gt;
Es wird empfohlen, diese Datei zu kopieren und erst dann entsprechend zu bearbeiten. Am Besten kopiert man diese Datei in das FHEM Home Directory /opt/fhem/ und achtet auf die entsprechenden Rechte!&lt;br /&gt;
 chown fhem:dialout /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Die Datenbank ist relativ simpel gestaltet und besteht lediglich aus den folgenden beiden Tabellen:&lt;br /&gt;
* current&lt;br /&gt;
* history&lt;br /&gt;
&lt;br /&gt;
DbLog ist auf eine feste Tabellenstruktur angewiesen. Man muss daher in seiner Datenbank eine Tabelle mit folgenden Spalten anlegen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Spalte&lt;br /&gt;
! Beschreibung (en)&lt;br /&gt;
! Beschreibung (de)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TIMESTAMP&#039;&#039;&#039;&lt;br /&gt;
| timestamp of event&lt;br /&gt;
| Zeitstempel&lt;br /&gt;
| 2007-12-30 21:45:22 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEVICE&#039;&#039;&#039;&lt;br /&gt;
| device name&lt;br /&gt;
| Device-Name&lt;br /&gt;
| Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TYPE&#039;&#039;&#039;&lt;br /&gt;
| device type&lt;br /&gt;
| Device-Typ&lt;br /&gt;
| KS300&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;EVENT&#039;&#039;&#039;&lt;br /&gt;
| event specification as full string&lt;br /&gt;
| Eventspezifikation als Text&lt;br /&gt;
| humidity: 71 (%)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;READING&#039;&#039;&#039;&lt;br /&gt;
| name of reading extracted from event&lt;br /&gt;
| Bezeichnung des Readings&lt;br /&gt;
| humidity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VALUE&#039;&#039;&#039;&lt;br /&gt;
| actual reading extracted from event&lt;br /&gt;
| Wert des Readings&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UNIT&#039;&#039;&#039;&lt;br /&gt;
| unit extracted from event&lt;br /&gt;
| Einheit des Readings&lt;br /&gt;
| %&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; befindet sich das Script &#039;&#039;&#039;db_create_mysql.sql&#039;&#039;&#039; , welches eine neue Datenbank samt Tabellenstruktur anlegt. Ausserdem wird ein Benutzer &amp;quot;fhemuser&amp;quot; mit einem (zu ändernden) &amp;quot;fhempasswort&amp;quot; angelegt.&lt;br /&gt;
&lt;br /&gt;
==== Primary Keys ====&lt;br /&gt;
===== current =====&lt;br /&gt;
Die Tabelle current enthält für jedes zu loggende Device lediglich den letzten Wert. Falls noch kein Wert geloggt wurde, ist diese Tabelle leer. &lt;br /&gt;
Falls der Inhalt gelöscht wird, bauen sich die Daten automatisch wieder auf. Es gehen durch das löschen der Tabelle current keine Log-Informationen verloren.&lt;br /&gt;
Der Inhalt wird aber u.a. für die Dropdown-Felder beim Plot-Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
Um doppelte Einträge in der Tabelle zu vermeiden, wurde die Möglichkeit geschaffen, Primary Keys zu definieren. Da in der Spalte &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; u.U. bei verschiedenen Geräten gleiche Namen vorkommen können, sollte der Primary Key um den Gerätenamen erweitert werden. Der Primary Key sollte also aus &amp;lt;code&amp;gt;DEVICE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; bestehen. Um in der Datenbank &#039;&#039;fhem&#039;&#039; diesen PK zu setzen, kann folgender SQL Code verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`current` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== history =====&lt;br /&gt;
Die Tabelle history enthält alle bisher geloggten Daten. Löschen in dieser Tabelle bedeutet automatisch Datenverlust (gewollt oder nicht ... )&lt;br /&gt;
Der Inhalt dieser Tabelle wird verwendet, um die Plots zu zeichnen oder Auswertungen mit [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] anzufertigen&lt;br /&gt;
&lt;br /&gt;
Um Probleme beim Import von cacheFiles zu vermeiden, kann in der Datenbank ein PK angelegt werden, welcher Timestamp, Device und Reading umfasst. Dadurch werden doppelte Einträge wirksam verhindert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`history` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`TIMESTAMP`,`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer MariaDB-Datenbank ==&lt;br /&gt;
Anstatt nano kann jeder andere kompatible Editor verwendet werden. Weiterhin bitte beachten, dass die hier genannten Befehle teilweise root-Rechte voraussetzen. Entweder komplett als root arbeiten oder mittels sudo. In den nachfolgenden Beispielen wird daher stets sudo in Klammern geschrieben, &#039;&#039;&#039;dies bitte aber nicht so eingeben&#039;&#039;&#039;, sondern eben sudo su grundsätzlich voranstellen oder vor jedem Befehl sudo einsetzen. &lt;br /&gt;
&lt;br /&gt;
Hinweis: im Folgenden ist &amp;quot;#&amp;quot; der Shell-Prompt und &amp;quot;mysql&amp;gt;&amp;quot; der MariaDB-Prompt innerhalb mysql, dieser kann mit exit verlassen werden. &lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu/debian: &lt;br /&gt;
 # (sudo) apt-get update &amp;amp;&amp;amp; apt-get install mariadb-server&lt;br /&gt;
&lt;br /&gt;
Nach der Installation muss das Script &lt;br /&gt;
 # (sudo) mysql_secure_installation&lt;br /&gt;
ausgeführt werden. Dieses legt ein root-Passwort fest, entfernt die anonymen User und entfernt die test-Datenbank.&lt;br /&gt;
Empfohlen wird, alle Fragen mit &#039;&#039;&#039;Y&#039;&#039;&#039; zu beantworten.&lt;br /&gt;
&lt;br /&gt;
Zum Test mit MariaDB verbinden:&lt;br /&gt;
 # (sudo) mysql -u root -p&lt;br /&gt;
 Enter password:&lt;br /&gt;
 MariaDB [(none)]&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
Sollte hier eine Fehlermeldung &amp;quot;Access denied for user &#039;root&#039;@&#039;localhost&#039;&amp;quot; trotz richtigem Passwort erscheinen, muss man sich als root mit der Datenbank verbinden; also sudo mysql...&lt;br /&gt;
&lt;br /&gt;
Jetzt die Tabellenstruktur anlegen. &lt;br /&gt;
Hierfür kann die Datei /opt/fhem/contrib/dblog/db_create_mysql.sql als Vorlage verwendet und das Passwort und der Benutzername geändert werden. &lt;br /&gt;
 cd /opt/fhem/contrib/dblog/&lt;br /&gt;
 (sudo) nano db_create_mysql.sql&lt;br /&gt;
Dann wird die Datei eingelesen:&lt;br /&gt;
&lt;br /&gt;
 # (sudo) mysql -u root -p &amp;lt; db_create_mysql.sql&lt;br /&gt;
 Enter password:&lt;br /&gt;
 MariaDB [(none)]&amp;gt;  exit&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man den Zugang als fhemuser testen (eventuell muss der Befehl sudo mysql lauten): &lt;br /&gt;
&lt;br /&gt;
 # (sudo) mysql -p -u &amp;lt;fhemuser&amp;gt;&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 MariaDB [(none)]&amp;gt;  show databases;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis lautet&lt;br /&gt;
 MariaDB [(none)]&amp;gt; show databases;&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | Database           |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | fhem               |&lt;br /&gt;
 | information_schema |&lt;br /&gt;
 | mysql              |&lt;br /&gt;
 | performance_schema |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
&lt;br /&gt;
Nun müsste eine Datenbank &amp;quot;fhem&amp;quot; angezeigt werden.&lt;br /&gt;
Um die Tabellen zu sehen, kann man den folgenden Befehl eingeben: &lt;br /&gt;
&lt;br /&gt;
 MariaDB [(none)]&amp;gt; use fhem; show tables;&lt;br /&gt;
&lt;br /&gt;
und das Ergebnis lautet&lt;br /&gt;
 &lt;br /&gt;
 MariaDB [fhem]&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0.001 sec), &lt;br /&gt;
die die Tabellen current und history enthält.&lt;br /&gt;
&lt;br /&gt;
Nun in der Datei db.conf den mysql-Block auskommentieren und ebenfalls Benutzername, Passwort UND HOST anpassen. Leider ist hier nichts standardmäßig eingestellt.&lt;br /&gt;
 (sudo) nano /opt/fhem/contrib/dblog/db.conf&lt;br /&gt;
&lt;br /&gt;
Jetzt kann unter FHEM ein DbLog-Device angelegt werden (mit dem beispiel wird alles geloggt: &lt;br /&gt;
 define logdb DbLog ./contrib/dblog/db.conf .*:.*&lt;br /&gt;
Als State muss ein &amp;quot;connected&amp;quot; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Ein rereadcfg in FHEM stellt sicher, dass die neue Konfiguration übernommen wird - ein Neustart ist nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Nun kann die Funktion noch einmal überprüft werden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 # mysql -u &amp;lt;fhemuser&amp;gt; -p&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; use fhem;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0,00 sec)&lt;br /&gt;
 mysql&amp;gt; select * from history; # Achtung, kann sehr groß werden .... #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Abfragescript PHP/MySQL ==&lt;br /&gt;
Um eine schnelle Übersicht zu bekommen habe ich mir dieses Script geschrieben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php $pdo = new PDO(&#039;mysql:host=localhost;dbname=fhem&#039;, &#039;fhemuser&#039;, &#039;fhempasswort&#039;);&lt;br /&gt;
echo &#039;&amp;lt;h2&amp;gt;Tabelle Current&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Anzahl&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Readings&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
$sql = &amp;quot;SELECT COUNT(*), DEVICE, GROUP_CONCAT(DISTINCT READING ORDER BY READING DESC SEPARATOR &#039;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&#039;) FROM current GROUP BY DEVICE;&amp;quot;; foreach ($pdo-&amp;gt;query($sql) as&lt;br /&gt;
$row) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[0] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[1] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;quot; . $row[2] . &amp;quot;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &#039;&amp;lt;h2&amp;gt;Tabelle History&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Anzahl&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
$sql = &amp;quot;SELECT COUNT(*), DEVICE FROM history GROUP BY DEVICE;&amp;quot;; foreach ($pdo-&amp;gt;query($sql) as&lt;br /&gt;
$row) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[0] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row[1] . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitte passt fhemuser und fhempasswort an. Das Ganze kommt dann nach &#039;&#039;/var/www/html/fhemdb.php&#039;&#039; und ist mit &#039;&#039;&amp;lt;IP&amp;gt;/fhemdb.php&#039;&#039; aufrufbar. Wenn ihr den 2. Block für die history Tabelle ausklammert oder entfernt läuft das Script viel schneller ab - klar die history Tabelle ist meist randvoll.&lt;br /&gt;
&lt;br /&gt;
== Bearbeitung von Datenbank-Einträgen ==&lt;br /&gt;
{{Hinweis|Dieser Abschnitt soll lediglich eine kleine Einführung in die Datenbank-Bearbeitung liefern. Für vertiefende Informationen sollte man sich grundsätzlich mit SQL beschäftigen. Eine umfassende und gut verständliche Anleitung zu SQL bietet bspw. [http://www.w3schools.com/sql/default.asp w3schools].}}&lt;br /&gt;
Irgendwann wird der Fall eintreten, dass in der Datenbank Einträge drinstehen, die geändert oder gelöscht werden sollen (zB. fehlerhafte Sensor-Rückmeldungen, umbenannte Readings). In klassischen Log-Dateien würde man diese einfach bearbeiten und löschen/anpassen (wobei man aber tunlichst zuvor FHEM stoppt, um Datenfehler zu vermeiden). Eine Datenbank kann bearbeitet werden, ohne FHEM stoppen zu müssen. &lt;br /&gt;
&lt;br /&gt;
Datenbanken kann man ohne weitere Hilfsmittel direkt von der Kommandozeile/Shell aus bearbeiten. Alternativ gibt es auch verschiedenste Tools (webbasiert oder als Applikation), die einen dabei unterstützen (Bsp. findet man u.a. [https://wiki.ubuntuusers.de/SQLite/#Grafische-Benutzeroberflaechen hier]). Für einfache Arbeiten reicht allerdings idR. Shell.&lt;br /&gt;
&lt;br /&gt;
=== phpMyAdmin ===&lt;br /&gt;
Ein sehr beliebtes Tool ist phpMyAdmin. &lt;br /&gt;
 # apt-get install phpmyadmin&lt;br /&gt;
Bei der Installation wird man nach einem Passwort für den User &amp;quot;phpMyAdmin&amp;quot; gefragt, der im weiteren Verlauf erstmal nutzlos ist.&lt;br /&gt;
Nun kann man sich unter &amp;lt;meine-fhem-Domain&amp;gt;/phpMyAdmin mit der Seite verbinden.&lt;br /&gt;
Zum einloggen kann nun der in der config-datei angegebene fhemuser mit dem fhempasswort verwendet werden, oder, sofern ein Passwort vergeben ist, auch den User root. &lt;br /&gt;
Der Unterschied liegt darin, dass root *alle* Datenbanken sehen und ändern darf (was zum ändern von Datenbankeigenschaften sowie Benutzerkonten notwendig ist), während dem fhemuser nur die fhemdatenbank angezeigt wird(was für suchabfragen, deletes und inserts sowie Tabellenänderungen völlig ausreicht.&lt;br /&gt;
&lt;br /&gt;
== Datenbank migrieren ==&lt;br /&gt;
Eine schöne Anleitung zur Migration von SQLite zu MySQL/MariaDB mit Hilfe von [[DbRep - Reporting und Management von DbLog-Datenbankinhalten|DbRep]] findet sich hier: [https://demaya.de/fhem-umzug-sqlite-mysql-mariadb/].&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die SQLite-DB sehr groß wird, kann es sein, dass der oben beschriebene Weg nicht funktioniert (konkret war dies bei meiner 15 GB großen DB nicht möglich, der Prozess hat sich immer nach mehreren Stunden aufgehängt).&lt;br /&gt;
&lt;br /&gt;
== Nützliche Codeschnipsel ==&lt;br /&gt;
Anbei ein paar nützliche Codeschnipsel rund um DbLog&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateigrösse mitloggen ===&lt;br /&gt;
Da die Datenbank ins Unermessliche wachsen kann, empfiehlt es sich - je nach Speicherplatz - ab einer bestimmten Grösse tätig zu werden. Dazu muss diese Grösse allerdings ermittelt werden. &lt;br /&gt;
Zur Ermittlung der MariaDB-Größe kann wie [[DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Gr.C3.B6.C3.9Fe_der_FHEM-Datenbank_ermitteln | hier]] beschrieben vorgegangen werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Heizleistung_und_Gasverbrauch|Beispiel das DbLog-Daten für SVG-Plots verwendet]]&lt;br /&gt;
* [[SVG-Plots von FileLog auf DbLog umstellen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Logging]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=26903</id>
		<title>DevelopmentGuidelinesReadings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=26903"/>
		<updated>2018-06-05T06:43:47Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Neu Formulierung des &amp;quot;Important&amp;quot; Teils&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Deutsch=&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Auf dieser Seite werden Richtlinien für Readings gesammelt, welche in mehreren Modulen auftauchen können um eine Vereinheitlichung zu erreichen. Dadurch soll es Hilfsmodulen und Anwendern leichter fallen, mit den Werten der Readings zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
== Batterie-Readings ==&lt;br /&gt;
Basierend auf dieser {{Link2Forum|Topic=87575|LinkText=Diskussion}} haben sich die Entwickler für Readings, welche in Zusammenhang mit Batterien stehen auf folgendes geeinigt:&lt;br /&gt;
Es gibt &#039;&#039;&#039;nur&#039;&#039;&#039; diese drei Readings für den Batteriestatus:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
Wertebereich:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
das jeweilige Modul setzt &#039;&#039;&#039;nur&#039;&#039;&#039; die Readings, die es aus den aktuellen Daten vom Gerät bestimmen kann. Konkret: niemand kann sich darauf verlassen, welche der drei battery Readings vorhanden sind (es gibt nicht überall ein batteryState). Wenn das Gerät früher ein Percent gemeldet hat, aber in der letzten Nachricht nur state, dann wird das Percent Reading nicht angefasst. &lt;br /&gt;
&lt;br /&gt;
=English=&lt;br /&gt;
== Start ==&lt;br /&gt;
On this page you will find guidlines how to name common readings. These guidlines are for readings which are used in more than one module and should have the same possible values. This makes it helper modules and users easier, to work with the values from common readings.&lt;br /&gt;
&lt;br /&gt;
== Battery Reading ==&lt;br /&gt;
Based on this {{Link2Forum|Topic=87575|LinkText=discussion}} battery-readings should &#039;&#039;&#039;only&#039;&#039;&#039; be named like:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
The values should only be:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Important: The FHEM module will &#039;&#039;&#039;only&#039;&#039;&#039; report the values received from the device, i.e. not each module reports a batteryState reading. Additionally, if the device sent a batteryPercent value earlier but the last message from the device only contained a &#039;battery: low&#039;, the batteryPercent reading wont be changed. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=26900</id>
		<title>DevelopmentGuidelinesReadings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=26900"/>
		<updated>2018-06-04T16:57:42Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Erstellen der Seite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Deutsch=&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für Readings gesammelt werden, welche in mehreren Modulen auftauchen können um eine Vereinheitlichung zu erreichen. &lt;br /&gt;
&lt;br /&gt;
== Batterie-Readings ==&lt;br /&gt;
Basierend auf dieser {{Link2Forum|Topic=87575|LinkText=Diskussion}} hat man sich für Readings, welche in Zusammenhang mit Batterien stehen auf folgendes geeinigt:&lt;br /&gt;
Es gibt &#039;&#039;&#039;nur&#039;&#039;&#039; diese drei Readings für den Batteriestatus:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
Wertebereich:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
das jeweilige Modul setzt &#039;&#039;&#039;nur&#039;&#039;&#039; die Readings, die es aus den aktuellen Daten vom Gerät bestimmen kann. Konkret: niemand kann sich darauf verlassen, welche der drei battery Readings vorhanden sind (es gibt nicht überall ein batteryState). Wenn das Gerät früher ein Percent gemeldet hat, aber in der letzten Nachricht nur state, dann wird das Percent Reading nicht angefasst. &lt;br /&gt;
&lt;br /&gt;
=English=&lt;br /&gt;
== Start ==&lt;br /&gt;
On this page you will find guidlines how to name readings. These guidlines are for readings which will be used in more than one modul and should have the same possible values. &lt;br /&gt;
&lt;br /&gt;
== Battery Reading ==&lt;br /&gt;
Based on this {{Link2Forum|Topic=87575|LinkText=discussion}} battery-readings should &#039;&#039;&#039;only&#039;&#039;&#039; be named like:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
The values should only be:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Important: The modul &#039;&#039;&#039;only&#039;&#039;&#039; uses the values getting from the device. This means nobody can be sure which of the readings is used in the modul (there is not everywhere a batteryState reading). If the device did send batteryPercent befor and now only sends &#039;battery: low&#039;, the batteryPercent readings stays as it was before. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelines&amp;diff=26893</id>
		<title>DevelopmentGuidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelines&amp;diff=26893"/>
		<updated>2018-06-02T11:05:38Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Added batteryReadings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Wichtiger Hinweis&#039;&#039;: Diese Seite enthält die Ideen der fhem-Entwickler, wie fhem in einer künftigen Version funktionieren soll. Es beschreibt nicht den Zustand der aktuellen Umsetzung in den Release- oder den SVN-Versionen.&lt;br /&gt;
&lt;br /&gt;
==Definitionen==&lt;br /&gt;
TODO: Rudis kanonische Begriffe verwenden!&lt;br /&gt;
&lt;br /&gt;
===Allgemeines===&lt;br /&gt;
Die Version von fhem, in der diese Guidelines umgesetzt werden sollen, wird mit fhem-NEU bezeichnet. Mit fhem 4.x wird die aktuelle Architektur bezeichnet, die auch für fhem 5.x zutrifft. &lt;br /&gt;
&lt;br /&gt;
===Readings===&lt;br /&gt;
Ein Reading (Ablesewert) ist jeglicher Wert, Zustand, etc., der von einem Gerät ausgelesen werden kann. Beispiele dafür sind Messtemperatur, Luftfeuchtigkeit, Schaltzustand (an/aus), Firmwareversion, Empfangsstärke. &lt;br /&gt;
&lt;br /&gt;
=== I/O-Devices und Clients===&lt;br /&gt;
Um Readings durch fhem verarbeiten zu können, müssen die Daten erst über ein I/O-Device in den Rechner kommen. Beispiele: FHZ1300, CUL, CM11, M232.&lt;br /&gt;
&lt;br /&gt;
Ein I/O-Device ist über einen Port (Beispiel für Unix: /dev/ttyS0) oder einen Socket ansprechbar.&lt;br /&gt;
&lt;br /&gt;
Ein I/O-Device kann selbst ein Gerät sein, das Readings liefert (Beispiel: SCIVT, sowie die meisten anderen Schnittstellengeräte, wenn man die Geräteversion oder die Uptime mit zu den Readings zählt), oder die Readings von anderen Geräten (Clients) weiterleiten (Beispiel: FHZ1300).&lt;br /&gt;
&lt;br /&gt;
==Requests for Proposal==&lt;br /&gt;
===Aktualisierung der Readings===&lt;br /&gt;
====Aktive und passive Readings====&lt;br /&gt;
&lt;br /&gt;
Es sind zwei Arten von Readings zu unterscheiden:&lt;br /&gt;
# Readings, die vom Gerät aktiv mitgeteilt werden, entweder ad-hoc oder in regelmäßigen Zeitabständen (aktive Readings). Beispiele: measuredTemp bei FHT80B, wind bei KS300&lt;br /&gt;
# Readings, nach denen fhem die Geräte fragen muss (passive Readings). Beispiele: energyDay bei EM1010PC, counter bei M232, temperature bei OWTEMP&lt;br /&gt;
&lt;br /&gt;
Dasselbe Gerät kann sowohl aktive als auch passive Readings beinhalten. Bei Geräten mit aktiven Readings sind passive Readings meist Informationen wie Versionsnummer oder Uptime (CUL, CM11).&lt;br /&gt;
&lt;br /&gt;
Geräte, die mehrere verschiedene Readings haben, senden diese häufig im Batch an fhem (Beispiel: FHT80b, KS300). &lt;br /&gt;
&lt;br /&gt;
====Mechanismus für aktive Readings====&lt;br /&gt;
&#039;&#039;TODO: Mechanismus mit ParseFn, GetFn, Match usw. beschreiben (wie in fhem 4.x)!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Mechanismus für passive Readings====&lt;br /&gt;
Für passive Geräte gibt es eine Polling-Infrastruktur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status Quo in fhem 4.x:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Routine DEVICE_Define wird ein interner Timer gestartet, der die Updatefunktion aufruft. INTERVAL ist die Periode in Sekunden.&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 DEVICE_Define($$) {&lt;br /&gt;
 ...&lt;br /&gt;
 InternalTimer(gettimeofday()+$hash-&amp;gt;{INTERVAL}, &amp;quot;DEVICE_GetUpdate&amp;quot;, $hash, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
In der Routine DEVICE_GetUpdate werden dann die Readings vom Gerät geholt und der Timer wird mit dem gleichen Befehl erneut gestartet.&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 DEVICE_GetUpdate($$) {&lt;br /&gt;
 ...&lt;br /&gt;
 # start internal timer; do it at the beginning to achieve equal intervals no matter how long it takes to gather data&lt;br /&gt;
 InternalTimer(gettimeofday()+$hash-&amp;gt;{INTERVAL}, &amp;quot;DEVICE_GetUpdate&amp;quot;, $hash, 1);&lt;br /&gt;
 # gather data&lt;br /&gt;
 ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der letzte Paramater 0 oder 1 ist waitIfInitNotDone.&lt;br /&gt;
&lt;br /&gt;
Fragen:&lt;br /&gt;
* Kann/soll dieses Verfahren in einem Modul gekapselt werden? Geräte melden sich dann an der Polling-Infrastruktur an. Wenn ja, wie?&lt;br /&gt;
* Wie wird waitIfInitNotDone korrekt eingesetzt? &lt;br /&gt;
&lt;br /&gt;
====Mechanismus für langsame Readings====&lt;br /&gt;
&#039;&#039;&#039;Problemstellung:&#039;&#039;&#039; Längere Verarbeitungsprozesse in einzelnen Modulen (z.B. aufgrund von Netzwerklatenzen oder toten Geräten) halten fhem komplett an und verhindern die Verarbeitung von Events.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lösung:&#039;&#039;&#039; Multiprocessing&lt;br /&gt;
&lt;br /&gt;
Beim Multiprocessing wird der fhem-Prozess geforkt, wenn ein Reading vom Gerät eingelesen werden soll. Der Vaterprozess wird sofort fortgesetzt und erledigt weitere Aufgaben. Der Kindprozess holt die Readings vom Gerät, liefert sie an den Vaterprozess und verendet.&lt;br /&gt;
&lt;br /&gt;
Die Lieferung des Resultats an den Vaterprozess erfolgt durch eine Loopback Verbindung zu fhem via localhost.&lt;br /&gt;
&lt;br /&gt;
Dieser Mechanismus wurde durch Rudolf König in ein entsprechendes Modul verpackt, so dass jedes andere FHEM-Modul diese Möglichkeiten direkt nutzen kann. Eine nähere Erklärung sowie eine Anleitung dazu findet man in dem Artikel → [[Blocking Call]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fragen&#039;&#039;&#039;:&lt;br /&gt;
* Soll es diesen Mechanismus nur passive Readings geben oder gibt es Anwendungsfälle für aktive Readings? &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verworfene Alternative&#039;&#039;&#039;: Multithreading&lt;br /&gt;
&lt;br /&gt;
Argumente gegen Multithreading:&lt;br /&gt;
* Wird praktisch auf keiner kleinen Plattform unterstützt.&lt;br /&gt;
* Negative Erfahrungen (z.B. Probleme bei vielen 3rd-party-Komponenten)&lt;br /&gt;
* Kaum Programmiererfahrung mit Multithreading in Perl.&lt;br /&gt;
&lt;br /&gt;
==Verabschiedete Richtlinien==&lt;br /&gt;
===Zeichensatz===&lt;br /&gt;
Alle nach aussen sichtbaren Werte sind in der Zeichenkodierung ASCII (Codes 32..127). Dies vermeidet Konvertierungsprobleme bei der Bearbeitung des Quellcodes, bei der Ausgabe durch Perl, beim Transport in Internet-Protokollen und bei der Darstellung im Frontend/GUI. &lt;br /&gt;
&lt;br /&gt;
===Klassifizierung der Attribute===&lt;br /&gt;
Die Attribute eines Moduls werden in logische Klassen (Rubriken) eingeteilt. &lt;br /&gt;
&lt;br /&gt;
====Sinn und Zweck====&lt;br /&gt;
Die Rubriken helfen...&lt;br /&gt;
* zu sortieren, welche Attribute bei (xml)list gezeigt werden und welche nicht,&lt;br /&gt;
* zu definieren, welche Werte per save in die Sicherung kommen und welche nicht,&lt;br /&gt;
* zu vereinbaren, welche Änderungen ein notify auslösen und welche nicht,&lt;br /&gt;
* zu definieren, wie ein Attribut im $hash-&amp;gt;{} abgelegt wird (in $hash-&amp;gt;{}, $hash-&amp;gt;{READINGS}, $hash-&amp;gt;{INTERNALS}, ...),&lt;br /&gt;
* zu gliedern, welche Namenskonventionen jeweils für Attribute verwendet werden (Kleinbuchstaben, Großbuchstaben, CamelCaps, ...),&lt;br /&gt;
* abzugrenzen, wo der Entwickler sich an Vorgaben halten muss (z.B. bei System Internals) und wo er frei ist, Attribute zu erfinden oder wegzulassen, und&lt;br /&gt;
* festzulegen, wo bzgl. der Inhalte Standards notwendig sind und wo nicht (z.B. bei &amp;quot;Logical Readings&amp;quot;, wenn diese im GUI angezeigt werden sollten). &lt;br /&gt;
&lt;br /&gt;
====Logische Rubriken====&lt;br /&gt;
Die folgenden Rubriken stellen eine sehr feine Einteilung dar:&lt;br /&gt;
* System Internals: werden vom Framework (fhem.pl) benötigt/verwendet/erkannt, z.B. NAME, NR, CHANGED &lt;br /&gt;
* Device Readings: Rohdaten, die vom physischen Gerät ausgelesen werden (nicht interpretiert), z.B. rain_raw (Wippenschläge des Regensensors) in KS300&lt;br /&gt;
* Hilfsvariablen: z.B. rain_raw_adj (rain_raw, jedoch bereinigt um die bei einigen KS300 auftretenden erratischen Sprünge) in KS300, Zwischenergebnisse von Daten/Werten, die zur Mittelwertberechnung benötigt werden&lt;br /&gt;
* Logical Readings: ausgewertete Messdaten und Zustände, z.B. Temperatur, Niederschlag (nicht als Wippenschläge sondern in l/qm)&lt;br /&gt;
* Derived Readings: aus den Messdaten abgeleitete Werte, z.B. durchschnittliche Temperatur der laufenden Woche, Niederschlagsmenge des Tages&lt;br /&gt;
* Physical Device Parameter: z.B. Modell oder Housecode und Unitcode bei X10 oder die Sensornummer beim BS (brightness sensor)&lt;br /&gt;
* Logical Device Parameter: statische Werte, die als Grundlage für Berechnungen genutzt werden, z.B. Korrekturfaktoren bei den Energiemessgeräten, die Tankgeometrie beim USF1000&lt;br /&gt;
* Messages: alle Nachrichten, die das Gerät betreffen, z.B. &amp;quot;AVG_Month erfolgreich berechnet&amp;quot;, &amp;quot;Script XYZ am xx.xx.xx gestartet&amp;quot;, LastIODEV, LastRAWMSG&lt;br /&gt;
* Trigger: wenn Trigger direkt am Gerät hinterlegt werden, müssen nicht mehr alle Notifies durchsucht werden, sondern es kann das Modul direkt ermitteln, ob ein Notify ausgelöst wird. &lt;br /&gt;
&lt;br /&gt;
====Ablage im Programm====&lt;br /&gt;
Programmtechnisch werden die Attribute eines Moduls so in Behältern abgelegt, dass folgende Kriterien erfüllt sind:&lt;br /&gt;
* Die Aufteilung ist möglichst einfach/minimalistisch.&lt;br /&gt;
* Anhand des Behälters lässt sich entscheiden,&lt;br /&gt;
** ob die Werte der darin enthaltenen Attribute über das Programmende hinaus gespeichert oder nicht gespeichert werden,&lt;br /&gt;
** welchen Anzeigestandards oder Programmierstandards die darin enthaltenen Attribute entsprechen, und&lt;br /&gt;
** ob es sich um fhem-interne Attribute, Readings oder Hilfsvariablen handelt. &lt;br /&gt;
&lt;br /&gt;
Es gibt folgende Behälter:&lt;br /&gt;
&lt;br /&gt;
readings&lt;br /&gt;
* Logische Rubrik: Device Reading, Logical Reading, Derived Reading&lt;br /&gt;
* Wird gespeichert&lt;br /&gt;
* Alle vom Gerät gelieferten bzw. berechneten Werte, die den Endanwender interessieren. Keine Rohdaten vom Gerät, die erst interpretiert werden müssen (Wippenschläge beim Regensensor).&lt;br /&gt;
* Alle Daten haben einen Wert und ein Zeitstempel&lt;br /&gt;
* Beispiele: &lt;br /&gt;
 $defs{Lampe}{readings}{switchedTo}{value} = &amp;quot;on&amp;quot;; $defs{Lampe}{readings}{switchedTo}{time} = &amp;quot;2010-03-29 23:32:26&amp;quot;&lt;br /&gt;
 $defs{FHToben}{readings}{measuredTemp}{value} = &amp;quot;23&amp;quot;; $defs{FHToben}{readings}{switchedTo}{time} = &amp;quot;2010-03-29 21:58:36&amp;quot;&lt;br /&gt;
&lt;br /&gt;
helper&lt;br /&gt;
* Logische Rubrik: Hilfsvariable, Device Reading&lt;br /&gt;
* Wird nicht gespeichert&lt;br /&gt;
* Alle Werte, die für den Endanwender nicht direkt sinnvoll sind aber vom Modul für unterschiedliche Zwecke benötigt werden. Kann auch rohe Readings enthalten.&lt;br /&gt;
* Beispiele: &lt;br /&gt;
&lt;br /&gt;
 $defs{ks300}{helper}{cumMonth} = &amp;quot;23 T: 131.4  H: 816  W: 775.1  R: -651.1&amp;quot;&lt;br /&gt;
 $defs{emwz}{helper}{basis} = &amp;quot;4776493&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fhem&lt;br /&gt;
* Logische Rubrik: System Internals, Physical Device Parameter, Logical Device Parameter&lt;br /&gt;
* Wird nicht gespeichert&lt;br /&gt;
* Alle Geräte-Werte, die nicht gespeichert werden müssen, weil entweder berechnet, oder aus der Definition hervorgehen.&lt;br /&gt;
* Beispiele &lt;br /&gt;
&lt;br /&gt;
 $defs{emwz}{fhem}{def} = &amp;quot;1 75 900&amp;quot; &lt;br /&gt;
 $defs{emwz}{fhem}{lastIODev} = &amp;quot;CUL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Verworfener Behälter STATE&lt;br /&gt;
* Logische Rubrik: Device Reading, Logical Reading, Derived Reading&lt;br /&gt;
* Wird gespeichert&lt;br /&gt;
* Kurze(!) Zusammenfassung der wichtigsten Information des Geräts. Was man in einer Übersicht über die Geräte sehen möchte, z.B. eine Warnung oder die aktuelle Temperatur beim FHT80 oder der Zeitpunkt der letzten Aktivierung beim PIRI. Falls es das nicht gibt, dann einheitlich &amp;quot;defined&amp;quot;. GGf. über Attribute am Modul steuerbar. Eigentlich ist es kein Behälter im üblichen Sinne, da es keine Untereinheiten hat. &lt;br /&gt;
&lt;br /&gt;
Der Behälter wurde verworfen, weil er redundant ist, an sich gar kein Behälter, und einfacher und flexibler über einen Verweis auf das Reading realisiert werden kann, der per Default angezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
====Status====&lt;br /&gt;
Kurze Zusammenfassung der wichtigsten Information des Geräts. Was man in einer Übersicht über die Geräte sehen möchte, z.B. eine Warnung oder die aktuelle Temperatur beim FHT80 oder der Zeitpunkt der letzten Aktivierung beim PIRI. Falls es sowas nicht gibt, dann einheitlich &amp;quot;defined&amp;quot;. Modulseitig gibt es einen Default, der auf das relevante Reading verweist. Dieser ist über das Attribut defaultReading am individuellen Gerät steuerbar.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Definition in der Konfigurationsdatei: attr myDevice defaultReading measuredTemp Verwendung im Code:&lt;br /&gt;
&lt;br /&gt;
 $defs{myDevice}{readings}{$attr{defaultReading}}&lt;br /&gt;
&lt;br /&gt;
Die logischen Rubriken Messages und Trigger wurden noch nicht diskutiert. &lt;br /&gt;
&lt;br /&gt;
===Bezeichnungen===&lt;br /&gt;
Verwendung von lowerCamelCaps für alle vom Modul nach aussen sichtbaren Bezeichner: a) die Bezeichnungen der Behälter für Readings, Fhem und Helper und der Untereinträge, b) die Bezeichnungen der Readings, c) die Bezeichnungen der Attribute.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 $defs{myFHT}{readings}{measuredTemp}{time}&lt;br /&gt;
&lt;br /&gt;
===Readings===&lt;br /&gt;
====Standardisierung der Readings====&lt;br /&gt;
Die Readings werden standardisiert, indem Geräteklassen gebildet werden wie in DevelopmentInterfaces beschrieben. Die Definition der Interfaces ist explizit nicht Gegenstand dieser Entscheidungsvorlage und wird weiterentwickelt und angepasst, wie es sich bei der Entwicklung von fhem-NEU ergibt.&lt;br /&gt;
Struktur im Code&lt;br /&gt;
&lt;br /&gt;
Zu jedem Reading gibt es die folgenden Unterbehälter:&lt;br /&gt;
* value: Wert der Messgröße&lt;br /&gt;
* time: Zeitpunkt, zu dem der Wert ermittelt wurde &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 $defs{myFHT}{readings}{measuredTemp}{time}= timestamp;&lt;br /&gt;
 $defs{myFHT}{readings}{measuredTemp}{value}= 23.5;&lt;br /&gt;
&lt;br /&gt;
Readings enthalten grundsätzlich genau einen Wert und diesen ohne Einheit.&lt;br /&gt;
&lt;br /&gt;
====Einheitendarstellung====&lt;br /&gt;
Die verwendete Einheit für ein Reading ergibt sich aus der Interfacespezifikation.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Gerät ist ein Thermometer =&amp;gt; es gibt ein Reading &amp;quot;temperature&amp;quot; und dessen Einheit ist immer °C oder Celsius&lt;br /&gt;
&lt;br /&gt;
Verworfene Alternative:&lt;br /&gt;
* Einheit ergibt sich aus der Dokumentation&lt;br /&gt;
* Einheit ergibt sich aus einem expliziten Untereintrag $defs{deviceName}{readings}{theReading}{unit}=&amp;quot;°C&amp;quot;&lt;br /&gt;
* Einheit ergibt sich aus Festlegung gemäß &amp;quot;FHEM-Standard&amp;quot;, z.B. immer SI-Einheiten, Temperaturen in Celsius, etc.&lt;br /&gt;
&lt;br /&gt;
====BatteryReadings====&lt;br /&gt;
Es gibt &#039;&#039;&#039;nur&#039;&#039;&#039; diese drei Readings für den Batteriestatus:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
Wertebereich:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
das jeweilige Modul setzt &#039;&#039;&#039;nur&#039;&#039;&#039; die Readings, die es aus den aktuellen Daten vom Geraet bestimmen kann. Konkret: niemand kann sich darauf verlassen, welche der drei battery Readings vorhanden sind (es gibt nicht überall ein batteryState). Wenn das Gerät früher ein Percent gemeldet hat, aber in der letzten Nachricht nur state, dann wird das Percent Reading nicht angefasst.&lt;br /&gt;
Aktuell wird noch diskutiert, was mit dem Reading für Laden ist. Mehr dazu hier:  {{Link2Forum|Topic=87575|Message=62960|LinkText=Beitrag im FHEM Forum}}&lt;br /&gt;
&lt;br /&gt;
===Zeitdarstellung in fhem===&lt;br /&gt;
Zeiten werden im Programm grundsätzlich immer maschinenlesbar abgelegt, also sowohl in $defs{deviceName}{readings}{time} als auch z.B. bei der Speicherung des Zeitpunkts der Ausführung des nächsten at-Kommandos.&lt;br /&gt;
&lt;br /&gt;
Es gibt übergreifende Hilfsfunktionen, die die maschinenlesbare in eine menschenlesbare Darstellung umwandeln.&lt;br /&gt;
&lt;br /&gt;
Argumente für maschinenlesbar:&lt;br /&gt;
* vereinfacht Datumsarithmetik, z.B. die Berechnung der Zeitdauer zwischen zwei Ereignissen&lt;br /&gt;
* kann vom Frontend in die regionale Darstellung des Anwenders übersetzt werden&lt;br /&gt;
* hat keine Probleme mit doppelt auftretenden Zeitpunkten bei der Umstellung von Sommer- auf Winterzeit &lt;br /&gt;
&lt;br /&gt;
Folgende Zeitdarstellungen werden ausschliesslich verwendet:&lt;br /&gt;
&lt;br /&gt;
A. Zahl der Sekunden seit der Unix-Epoche (was time liefert); auch wenn time eine Ganzzahl liefert, muss der Verwender damit rechnen, eine Gleitkommazahl vorzufinden. Das ist z.B. dann der Fall, wenn für die Zeitbestimmung höher auflösende Funktionen (z.B. Time::HiRes) zum Einsatz kamen und Sekundenbruchteile mitgespeichert wurden.&lt;br /&gt;
&lt;br /&gt;
Hinweis zu potentiellen Problemen:&lt;br /&gt;
* Ab perl 5.12 ist das Jahr-2038-Problem in Perl beseitigt.&lt;br /&gt;
* Ab Mac OS X liefert time auch auf Macs die Zahl der Sekunden seit der Unix-Epoche (statt seit Anfang 1904) &lt;br /&gt;
&lt;br /&gt;
B. ISO8601 mit optionaler Zeitzonenangabe, wobei bei fehlender Zeitzone die lokale Zeitzone des fhem-Servers gilt&lt;br /&gt;
&lt;br /&gt;
Die Zeitdarstellungen werden wie folgt verwendet:&lt;br /&gt;
* Zur Programmlaufzeit in Variablen immer A&lt;br /&gt;
* In Konfigurationsdateien (fhem.conf, fhem.save) immer B&lt;br /&gt;
* In Logs, die für den Menschen bestimmt sind, B&lt;br /&gt;
* In Logs, die für die Maschine bestimmt sind, also z.B. bei Weiterverarbeitung in einem GUI, A&lt;br /&gt;
* In Listen (list, xmllist friendly), die für den Menschen bestimmt sind, B&lt;br /&gt;
* In Listen (xmllist), die für die Maschine bestimmt sind, also z.B. bei Weiterverarbeitung in einem GUI, A &lt;br /&gt;
&lt;br /&gt;
Die Unterscheidung bei den Logs ist noch zu diskutieren.&lt;br /&gt;
&lt;br /&gt;
Hinweise zu gnuplot:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set timefmt &#039;%Y-%m-%dT%H:%M:%S&#039; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(ISO8601) funktioniert, und zwar unabhängig davon, ob die optionale Zeitzonenangabe anhängt oder nicht (getestet mit Gnuplot v4.2 pl3). Für die Sekunden seit der Unix-Epoche:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set timefmt &#039;%s&#039; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(nicht getestet). &lt;br /&gt;
&lt;br /&gt;
==Allgemeine Dokumentation==&lt;br /&gt;
===Events, Filter, Notify===&lt;br /&gt;
====Event====&lt;br /&gt;
Ein Event tritt ein, wenn ein oder mehrere Readings eines Geräts aktualisiert werden, weil z.B. ein Datagramm empfangen oder zeitgesteuert Werte eingelesen wurden. Es wird durch drei Angaben&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(device, timestamp, { reading1, ..., readingN } )&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
beschrieben:&lt;br /&gt;
* das Gerät device&lt;br /&gt;
* der Zeitpunkt der Aktualisierung timestamp&lt;br /&gt;
* die Menge der N&amp;gt;= 1 geaenderten Readings reading1, .. readingN &lt;br /&gt;
&lt;br /&gt;
Wenn N&amp;gt; 1, dann handelt es sich um ein Sammelevent, wie es z.B. von KS300 generiert wird. &lt;br /&gt;
&lt;br /&gt;
====Filter====&lt;br /&gt;
Ein Filter filtert Events. Er hat die Form&lt;br /&gt;
&lt;br /&gt;
 deviceNamePattern&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
 deviceNamePattern:readingNamePattern &lt;br /&gt;
&lt;br /&gt;
Ein Filter passt auf ein Event, wenn deviceNamePattern den Namen des device matcht und, sofern vorhanden, readingNamePattern mindestens irgendeinen Namen von reading1 bis readingN matcht.&lt;br /&gt;
&lt;br /&gt;
====Mechanismus====&lt;br /&gt;
0. Für das Gerät device namens deviceName wird ein Datagramm empfangen oder es werden zeitgesteuert Werte eingelesen.&lt;br /&gt;
&lt;br /&gt;
1. Die Readings werden aktualisiert. Für X= 1..N:&lt;br /&gt;
&lt;br /&gt;
 $defs{deviceName}{readings}{readingX}{value}= valueX;&lt;br /&gt;
 $defs{deviceName}{readings}{readingX}{time}= timestamp;&lt;br /&gt;
&lt;br /&gt;
2. Das Event wird erstellt und an DoTrigger übergeben.&lt;br /&gt;
&lt;br /&gt;
3. DoTrigger informiert zunächst alle Clients mit inform-Wunsch.&lt;br /&gt;
&lt;br /&gt;
4. Das Event wird sodann von DoTrigger nacheinander an alle NotifyFn in der alphabetischen Reihenfolge der Gerätenamen gereicht. Darunter auch jene von Logs.&lt;br /&gt;
&lt;br /&gt;
5. Wenn der Filter des Logs auf das Event passt, wird ein Log-Eintrag der Form&lt;br /&gt;
&lt;br /&gt;
 timestamp deviceName reading1: value1 reading2: value2 ... readingN: valueN&lt;br /&gt;
&lt;br /&gt;
erzeugt. &lt;br /&gt;
&lt;br /&gt;
==Zurückgestellte Entscheidungen==&lt;br /&gt;
===Attribute vs. Internals===&lt;br /&gt;
Die Unterscheidung zwischen Attributen und Internals ist nicht eindeutig. Manche define-Parameter sind optional, und man kann define-Parameter mit &amp;quot;modify&amp;quot; ändern. Insofern könnte man theoretisch einen der beiden Verfahren (modify vs. attribute) ablösen.&lt;br /&gt;
&lt;br /&gt;
1. Idee: define-Parameter dürfen nachträglich nicht geändert werden, auch wenn es sich um optionale Parameter handelt =&amp;gt; nicht-modifizierbare Internals&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
* define-Parameter sind elementar für den Betrieb des Geräts und können nicht sinnvoll zur Programmlaufzeit geändert werden (z.B. Hauskode bei X10, FHTId bei FHT80b)&lt;br /&gt;
* Aus den define-Parametern werden bei der Initialisierung des Geräts weitere Helper und Internals abgeleitet und gespeichert. Eine nachträgliche Änderung zieht Änderungen der Helper und Internals nach sich mit ggf. schwer durchschaubaren Nebeneffekten (z.B. corr1..corr4 bei EM, rainadjustment bei KS300). Auch die Logs ändern sich nicht nachträglich. &lt;br /&gt;
&lt;br /&gt;
Contras:&lt;br /&gt;
* Man will nicht ein Gerät löschen und neu anlegen, wenn es ausgetauscht wird.&lt;br /&gt;
* modify sollte bleiben, weil es nützlich ist. &lt;br /&gt;
&lt;br /&gt;
2. Idee: Attribute enthalten Werte, die ohne Nebeneffekte zur Laufzeit geändert werden können, weil sie z.B. ad-hoc ausgewertet werden.&lt;br /&gt;
* follow-on-for-timer&lt;br /&gt;
* retrycount&lt;br /&gt;
* lazy &lt;br /&gt;
&lt;br /&gt;
3. Idee: Attribute beinhalten geräteunabhängige Meta-Informationen:&lt;br /&gt;
* room&lt;br /&gt;
* defaultReading &lt;br /&gt;
&lt;br /&gt;
Contras:&lt;br /&gt;
* Nach 2. und 3. müsste &lt;br /&gt;
&lt;br /&gt;
 attr my_at disabled&lt;br /&gt;
&lt;br /&gt;
doch zu Definition gehoeren. Und &amp;quot;skip_next&amp;quot; auch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spezialitäten&lt;br /&gt;
* beim FS20 bleibt alles, wie es ist, also model als Attribut, was Auswirkung auf die möglichen set Befehle hat.&lt;br /&gt;
* 1wire setzt nach define das model Attribut, lässt aber eine Änderung nicht zu, oder wenn doch, dann muss sich dementsprechend verhalten, es macht ja evtl. Sinn es zu ändern. Was machbar ist, entscheidet der Modul-Author. &lt;br /&gt;
&lt;br /&gt;
Damit ist &amp;quot;model&amp;quot; immer ein Attribut.&lt;br /&gt;
&lt;br /&gt;
Fazit&lt;br /&gt;
&lt;br /&gt;
Da es keine überzeugende Alternative zum Ist-Zustand in fhem 4.x gibt, wird b.a.w. nicht hierüber entschieden. &lt;br /&gt;
&lt;br /&gt;
===notify===&lt;br /&gt;
Die Frage, ob der notify-Mechanismus, der weiter oben dokumentiert ist, aus Performancegründen optimiert werden sollte, ist offen.&lt;br /&gt;
&lt;br /&gt;
In fhem 4.x bekommt jedes Gerät mit NotifyFn jedes Event mit. Alternativ könnte sich ein Gerät als EventListener mit einem Filter bei fhem anmelden. Dann könnten die Events nur an die NotifyFn verteilt werden, für die es ein Match auf den Filter gaebe.&lt;br /&gt;
&lt;br /&gt;
Der Punkt wurde zurückgestellt, bis nachgewiesen ist, dass sich aus dieser Vorgehensweise relevante Auswirkungen auf die Systemlast ergeben. &lt;br /&gt;
&lt;br /&gt;
==Entscheidungen==&lt;br /&gt;
;E1&lt;br /&gt;
:Es werden die Container fhem, readings und helper verwendet.&lt;br /&gt;
;E2&lt;br /&gt;
:Es wird ein Attribut defaultReading verwendet.&lt;br /&gt;
;E3&lt;br /&gt;
:Verwendung von lowerCamelCaps für a) die Bezeichnungen der Behälter für Readings, Fhem und Helper und der Untereintraege, b) die Bezeichnungen der Readings, c) die Bezeichnungen der Attribute.&lt;br /&gt;
;E4&lt;br /&gt;
:Verwendung von value und time.&lt;br /&gt;
;E5&lt;br /&gt;
:Zeitdarstellung im Programm grundsätzlich maschinenlesbar&lt;br /&gt;
;E6&lt;br /&gt;
:Zulässige Zeitdarstellungen&lt;br /&gt;
* Sekunden seit der Unix-Epoche&lt;br /&gt;
* ISO8601 mit optionaler Zeitzonenangabe&lt;br /&gt;
ISO8601 mit _ statt T war nicht mehrheitsfähig.&lt;br /&gt;
;E7&lt;br /&gt;
:Verwendung der Zeitdarstellungen&lt;br /&gt;
;E8&lt;br /&gt;
:Readings enthalten grundsätzlich genau einen Wert und diesen ohne Einheit.&lt;br /&gt;
;E9&lt;br /&gt;
:Einheiten ergeben sich aus der Interfacespezifikation.&lt;br /&gt;
;E10&lt;br /&gt;
:Entscheidung für ASCII&lt;br /&gt;
;E11&lt;br /&gt;
:Die Readings werden standardisiert, indem Geräteklassen gebildet werden wie in DevelopmentInterfaces beschrieben. Die Definition der Interfaces ist explizit nicht Gegenstand dieser Entscheidungsvorlage und wird weiterentwickelt und angepasst, wie es sich bei der Entwicklung von fhem-NEU ergibt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development (Archive)]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat&amp;diff=23477</id>
		<title>HM-CC-RT-DN Funk-Heizkörperthermostat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat&amp;diff=23477"/>
		<updated>2017-12-08T07:18:37Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Temperatursensoren */ -&amp;gt; Hinweis auf cycliMsgOffset Attr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-CC-RT-DN.jpg&lt;br /&gt;
|Bildbeschreibung=HM-CC-RT-DN an Heizkörper montiert&lt;br /&gt;
|HWProtocol=[[HomeMatic]]&lt;br /&gt;
|HWType=[[HomeMatic Type Thermostat|thermostat]]&lt;br /&gt;
|HWCategory=[[:Kategorie:Heizungsventile|Heizungsventile]]&lt;br /&gt;
|HWComm=868 MHz&lt;br /&gt;
|HWChannels=6&lt;br /&gt;
|HWVoltage=3&amp;amp;nbsp;V&lt;br /&gt;
|HWPowerConsumption=180&amp;amp;nbsp;mA&lt;br /&gt;
|HWPoweredBy=2x LR6/Mignon/AA&lt;br /&gt;
|HWSize=54x65x93 mm (BxHxT)&lt;br /&gt;
|HWDeviceFHEM=[[CUL_HM]]&lt;br /&gt;
&amp;lt;!-- |ModOwner=  --&amp;gt;&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HM-CC-RT-DN&#039;&#039;&#039; (häufig einfach &#039;&#039;&#039;RT&#039;&#039;&#039; genannt) ist ein Funk-&#039;&#039;Heizkörperthermostate&#039;&#039; mit integriertem &#039;&#039;Stellantrieb&#039;&#039;. Das Thermostat ist seit September&amp;amp;nbsp;2013 verfügbar und ist der Nachfolger des [[HM-CC-VD Funk-Stellantrieb]]s.&lt;br /&gt;
&lt;br /&gt;
== Vorbemerkungen ==&lt;br /&gt;
: &#039;&#039;→ Einstellungen und Informationen, die alle [[HomeMatic]] Thermostate betreffen, sind unter [[HomeMatic Type Thermostat#Temperaturlisten|HomeMatic Type Thermostat]] zu finden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der HM-CC-RT-DN kann die Temperatur selbst messen (im Gegensatz zum [[HM-CC-VD Funk-Stellantrieb|Vorgänger]]) und verfügt über eine Fenster-Offen-Erkennung sowie eine Boost-Funktion. Der HM-CC-RT-DN &#039;&#039;kann&#039;&#039; von einem [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP]] gesteuert werden, das ist aber &#039;&#039;optional&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Gerät wird seit Anfang Oktober 2013 von FHEM unterstützt (siehe Diskussion im {{Link2Forum|Topic=14738|LinkText=Forum}}).&lt;br /&gt;
&lt;br /&gt;
Der HM-CC-RT-DN scheint das erste HomeMatic-Device zu sein, bei dem ein Update der Firmware auch vom Anwender durchgeführt werden kann. Ein Firmware-Update erfordert einen [[HM-CFG-USB_USB_Konfigurations-Adapter|USB Konfigurations-Adapter]] und eine auf der eQ-3 Webseite herunterladbare Firmwareupdate-Software. Weitere Details sind unter [[#Firmware Update|Firmware Update]] beschrieben.&lt;br /&gt;
{{Hinweis|Die Solltemperaturen eines HM-CC-RT-DN lassen sich &#039;&#039;nicht&#039;&#039; durch einen [[HM-CC-TC Funk-Wandthermostat]] &#039;&#039;steuern&#039;&#039;. Dieser kann nur die Ist-Temperatur an den HM-CC-RT-DN weitergeben, damit nicht die am HM-CC-RT-DN direkt gemessene Raumtemperatur zur Regelung verwendet wird.}}&lt;br /&gt;
Mit einem HM-CC-RT-DN können maximal (neben der Zentrale/FHEM):&lt;br /&gt;
* 7 HomeMatic Heizkörperthermostate&lt;br /&gt;
* 8 HomeMatic Tür-Fensterkontakte / Fenster-Drehgriffkontakte&lt;br /&gt;
* 8 Tastenpaare von HomeMatic Fernbedienungen bzw. Display-Wandtaster&lt;br /&gt;
* 1 HomeMatic Innen-Temperatur-Sensor&lt;br /&gt;
[[Peering (HomeMatic)|gepeert]] werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wird für Wartungs-/Umbaumaßnahmen das Wasser der Heizung abgelassen bzw. diese neubefüllt, sind alle Stellantriebe manuell dauerhaft auf &#039;&#039;&#039;on&#039;&#039;&#039; zu setzen: set &amp;lt;HM_Stellantrieb&amp;gt;_Clima controlManu on. Beim Einsatz eines Wandthermostaten ist der Wandthermostat entsprechend einzustellen.}}&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
* Betriebsspannung: 2 Stck. 1,5V LR6/Mignon/AA&lt;br /&gt;
* Stromaufnahme: 180 mA max.&lt;br /&gt;
* Abmessungen (B x H x T): 54 x 65 x 93 mm&lt;br /&gt;
* Gewicht: 180 g (ohne Batterien)&lt;br /&gt;
* Ventilanschluss: M30 x 1,5 mm&lt;br /&gt;
&lt;br /&gt;
Aktuelle Firmware: 1.4&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit FHEM ==&lt;br /&gt;
Der Funk-Heizkörperthermostat muss zuerst mit FHEM [[Pairing (HomeMatic)|gepairt]] werden. Stellen Sie sicher, dass FHEM aktuell ist (update durchführen)&lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden &lt;br /&gt;
&lt;br /&gt;
=== Channels (Kanäle) ===&lt;br /&gt;
==== Channel (Kanal) 01 _Weather ====&lt;br /&gt;
&lt;br /&gt;
Dieser Kanal dient zur Einspeisung der (gemessenen) &#039;&#039;Ist-Temperatur&#039;&#039;. Als Sensor können zum Beispiel das [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP|HM-TC-IT-WM-W-EU Funk-Wandthermostat]] oder ein [[HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen (IT)|HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor]] dienen.&lt;br /&gt;
&lt;br /&gt;
Ein Temperatur-Sensor &#039;&#039;tempSensor&#039;&#039; kann mit dem &#039;&#039;_Weather&#039;&#039;-Kanal wie folgt [[Peering (HomeMatic)|gepeert]] werden: &lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Weather peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_Weather single set&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  set EG_Buero_WANDTHERMOSTAT_Weather peerChan 0 EG_Buero_THERMOSTAT_Weather single set&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: Das Wandthermostat sowie das Thermostat Ventil (Beispiel &amp;quot;EG_Buero_WANDTHERMOSTAT&amp;quot; und EG_Buero_THERMOSTAT) werden vorher in FHEM den Status &amp;quot;CMDs_done&amp;quot; anzeigen.&lt;br /&gt;
Beim peerChan wird dann bei beiden &amp;quot;CMDs_pending&amp;quot; stehen. Wobei das Wandthermostat sehr schnell wieder auf CMDs_done zurück springt.&lt;br /&gt;
Allerdings ist dingend darauf zu achten, dass das Thermostat Ventil auch wieder auf  &amp;quot;CMDs_done&amp;quot; wechselt, bevor man den nächsten Befehl absendet.&lt;br /&gt;
Das Heizkörper Ventile kann unter umständen 3 bis 5 min benötigen bis wieder &amp;quot;CMDs_done&amp;quot; steht. Evtl. kann man dies durch die BOOST Taste beschleunigen. Da das Ventil etwa alle 3 min aufwacht, prüft und Daten sendet / empfängt. Sollte man mit dem Befehlen weiter gemacht haben, so kann es zu Problemen führen, das einer nicht mehr mit dem Pending aufhört. In dem Fall empfiehlt es sich beide Devices von Fhem abzumelden und auf Werkseinstellung zu resetten. &lt;br /&gt;
&lt;br /&gt;
Zum Test haucht man das Wandthermostat an oder hält es einige Zeit in der Hand bis die Temperatur steigt, nach etwa 3 Minuten sollte man auch am Thermostat Ventil ein Temperaturanstieg sehen.&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 02 _Climate ====&lt;br /&gt;
Dieser Kanal erlaubt es dem [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP|HM-TC-IT-WM-W-EU Funk-Wandthermostat]] den HM-CC-RT-DN zu steuern. Dazu müssen die beiden Geräte gepeert werden:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Climate peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_Climate single set&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 03 _WindowRec ====&lt;br /&gt;
Mit diesem Kanal können Fensterkontakte ([[HM-SEC-SC Tür-Fensterkontakt|HM-SEC-SC]] und [[HM-Sec-RHS Funk-Fenster-Drehgriffkontakt|HM-SEC-RHS]]) ihren Fensterstatus (geöffnet / gekippt) an ein oder mehrere Thermostate senden. Die Thermostate stellen anschließend die entsprechende (konfigurierbare) Temperatur ein. Der Temperaturwert kann je Fenster-Sensor unterschiedlich definiert werden. Sind mehrere Fenster gleichzeitig geöffnet, so wird der Thermostat auf die Temperatur des Sensors mit dem geringsten Temperaturwert eingestellt. &lt;br /&gt;
Ferner wird empfohlen, bei Einsatz von externen Sensoren, die interne „Fenster auf Erkennung“ zu deaktivieren (weitere Details sind im [[HM-CC-RT-DN Funk-Heizkörperthermostat#Channel .28Kanal.29 04 _Clima|Channel (Kanal) 04 _Clima]] beschrieben).&lt;br /&gt;
&lt;br /&gt;
Der Befehl zum Peeren lautet, wobei &amp;lt;fensterSensor&amp;gt; die FHEM-Kanalbezeichnung für den Fensterkontakt ist und &amp;lt;rt_WindowRec&amp;gt; die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates:&lt;br /&gt;
 set &amp;lt;fensterSensor&amp;gt; peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_WindowRec single set&lt;br /&gt;
&lt;br /&gt;
Zum Löschen (=unpeeren) dieser Kopplung:&lt;br /&gt;
 set &amp;lt;fensterSensor&amp;gt; peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_WindowRec single unset&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Der Peer-(Lösch)Vorgang muss erst am Fensterkontakt durch Drücken der Anlerntaste ausgelöst werden, und zwar auch dann, wenn der Fensterkontakt schon vorher mit FHEM gepairt wurde. Dann kann der oben genannte Befehl in FHEM abgesetzt werden. Wichtig scheint auch, dass der Fensterkontakt geschlossen ist wenn man die Anlerntaste drückt.&lt;br /&gt;
&lt;br /&gt;
Der Befehl zur Temperatureinstellung des Heizkörperthermostaten für den Zustand &amp;quot;Fenster offen&amp;quot; lautet, wobei &amp;lt;fensterSensor&amp;gt; die FHEM-Kanalbezeichnung für den Fensterkontakt ist und &amp;lt;rt_WindowRec&amp;gt; die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates, sowie &amp;lt;Temp&amp;gt; die einzustellende Temperatur (ganzzahliger Wert):&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt;_WindowRec regSet winOpnTemp &amp;lt;Temp&amp;gt; &amp;lt;fensterSensor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 04 _Clima ====&lt;br /&gt;
Dieser Kanal dient zum Einstellen der Betriebsparameter, auch [[#Temperaturlisten|Temperaturlisten]] sind hierauf zu übertragen.&lt;br /&gt;
Mit dem Modul [[Weekprofile|Wochenplan / Weekprofile]] können die Wochenpläne komfortabel in FHEM erstellt und an die Thermostate übertragen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In älteren Versionen von FHEM wurde dieser Kanal durch &#039;&#039;autocreate&#039;&#039; als &amp;lt;code&amp;gt;_ClimRT_tr&amp;lt;/code&amp;gt; angelegt. Der Hersteller hat hier offenbar die internen Bezeichnungen geändert, denn beim Vorläufernmodell HM-CC-TC mussten Temperaturlisten auf den Kanal &#039;&#039;Climate&#039;&#039; übertragen werden.}}&lt;br /&gt;
&lt;br /&gt;
Die maximale Öffnung des Ventils kann mittels folgendem Befehl eingestellt werden (hier auf 80 %):&lt;br /&gt;
  set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima regSet valveMaxPos 80&lt;br /&gt;
&lt;br /&gt;
Die interne &amp;quot;Fenster-auf&amp;quot;-Erkennung kann man wie folgt abschalten:&lt;br /&gt;
  set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima regSet winOpnMode off&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 05 _ClimaTeam ====&lt;br /&gt;
Dieser Kanal erlaubt es mehrere HM-CC-RT-DN zu einem &amp;quot;Team&amp;quot; zu gruppieren. Ein Mitglied des Teams meldet&lt;br /&gt;
* Änderungen der Temperatur am Handrad&lt;br /&gt;
* Einschalten des Boost-Modus am Taster&lt;br /&gt;
an seine &amp;quot;Teamkollegen&amp;quot; weiter. Folgende Änderungen werden &#039;&#039;&#039;nicht&#039;&#039;&#039; weitergegeben:&lt;br /&gt;
* Status der Fensterkontakte&lt;br /&gt;
* Temperaturlisten/Wochenplan und daraus folgende Änderungen&lt;br /&gt;
* Änderungen durch Fernbedienungen&lt;br /&gt;
* Änderungen durch eine HomeMatic-Zentrale&lt;br /&gt;
&lt;br /&gt;
Befehl zum Peeren, wobei &#039;&#039;&amp;lt;HM-CC-RT-DN#1&amp;gt;_ClimaTeam&#039;&#039;, &#039;&#039;&amp;lt;HM-CC-RT-DN#2&amp;gt;_ClimaTeam&#039;&#039;, ..., &#039;&#039;&amp;lt;HM-CC-RT-DN#8&amp;gt;_ClimaTeam&#039;&#039; die Kanalbezeichnungen der jeweiligen ClimaTeam-Kanäle sind:&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN#1&amp;gt;_ClimaTeam peerChan 0 &amp;lt;HM-CC-RT-DN#2&amp;gt;_ClimaTeam single&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN#1&amp;gt;_ClimaTeam peerChan 0 &amp;lt;HM-CC-RT-DN#3&amp;gt;_ClimaTeam single&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN#2&amp;gt;_ClimaTeam peerChan 0 &amp;lt;HM-CC-RT-DN#3&amp;gt;_ClimaTeam single&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 06 _remote ====&lt;br /&gt;
Dieser Kanal kann an eine Fernbedienung gekoppelt werden. Per Tastendruck kann man einen bestimmten Mode und/oder eine bestimmte Temperatur wählen. Dabei kann die Reaktion auf einen langen oder kurzen Tastendruck gesondert eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Der Befehl zum peeren lautet, wobei &amp;lt;button&amp;gt; die Kanalbezeichnung der Fernbedienung und &amp;lt;rt-remote&amp;gt; die Kanalbezeichnung des Heizkörperthermostates ist:&lt;br /&gt;
  set &amp;lt;button&amp;gt; peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_remote single&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus Auto, Manu, Party (Urlaub) ===&lt;br /&gt;
&lt;br /&gt;
Der HM-CC-RT-DN verfügt über drei Betriebsmodus: Auto, Manu (Manuell) und Party (Urlaub).&lt;br /&gt;
&lt;br /&gt;
==== Modus Auto ====&lt;br /&gt;
Das Gerät arbeitet gemäß des gespeicherten Wochenprogramms. Manuelle Änderungen sind möglich, werden aber beim nächsten Schaltpunkt überschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Modus Manu ====&lt;br /&gt;
Die Temperatur wird manuell eingestellt, das Wochenprogramm wird nicht abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
==== Modus Party (Urlaub) ====&lt;br /&gt;
Die eingestellte Temperatur gilt bis zu einem gegebenen Endzeitpunkt, anschließend wechselt das Thermostat in den &#039;&#039;Auto&#039;&#039;-Modus. So kann beispielsweise bei Abwesenheit ein niedrigeres Temperaturprofil eingestellt werden ohne dass die Temperaturlisten verändert werden müssen.&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima controlParty 16 06.12.13 16:30 09.12.13 05:00&lt;br /&gt;
&lt;br /&gt;
Dadurch wird &lt;br /&gt;
* von 06.12.2013, 16:30 Uhr&lt;br /&gt;
* bis 09.12.2013, 05:00 Uhr &lt;br /&gt;
* die gewünschte Raumtemperatur auf 16 °C eingestellt.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|&lt;br /&gt;
* Der Befehl muss auf dem Kanal 4 &#039;&#039;(_Clima)&#039;&#039; erfolgen.&lt;br /&gt;
* Es werden nur Uhrzeiten zu jeder vollen oder halben Stunde angenommen (Minuten also 00 oder 30).}}&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Funktion &amp;lt;code&amp;gt;Urlaub()&amp;lt;/code&amp;gt; kann man eine ganze Wohnung (also mehrere RTs) mit nur einem Befehl in den Party-Modus versetzen. Im Beispiel werden zwei Heizkörper (&amp;quot;Treppenhaus&amp;quot; und &amp;quot;Kammer&amp;quot;) angesteuert.&lt;br /&gt;
&lt;br /&gt;
Zu beachten sind folgende Dinge:&lt;br /&gt;
# Aktuelle Dateien (z.B. &amp;lt;code&amp;gt;10_CUL_HM&amp;lt;/code&amp;gt;) verwenden!&lt;br /&gt;
# Bei dem &#039;&#039;controlParty&#039;&#039;-Befehl &#039;&#039;kein&#039;&#039; Komma zwischen den Parametern.&lt;br /&gt;
# Bei der Funktion die Parameterübergabe definieren &amp;lt;code&amp;gt;($$$$$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufruf:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;{Urlaub (&amp;quot;16&amp;quot;, &amp;quot;06.12.13&amp;quot;, &amp;quot;16:30&amp;quot;, &amp;quot;09.12.13&amp;quot; ,&amp;quot;05:00&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=perl&amp;gt;&lt;br /&gt;
my $Urlaub;&lt;br /&gt;
sub&lt;br /&gt;
Urlaub($$$$$)&lt;br /&gt;
  {&lt;br /&gt;
    my ($temp, $startDate, $startTime, $endDate, $endTime) = @_;&lt;br /&gt;
 &lt;br /&gt;
    # HM-CC-RT-DN akzeptiert nur Zeiten, die auf Minute 00 oder 30 enden.&lt;br /&gt;
    # Daher $startTime und $endTime abrunden&lt;br /&gt;
    $startTime =~ s/\:[0-2].$/:00/;&lt;br /&gt;
    $startTime =~ s/\:[3-5].$/:30/;&lt;br /&gt;
    $endTime =~ s/\:[0-2].$/:00/;&lt;br /&gt;
    $endTime =~ s/\:[3-5].$/:30/;&lt;br /&gt;
&lt;br /&gt;
    # controlParty bei jedem HM-CC-RT-DN setzen.&lt;br /&gt;
    for my $rt (qw(Kammer Treppenhaus)) {&lt;br /&gt;
      fhem (&amp;quot;set $rt controlParty $temp $startDate $startTime $endDate $endTime&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tastensperre ===&lt;br /&gt;
&lt;br /&gt;
Um zu verhindern, dass der Modus oder die Temperatur per Tasten bzw. Drehrad am HM-CC-RT-DN verändert wird, kann eine Tastensperre gesetzt werden. Dies erfolgt mittels des Befehls:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet btnLock on&lt;br /&gt;
&lt;br /&gt;
Rückgängig machen geht per:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet btnLock off&lt;br /&gt;
&lt;br /&gt;
Diese Tastensperre kann man aber am HM-CC-RT-DN durch eine Tastenkombination wieder zurücksetzen. Um sie nur per FHEM rücksetzen zu können, muss&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet globalBtnLock on&lt;br /&gt;
&lt;br /&gt;
eingegeben werden. Rückgängig geht wieder per:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet globalBtnLock off&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Tastensperre die nur das Umschalten des Modus (Auto, Manuell, Urlaub) am Gerät verhindert. Diese wird mit&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet modusBtnLock on&lt;br /&gt;
&lt;br /&gt;
eingeschaltet. Abschalten geht mit:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet modusBtnLock off&lt;br /&gt;
&lt;br /&gt;
=== Burst-Modus ===&lt;br /&gt;
Das ist ein &#039;&#039;&#039;Übertragungs&#039;&#039;&#039;modus für Nachrichten zwischen HM-Geräten und der Zentrale. Der RT erwacht alle 2,5 Minuten und dann überträgt die Zentrale die Kommandos. Wenn man einen Fensterkontakt oder eine Fernsteuerung nutzt, muss der RT sofort reagieren - dann muss man den Burst &#039;&#039;enablen&#039;&#039;. Der RT kann in diesem Fall sofort aufgeweckt werden und bearbeitet die Anforderung (Request). Das kann man auch von der Zentrale aus nutzen (so man möchte). Das ist der &#039;&#039;&#039;Vorteil&#039;&#039;&#039; des eingeschalteten Burst-Modus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil:&#039;&#039;&#039; Der Burst-Modus benötigt mehr Leistung, das heißt die Batterien müssen häufiger gewechselt werden: Der RT muss den Receiver ständig empfangsbereit halten. Außerdem wachen bei jedem Burst wachen &#039;&#039;alle&#039;&#039; Burst-Empfänger auf – egal an wen die Kommunikation gerichtet war.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Burst – wie es funktioniert&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Schickt ein Sender eine burst Sequenz, wachen alle burst-Empfänger auf und prüfen die Message. &lt;br /&gt;
Wenn sie betroffen sind bleiben sie eine Zeit lang wach, ansonsten schlafen sie wieder ein. &lt;br /&gt;
Man beachte also, dass Senden eines Burst  Energie in ALLEN burst-Empfängern verbraucht, egal ob sie angesprochen sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMLAN und burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[HMLAN]] hat ein Sendebudget das über eine Stunde berechnet wird. Burst belastet diese Konto deutlich - so können nicht mehr als 100 bursts /h gesendet werden - dann geht HMLAN in overload Wenn zusätzliche Nachrichten gesendet werden sind es entsprechend weniger. &lt;br /&gt;
Es ist als nicht vorteilhaft, unnötig bursts zu senden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Burst devices&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es gibt Devices, die immer auf burst reagieren und solche bei denen es abgeschaltet werden kann. So reagiert ein Rauchmelder immer auf Burst damit er seine Team-Kollegen hören kann. &lt;br /&gt;
Ein TC oder RT hingegen hat diese Funktion abschaltbar. &#039;Per default ist dies ausgeschaltet um Batterie zu sparen&#039;. Wenn ein VD gesteuert wird ist der TC ja selbst wach.  Wird er aber mit einem Fensterkontakt gekoppelt muss es eingeschaltet werden – sonst verpasst er die Nachricht. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ConditionalBurst devices&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Devices mit abschaltbarem Burst wie z.B. der &#039;&#039;HM-CC-RT-DN&#039;&#039; haben ein Register, &#039;&#039;burstRx&#039;&#039;, mit dem das burst-Erwachen eingestellt werden kann. &lt;br /&gt;
Sendern, die einen burst-Aktor erwecken sollen, muss man sagen, welcher Peer Burst benötigt. Hier kann ggf. das Register &#039;&#039;peerNeedsBurst&#039;&#039; nach dem Peeren gesetzt werden. FHEM versucht dies automatisch beim Peeren zu erledigen. Siehe [[HomeMatic HMInfo|HMinfo]] Befehl &#039;&#039;models&#039;&#039; um herauszufinden, welche Devices welchen Modus unterstützen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attribut burstAccess&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Devices, die abschaltbaren burst haben kann man ein attribut bustAccess 1_auto setzen. Es wird beim Abschicken eines Kommandos versucht, das Device mit burst zu wecken. Sollte es nicht funktionieren wird gewartet, bis das Device aufwacht (meist reagieren solche Devices auch auf wakeup). Das Setzen des Attributs ist angenehm – es werden aber ggf. viele bursts gesendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommando burstXmit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Kommando, das bei Devices mit contitional-Burst zu Verfügung steht, wird der burst gezielt von User angestossen.&lt;br /&gt;
&lt;br /&gt;
Der User schickt erst seine Kommandos an das device. Die Kommandos werden im Command-stack gesammelt. &lt;br /&gt;
&lt;br /&gt;
Dann sendet der User ein set burstXmit.&lt;br /&gt;
&lt;br /&gt;
Es passiert das gleiche wie bei burstAccess.&lt;br /&gt;
&lt;br /&gt;
FHEM versucht mittels burst zu wecken und sendet bei Erfolg die Messages aus dem Kommandostack. &lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu burstAccess ist burstXmit gezielt einsetzbar und kann sparsamer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; FHEM und burst devices&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
FHEM sendet eine burst automatisch mit Kommandos zu Devices, die nur burst unterstützen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;So aktiviert man den burst-Betrieb am HM-CC-RT-DN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Burst Mode einschalten&#039;&#039; (der Kanal 4 des Device WZ1 heisst hier WZ1_4)&lt;br /&gt;
:&amp;lt;code&amp;gt;set WZ1_4 regSet burstRx on &amp;lt;/code&amp;gt;&lt;br /&gt;
prüfen mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;get WZ1_4 reg burstRx &amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;Nun in FHEM den Burst mode einschalten (sofern nicht burstXmit verwendet wird)&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WZ1 burstAccess 1_auto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Attribut im Device und nicht im Kanal setzen, ansonsten gibt es eine Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
=== Temperaturlisten ===&lt;br /&gt;
Die Temperaturlisten des HM-CC-RT-DN werden identisch mit denen anderer HomeMatic Thermostate verwaltet (siehe [[HomeMatic Type Thermostat#Temperaturlisten|HomeMatic Type Thermostat]]). Beim HM-CC-RT-DN ist der Kanal 4 (_Clima) für die Temperaturlisten zuständig.&lt;br /&gt;
&lt;br /&gt;
==FHEM-Log==&lt;br /&gt;
In den folgenden Logs heißt Kanal 4 noch &amp;quot;_ClimRT_tr&amp;quot;. Inzwischen würde man dort &amp;quot;_Clima&amp;quot; sehen.&lt;br /&gt;
&lt;br /&gt;
=== Device-Log ===&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM Unknown device CUL_HM_HM_CC_RT_DN_2212BC, please define it&lt;br /&gt;
 2013.10.10 20:03:24 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC CUL_HM 2212BC A1A0184002212BC0000001000954B4551303531303031375900FFFF&lt;br /&gt;
 2013.10.10 20:03:24 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM pair: CUL_HM_HM_CC_RT_DN_2212BC thermostat, model HM-CC-RT-DN serialNr KEQ0510017&lt;br /&gt;
 2013.10.10 20:03:24 3: LANCUL pairing (hmPairForSec) not enabled&lt;br /&gt;
 2013.10.10 20:03:24 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC-%Y.log CUL_HM_HM_CC_RT_DN_2212BC&lt;br /&gt;
 2013.10.10 20:03:24 3: Device Heizung_Wohnzimmer added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM pair: Heizung_Wohnzimmer thermostat, model HM-CC-TC serialNr JEQ0044286&lt;br /&gt;
 2013.10.10 20:03:24 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM pair: CUL_HM_HM_CC_RT_DN_2212BC thermostat, model HM-CC-RT-DN serialNr KEQ0510017&lt;br /&gt;
 2013.10.10 20:03:25 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_Weather CUL_HM 2212BC01&lt;br /&gt;
 2013.10.10 20:03:25 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Weather FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Weather-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Weather&lt;br /&gt;
 2013.10.10 20:03:25 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Weather FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Weather-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Weather&lt;br /&gt;
 2013.10.10 20:03:26 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_Climate CUL_HM 2212BC02&lt;br /&gt;
 2013.10.10 20:03:26 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Climate FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Climate-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Climate&lt;br /&gt;
 2013.10.10 20:03:26 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Climate FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Climate-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Climate&lt;br /&gt;
 2013.10.10 20:03:27 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_WindowRec CUL_HM 2212BC03&lt;br /&gt;
 2013.10.10 20:03:27 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_WindowRec FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_WindowRec-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_WindowRec&lt;br /&gt;
 2013.10.10 20:03:27 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_WindowRec FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_WindowRec-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_WindowRec&lt;br /&gt;
 2013.10.10 20:03:28 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr CUL_HM 2212BC04&lt;br /&gt;
 2013.10.10 20:03:28 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr&lt;br /&gt;
 2013.10.10 20:03:28 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr&lt;br /&gt;
 2013.10.10 20:03:29 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam CUL_HM 2212BC05&lt;br /&gt;
 2013.10.10 20:03:29 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam&lt;br /&gt;
 2013.10.10 20:03:29 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam&lt;br /&gt;
 2013.10.10 20:03:30 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_remote CUL_HM 2212BC06&lt;br /&gt;
 2013.10.10 20:03:30 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_remote FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_remote-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_remote&lt;br /&gt;
 2013.10.10 20:03:30 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_remote FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_remote-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_remote&lt;br /&gt;
 2013.10.10 20:03:35 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:40 2: CUL_HM set CUL_HM_HM_CC_RT_DN_2212BC getSerial&lt;br /&gt;
 2013.10.10 20:03:40 2: CUL_HM set CUL_HM_HM_CC_RT_DN_2212BC getConfig&lt;br /&gt;
 2013.10.10 20:03:54 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
&lt;br /&gt;
=== Event monitor ===&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr motorErr: ok&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr measured-temp: 18.4&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr desired-temp: 18&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr ValvePosition: 3 %&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr mode: manu&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr unknown0: 24&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr T: 18.4 desired: 18 valve: 3 %&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC battery: ok&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC batteryLevel: 3.1 V&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC measured-temp: 18.4&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC desired-temp: 18&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC actuator: 3 %&lt;br /&gt;
&lt;br /&gt;
== Firmware Update ==&lt;br /&gt;
Seit 24.10.2014 gibt es für den HM-CC-RT-DN die neue Firmware Version 1.4. Diese kann von der eQ-3 Webseite heruntergeladen werden. Genauere Informationen gibt es unter [[HomeMatic Firmware Update]].&lt;br /&gt;
&lt;br /&gt;
=== HM-CC-RT-DN spezifische Update Informationen ===&lt;br /&gt;
Durch gleichzeitiges Drücken der &amp;quot;Auto-/Manu&amp;quot;-Taste und der &amp;quot;Comfort-/Eco&amp;quot;-Taste am HM-CC-RT-DN während man die Batterien wieder einlegt wird der updatemodus gestartet. Während des Updates steht &amp;quot;FUP&amp;quot; im Display. Nach erfolgreichem Update erscheint &amp;quot;Ins&amp;quot; im Display und es muss eine erneute Adaptierfahrt durch drücken der Boost-Taste ausgelöst werden. Anschließend sollte der HM-CC-RT-DN wieder normal funktionieren. Die eingestellten Parameter und das Pairing mit FHEM gehen beim Update nicht verloren. Sollte das Update fehlschlagen, erscheint &amp;quot;Err&amp;quot; bzw. &amp;quot;CrC&amp;quot; im Display.&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte dann durch erneutes starten der Prozedur am PC und HM-CC-RT-DN das ganze erneut durchführbar sein.&lt;br /&gt;
&lt;br /&gt;
Es gibt einige Readings, die nicht durch ein einfaches &#039;&#039;getConfig&#039;&#039; aktualisisert werden, z.B. &amp;quot;battery&amp;quot;(nicht batteryLevel). Um diese Readings zu bekommen, ist ein &lt;br /&gt;
:&amp;lt;code&amp;gt;set Device_Channel04 controlMode auto &amp;lt;/code&amp;gt;&lt;br /&gt;
notwendig. Daraufhin werden die Readings übertragen/aktualisiert.&lt;br /&gt;
&lt;br /&gt;
== Simulation von Fensterkontakten und externen Temperatursensoren ==&lt;br /&gt;
grober Ablauf:&lt;br /&gt;
* erstellen ein virtuelles Device&lt;br /&gt;
* erstelle dazu einen virtuellen Kanal&lt;br /&gt;
* peeren den Kanal mit dem RT (als fenster-kontakt oder als remote, wen du willst)&lt;br /&gt;
* sende ein postEvent&lt;br /&gt;
&lt;br /&gt;
=== Fensterkontakte ===&lt;br /&gt;
&#039;&#039;Entnommen aus diesem {{Link2Forum|Topic=31078|Message=236245|LinkText=Forenbeitrag}}&#039;&#039;&lt;br /&gt;
 define virSC CUL_HM 221133&lt;br /&gt;
 attr virSC autoReadReg 4_reqStatus&lt;br /&gt;
 attr virSC expert 2_full&lt;br /&gt;
 attr virSC model virtual_1&lt;br /&gt;
 attr virSC peerIDs &lt;br /&gt;
 attr virSC subType virtual&lt;br /&gt;
 attr virSC webCmd press short:press long&lt;br /&gt;
 &lt;br /&gt;
 define virtualKitchenDoor CUL_HM 22113301&lt;br /&gt;
 attr virtualKitchenDoor dummy 1&lt;br /&gt;
 attr virtualKitchenDoor expert 1&lt;br /&gt;
 attr virtualKitchenDoor group Virtual&lt;br /&gt;
 attr virtualKitchenDoor model virtual_1&lt;br /&gt;
 attr virtualKitchenDoor webCmd postEvent open:postEvent closed &lt;br /&gt;
&lt;br /&gt;
Anschließend peeren und Temperatur festlegen mit:&lt;br /&gt;
 set virtualKitchenDoor peerChan 0 &amp;lt;Thermostat_Window_Rec&amp;gt; single set&lt;br /&gt;
 set &amp;lt;Thermostat_Window_Rec&amp;gt; regSet winOpnTemp 5 virtualKitchenDoor&lt;br /&gt;
&lt;br /&gt;
Ggf noch interne &amp;quot;Fenster-auf&amp;quot; Erkennung abschalten&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima regSet winOpnMode off&lt;br /&gt;
&lt;br /&gt;
Die virtuelle Tür wird dann entsprechend über ein Notify getriggert:&lt;br /&gt;
 define notify_virtualKitchenDoor notify (Fensterkontakt_1|Fensterkontakt_2) {if(Value(&amp;quot;Fensterkontakt&amp;quot;) eq &amp;quot;open&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Fensterkontakt_2&amp;quot;) eq &amp;quot;open&amp;quot;){fhem(&amp;quot;set virtualKitchenDoor postEvent open&amp;quot;)}else{fhem(&amp;quot;set virtualKitchenDoor postEvent closed&amp;quot;)}}&lt;br /&gt;
&lt;br /&gt;
=== Temperatursensoren ===&lt;br /&gt;
&#039;&#039;Entnommen aus diesem {{Link2Forum|Topic=19686|Message=233788|LinkText=Forenbeitrag}}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Virtuelles HomeMatic Device mit _deiner_ HM Id definieren:&lt;br /&gt;
 define wz_vT CUL_HM &amp;lt;hmId&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dem Device einen virtuellen Kanal (Default ist ein virtueller Button) hinzufügen:&lt;br /&gt;
 set wz_vT virtual 1&lt;br /&gt;
&lt;br /&gt;
3. Es ist kein virtueller Button sondern ein virtueller Temperatursensor - darum rename:&lt;br /&gt;
 rename wz_vT_Btn1 wz_vT_Sensor1&lt;br /&gt;
&lt;br /&gt;
4. Virtuellen Peer Sensor mit dem Weather Channel des RT-DN peeren:&lt;br /&gt;
 set wz_vT_Sensor1 peerChan 0 &amp;lt;RT_DN&amp;gt;_Weather single&lt;br /&gt;
&lt;br /&gt;
5. Peering kontrollieren (Voraussetzung: Device &#039;&#039;hm&#039;&#039; vom Typ [[HomeMatic HMInfo|HMinfo]] existiert):&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm peerXref&amp;lt;/code&amp;gt;&lt;br /&gt;
Beispiel-Ausgabe:&lt;br /&gt;
 peerXref done: &lt;br /&gt;
 x-ref list &lt;br /&gt;
    wz_Thermostat_Weather =&amp;gt; wz_vT_Sensor1 &lt;br /&gt;
    wz_vT_Sensor1 =&amp;gt; wz_Thermostat_Weather&lt;br /&gt;
&lt;br /&gt;
6. Gemessene Temperatur vom z.B. 1-Wire DS1820 dem virtuellen HM Sensor übergeben. Z.B. alle zwei Minuten per at:&lt;br /&gt;
 define at_wz_vT at +*00:02 { my $T=(ReadingsVal(&amp;quot;&amp;lt;DS1820B&amp;gt;&amp;quot;,&amp;quot;temperature&amp;quot;,20.0));; fhem &amp;quot;set wz_vT_Sensor1 virtTemp $T&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
Sollte es Probleme geben, dass der RT des Öfteren wieder auf seine eigenen Messwerte wechselt, so sollte das Attr cyclicMsgOffset im Virtuellen Kanal beachtet werden. Näheres dazu ist ca. ab {{Link2Forum|Topic=45735|Message=572806|LinkText=hier}} im Forum zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
=== TempList: Bad format ... ===&lt;br /&gt;
Wenn Sie beim Setzen einer Temperaturliste nach dem o.a. Schema (&amp;quot;SetTempList...&amp;quot;) die Meldung&lt;br /&gt;
&lt;br /&gt;
 Bad format, use HH:MM TEMP ......&lt;br /&gt;
&lt;br /&gt;
erhalten, sollten Sie zunächst ein [[update]] von FHEM durchführen.&lt;br /&gt;
&lt;br /&gt;
=== Der Thermostat heizt über die Solltemperatur hinaus ===&lt;br /&gt;
In der Regel ist das ein ganz normales Verhalten, wenn der Thermostat nicht mit einem externen Temperaturfühler oder einem Wandthermostat gepeert ist. In dem Fall muss sich der Thermostat auf den eingebauten Temperatursensor verlassen, der sehr nahe an der Heizung selbst sitzt. Dadurch ist die gemessene Temperatur höher, als sie z.B. in der Raummitte wäre. Der Hersteller hat hier einen mehr oder weniger intelligenten Algorithmus eingebaut, um diesen Effekt zu kompensieren. Das sieht dann so aus, als ob der Thermostat nicht richtig regelt.&lt;br /&gt;
Dieses Verhalten kann man im Prinzip nur verhindern, indem man einen externen Temperatursensor oder einen Wandthermostat peert. Wie das geht ist hier beschrieben: [[#Channel (Kanal) 01 _Weather]]. Normalerweise regelt der Thermostat dann genau auf die Solltemperatur. &lt;br /&gt;
Ansonsten sollte man sich auch fragen, ob das gezeigte Verhalten vielleicht doch gut genug ist. Dazu platziert man irgendein Thermometer möglichst in der Mitte des Raums und beobachtet den Temperaturverlauf eine Weile. Wenn man dann noch eine Abweichung feststellt, kann es sinnvoll sein, diese mittels des Registers R-tempOffset zu beheben.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/produkt-detail-aktoren/items/homematic-funk-heizkoerperthermostat.html Produktinfo]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/downloads_produktkatalog/homematic/bda/HM-CC-RT-DN_UM_GE_eQ-3_web.pdf Bedienungsanleitung (PDF)]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/downloads_produktkatalog/homematic/pdb/Funk-Heizkoerperthermostat_105155_Produktdatenblatt_V2.3.pdf Datenblatt (PDF)]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/downloads/Ventilkompatibilitaeten.pdf Ventil-Kompatibilitätsliste (zur Zeit nicht verfügbar)]&lt;br /&gt;
* {{Link2Forum|Topic=14738|LinkText=Forenthema zum Thermostat}}&lt;br /&gt;
* {{Link2Forum|Topic=64446|LinkText=Reparatur einer durch mechanischen Stoß von außen abgerissenen Lichtschranke}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Heizungsventile]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22777</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22777"/>
		<updated>2017-09-29T22:42:17Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Artikel überarbeitet&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 Dongel am PI installieren ===&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain 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 Raspberry 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 Progamm 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 / collectored ===&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-Device] ist und presenced für &amp;quot;normale&amp;quot; Bluetooth-Geräte. &lt;br /&gt;
&lt;br /&gt;
collectored 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. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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 Schritt gehen jedoch auf 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ändigkeithalber 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.82-1.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/13992/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.82-1.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, kann nun 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.82-1.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 Presence.- oder lepresenced Installationen zu verbinden wird der collectored 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 Skizee dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.&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;
==== Aufbau ====&lt;br /&gt;
; RPi1 (Hautpinstanz): &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.7.deb (Stand Januar 2017)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i collectord-1.7.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.&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 Hinweis: (Der Port ist der, des Collectord!! Standard 5222)&lt;br /&gt;
;RPi2&lt;br /&gt;
:define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60 Hinweis: (Der Port ist der, des Collectord!! Standard 5222 - die IP-Adresse von die von RPi1)&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 collectored einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectored prüfen kann, dieser steht in der Zeile &amp;lt;pre&amp;gt;created socket on 0.0.0.0 with port 5333&amp;lt;/pre&amp;gt; und man sehen kann, ob der collectored richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /usr/bin/perl /usr/sbin/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:55 - forked with PID 15556&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5333&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 presence_timeout und absence_timeout 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 absence_timeout/presence_timeout setzen. Sobald sich der Zustand ändert,&lt;br /&gt;
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.&lt;br /&gt;
Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand.&lt;br /&gt;
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;
&lt;br /&gt;
====  Automatischer Start ====&lt;br /&gt;
Wenn das Collectord per .deb Paket installiert wurde, startet es automatisch bei einem Reboot mit.&lt;br /&gt;
Manuell Starten als Daemon mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /usr/bin/perl /usr/sbin/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;
= 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>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=22737</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=22737"/>
		<updated>2017-09-25T11:52:58Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* AWS Lambda Funktion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Alexa-Fhem&#039;&#039;&#039; ist eine in JavaScript geschriebene und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im {{Link2Forum|Topic=60244|LinkText=Forum}} veröffentlicht.&lt;br /&gt;
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModTechName=&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=justme1968&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
===Glossar===&lt;br /&gt;
*Echo bzw. Echo Dot (im Folgenden maskulin bezeichnet) sind die derzeit verfügbaren Geräte des Alexa-Systems &#039;&#039;&#039;BILDER EINSTELLEN - Achtung Urheberrecht&#039;&#039;&#039;&lt;br /&gt;
*AVS ist der Amazon Voice Service, d.h. die Spracherkennungskomponente des Systems.{{Randnotiz|RNTyp=r|RNText=Für die Nutzung der Amazon AWS-Dienste müssen zwingend die Daten einer Kreditkarte angegeben werden. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen. Die Autoren dieser Anleitung und der darin beschriebenen Module übernehmen keine Haftung für eventuelle Kosten, die aus der Nutzung der AWS entstehen. }}&lt;br /&gt;
*AWS sind die Amazon Web Services, also per URL erreichbare Dienste zur Ausführung von Berechnungen etc. Im Rahmen von Alexa-Fhem wird bei AWS eine eigene JavaScript-Funktion hinterlegt, die zur Kommunikation mit dem FHEM-Server dient. Im Jargon von Amazon ist dies eine so genannte Lambda-Funktion &#039;&#039;&#039;WARUM ? Nachlesen bei Amazon&#039;&#039;&#039;.&lt;br /&gt;
*Card bezeichnet einen Eintrag in der Alexa-App, der die erkannte Sprachnachricht sowie weiter gehenden Informationen über die Reaktion von Alexa enzthält und Rückmeldung an Amazon erlaubt.&lt;br /&gt;
*Skill (engl. für Fähigkeit) ist die Bezeichnung für eine per Spracherkennung bediente Funktionalität des Alexa-Systems, z.B. zur Nachrichtenansage, zur Wettervorhersage oder zur Steuerung von FHEM&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
[[Datei:2gpXyLN.jpg|200px|thumb|right|Grafische Darstellung der beteiligten Komponenten]]&lt;br /&gt;
Echo -&amp;gt; AVS -&amp;gt; AWS Lambda -&amp;gt; alexa-fhem -&amp;gt; AWS Lambda -&amp;gt; AVS -&amp;gt; Echo&lt;br /&gt;
 &lt;br /&gt;
*Der Echo (oder ein anderes Alexa/AVS fähiges Gerät)  nimmt Audiodaten auf und schickt diese an AVS  (Amazon Voice Service) zur Erkennung&lt;br /&gt;
*AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den erkannten Daten&lt;br /&gt;
:*Beim Alexa SmartHome Skill sind die möglichen Sätze für die Spracherkennung relativ fest vorgegeben &lt;br /&gt;
:*Beim Alexa Custom Skill kommen die dazu nötigen Informationen aus dem &#039;&#039;Interaction Model&#039;&#039; der Alexa Skills Configuration&lt;br /&gt;
*Das Event wird an den unter &#039;&#039;Configuration&#039;&#039; in der Alexa Skills Configuration hinterlegten Endpoint geschickt&lt;br /&gt;
:*Beim Alexa SmartHome Skill ist das zwingend eine AWS Lambda Routine&lt;br /&gt;
:*Beim Alexa Custom Skill kann das im Prinzip auch ein eigener Web Service sein&lt;br /&gt;
*Das Event wird vom &amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; code an alexa-fhem weitergeleitet&lt;br /&gt;
*alexa-fhem steuert FHEM und sendet ein Antwort-Event zurück&lt;br /&gt;
*&amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; nimmt diese Antwort entgegen und gibt sie an AVS zurück&lt;br /&gt;
*AVS sogt dafür das der Echo &#039;antwortet&#039; und dass die Card in der Alexa App erscheint&lt;br /&gt;
&lt;br /&gt;
===Anmerkungen===&lt;br /&gt;
*Ein Skill hat keinen Zugriff auf die Audiodaten&lt;br /&gt;
*Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und &#039;einfach&#039; Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.&lt;br /&gt;
*Wenn man berücksichtigt welchen Weg die Daten insgesamt gehen, ist es erstaunlich, wie schnell die Reaktion auf einen gesprochenen Satz erfolgt.&lt;br /&gt;
&lt;br /&gt;
=== Abgrenzung des &#039;&#039;&#039;Alexa Smart Home Skills&#039;&#039;&#039; und des &#039;&#039;&#039;Alexa Custom Skills&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Smart_Home|Alexa Smart Home Skill]] ist ein Amazon-Alexa-Standard-Skill, der wesentliche Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein &amp;quot;Alexa, schalte die Wohnzimmerlampe an&amp;quot; um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik &amp;quot;Smart Home&amp;quot; als Skill angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Custom|Alexa Custom Skill]] ist kein Standard-Smart-Home-Skill, sondern ein individuell entwickelter Skill, so wie alle anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik &amp;quot;Smart Home&amp;quot; angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. &amp;quot;Alexa, starte [Name des Skills]&amp;quot;) oder direkt angesprochen wird (z.B. &amp;quot;Alexa, frage [Name des Skills] wie ist der Status von [Device] &amp;quot;). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch werden anspruchsvollere Steuerungsmöglichkeiten nur mit diesem realisiert werden können.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Da die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Während der Konfiguration sollten alle nachfolgenden Abschnitte parallel in gleichzeitig geöffneten Browserfenstern durchgeführt werden, die jeweils bis zum Abschluss geöffnet bleiben müssen. }}&lt;br /&gt;
Grundvoraussetzung für alle folgenden Schritte ist das Vorhandensein eines Amazon-Accounts. Es wird davon ausgegangen, dass die Konten für alle im Folgenden genutzten Amazon-Dienste eingerichtet wurden.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get install build-essential libssl-dev&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss NodeJS installiert werden. Leider ist die Version im Debian Repository deutlich zu alt, daher wird mit den folgenden Befehlen das Node Repository hinzugefügt und NodeJS (in der LTS Version) entsprechend installiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem installieren ===&lt;br /&gt;
&#039;&#039;&#039;Aus gegebenem Anlass: Dies ist weder eine Einführung in Linux, noch eine Anfängerdokumentation für FHEM.&#039;&#039;&#039; Also erst die Grundlagen lernen, und dann mit Alexa beginnen !&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Version ist jeweils  {{Link2Forum|Topic=60244|Message=540117|LinkText=hier}} zu finden.&lt;br /&gt;
&lt;br /&gt;
====Erstinstallation====&lt;br /&gt;
Hier wird die Erstinstallation von Alexa-Fhem beschrieben.&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Die tgz-Datei unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;tar -xvzf dateiname.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;mv package alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/syntaxhighlight&amp;gt; (kein sudo!). Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Home-Verzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; Insbesondere ist zu beachten, dass dieser Nutzer u.U. im Startskript explizit gesetzt wird. Mit dem untenstehenden Skript ist das &#039;&#039;nicht&#039;&#039; der User fhem, sondern der User &#039;&#039;pi&#039;&#039;. Das Symbol &#039;&#039;~/&#039;&#039; verweist auf das Home-Verzeichnis des Benutzers, der gerade die Installation vornimmt.&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;.alexa/config.json&#039;&#039; kopieren. Achtung: Installiert man alexa-fhem als root-user, zeigt das Symbol &#039;&#039;~/&#039;&#039; auf &#039;&#039;/root&#039;&#039; - und die Konfigurationsdatei wird ggf. bei einem manuellen Start von Alexa-Fhem nicht gefunden.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis kopiert werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
&#039;&#039;Vor&#039;&#039; der Installation von Alexa-Fhem muss man folgende Anwendungen installieren:&lt;br /&gt;
* Node.js (die aktuelle Version findet man unter https://nodejs.org/en/download/)&lt;br /&gt;
* OpenSSL (http://slproweb.com/products/Win32OpenSSL.html oder https://www.heise.de/download/product/win32-openssl-47316/download)&lt;br /&gt;
Erst dann fängt man mit Alexa-Fhem an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Die tgz-Datei im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren.&amp;lt;br/&amp;gt; Bei der Fehlermeldung wie &amp;quot;Der Befehl &amp;quot;npm&amp;quot; ist entweder falsch geschrieben oder konnte nicht gefunden werden.&amp;quot; ist die Installation von Node.js zu überprüfen.&lt;br /&gt;
# SSL Zertifikat erzeugen. Dafür muss man alle Befehle aus dem Skript &#039;&#039;createKey.sh&#039;&#039; nacheinander manuell ausführen. Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken. Der Windows-Welt unbekannter Befehl &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt; ist durch &amp;lt;code&amp;gt;move /y&amp;lt;/code&amp;gt; zu ersetzen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl rsa -in key.pem -out newkey.pem&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;move /y newkey.pem key.pem&amp;lt;/syntaxhighlight&amp;gt; Eventuelle Fehlermeldung &amp;quot;can&#039;t open config file: /usr/local/ssl/openssl.cnf&amp;quot; o.Ä. lässt sich durch Befehl &amp;lt;code&amp;gt;set OPENSSL_CONF=&amp;lt;OpenSSL-Verzeichnis&amp;gt;\bin\openssl.cfg&amp;lt;/code&amp;gt; beheben, wobei &amp;lt;OpenSSL-Verzeichnis&amp;gt; durch den entsprechenden Installationspfad (typischerweise &amp;lt;code&amp;gt;c:\OpenSSL-Win32&amp;lt;/code&amp;gt;) zu ersetzen ist.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Benutzerverzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; In aktuellen Versionen von Windows (ab Windows 7 bzw. ab Windows Server 2008 R2) liegt das Verzeichnis unter &amp;lt;code&amp;gt;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;lt;/code&amp;gt;, also z.B. für Benutzer &amp;quot;Administrator&amp;quot; - unter &amp;lt;code&amp;gt;C:\Users\Administrator&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;Falls Windows sich weigert das Verzichniss mit dem Punkt am Anfang zu erstellen, kann man das aus der Kommandozeile machen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
mkdir &amp;quot;.alexa&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;C:\Users\&amp;lt;Benutzername&amp;gt;\.alexa\config.json&#039;&#039; kopieren.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;lt;/code&amp;gt;) kopiert werden.&lt;br /&gt;
&lt;br /&gt;
====Update====&lt;br /&gt;
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen, in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version im Hauptverzeichnis von FHEM entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren.&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem konfigurieren ====&lt;br /&gt;
Der Inhalt der Datei &#039;&#039;~/.alexa/config.json&#039;&#039; muss an die eigene Umgebung angepasst werden. &lt;br /&gt;
# &#039;&#039;nat-pmp&#039;&#039; -&amp;gt; wenn nat-pmp verwendet werden soll: die ip des eigenen routers,&lt;br /&gt;
# &#039;&#039;nat-upnp&#039;&#039; -&amp;gt; wenn nat-upnp verwendet werden soll: &#039;&#039;true&#039;&#039;,&lt;br /&gt;
# &#039;&#039;applicationId&#039;&#039; &lt;br /&gt;
#:* Wenn man nur den SmartHome-Skill verwenden möchte, kann dieser Eintrag leer bleiben.&lt;br /&gt;
#:* Ansonsten ist er mit der SkillID des Alexa Custom Skills zu belegen, siehe Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]]&lt;br /&gt;
# &#039;&#039;oauthClientID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; dem Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
# &#039;&#039;server&#039;&#039; -&amp;gt; IP-Adresse des eigenen FHEM-Servers&lt;br /&gt;
# &#039;&#039;port&#039;&#039; -&amp;gt; Portnummer des eigenen FHEM-Servers&lt;br /&gt;
Beispiel:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;alexa&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Alexa TEST&amp;quot;,&lt;br /&gt;
        &amp;quot;keyFile&amp;quot;: &amp;quot;./key.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;certFile&amp;quot;: &amp;quot;./cert.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;applicationId&amp;quot;: &amp;quot;amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;,&lt;br /&gt;
        &amp;quot;oauthClientID&amp;quot;: &amp;quot;amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;connections&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;server&amp;quot;: &amp;quot;192.168.0.xxx.xxx&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: &amp;quot;8083&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;room=AlexaRoom&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Mehrere Custom Skills lassen sich mit der folgenden Syntax eintragen&lt;br /&gt;
         &amp;quot;applicationId&amp;quot;: [ &amp;quot;amzn1.ask.skill.1&amp;quot; , &amp;quot;amzn1.ask.skill.2&amp;quot; ],&lt;br /&gt;
         &amp;quot;oauthClientID&amp;quot;: [ &amp;quot;amzn1.application-oa2-client.1&amp;quot; , &amp;quot;amzn1.application-oa2-client.1&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
Danach durch Aufruf von &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/syntaxhighlight&amp;gt; den Dienst starten (kein sudo!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unter Windows startet man Alexa-Dienst durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node alexa&amp;lt;/syntaxhighlight&amp;gt; aus der &amp;lt;code&amp;gt;alex-fhem/bin&amp;lt;/code&amp;gt; (also erst z.B. durch &amp;lt;code&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;quot;&amp;lt;/code&amp;gt; ins richtige Verzeichnis kommen)&lt;br /&gt;
&lt;br /&gt;
Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem aus FHEM heraus starten ====&lt;br /&gt;
Zunächst das Start-up-Skript aus diesem Post herunterladen {{Link2Forum|Topic=60244|Message=517271|LinkText=https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271}} und unter /etc/init.d/alexa speichern.&lt;br /&gt;
&lt;br /&gt;
Das Script geht davon aus, das der alexa-fhem script unter /opt/fhem/alexa-fhem liegt, und die logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Nun folgende Kommandos ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo chmod 755 /etc/init.d/alexa&lt;br /&gt;
sudo update-rc.d alexa defaults&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; den User fhem für die Nutzung von sudo zulassen (&amp;lt;code&amp;gt;sudo nano /etc/sudoers&amp;lt;/code&amp;gt;), z.B. durch Anfügen der nachfolgenden Zeile:&lt;br /&gt;
&amp;lt;code&amp;gt;fhem ALL=(ALL) NOPASSWD: ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.Status dummy&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa dummy&lt;br /&gt;
attr FHEM.Alexa event-on-change-reading state&lt;br /&gt;
attr FHEM.Alexa webCmd status:start:stop:restart&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq &amp;quot;start&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa start &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;stop&amp;quot;)&lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa stop &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;restart&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa restart &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;status&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa status &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem als Service (systemd) installieren ====&lt;br /&gt;
Auf neueren Installationen (z.B. RPi Jessie) wird init.d durch systemd ersetzt. Folgend die Anleitung um alexa-fhem als Service zu installieren auf einem Raspberry Pi mit Jessie.&lt;br /&gt;
&lt;br /&gt;
Zunächst einen neuen Benutzer anlegen unter dem alexa-fhem laufen soll, falls man nicht möchtet dass alexa-fhem z.B. mit dem fhem User ausgeführt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd -M --system alexa&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht der Benutzer keine Gruppen, aber man kann den Benutzer auch der Gruppe &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt; hinzufügen (&amp;lt;code&amp;gt;sudo usermod -a -G dialout alexa&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Datei &amp;quot;alexa.service&amp;quot; unter &amp;lt;code&amp;gt;/etc/systemd/system&amp;lt;/code&amp;gt; anlegen:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Node.js Alexa Server &lt;br /&gt;
 After=syslog.target network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=alexa &lt;br /&gt;
 WorkingDirectory=/opt/alexa/alexa-fhem&lt;br /&gt;
 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=10&lt;br /&gt;
 KillMode=process&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target &lt;br /&gt;
&lt;br /&gt;
Den Pfad &amp;lt;code&amp;gt;/home/alexa/.alexa&amp;lt;/code&amp;gt; an die Systemgegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo. &lt;br /&gt;
&lt;br /&gt;
Im WorkingDirectory wird der alexa Dienst die Zertifikate suchen.&lt;br /&gt;
&lt;br /&gt;
Achtung: Natürlich muss der Benutzer auch Zugriff sowohl auf das Verzeichnis mit der config als auch das alexa-fhem Verzeichnis und das WorkingDirectory haben.&lt;br /&gt;
&lt;br /&gt;
Um den Service zu aktiveren und zu starten helfen folgende Befehle:&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable alexa&lt;br /&gt;
 sudo systemctl start alexa&lt;br /&gt;
&lt;br /&gt;
Status abfragen mit&lt;br /&gt;
 sudo systemctl status alexa&lt;br /&gt;
&lt;br /&gt;
Log einsehen?&lt;br /&gt;
 sudo journalctl -u alexa&lt;br /&gt;
&lt;br /&gt;
(mit &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; kann man den follow Modus aktivieren, wie &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;).&lt;br /&gt;
Bei einen reboot startet alexa-fhem jetzt automatisch.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem testen ====&lt;br /&gt;
Node.Js stellt einen Web-Server am Port 3000 bereit, das oben erzeugte Zertifikat sichert diesen Zugang per SSL ab. Durch Aufruf der Adresse&lt;br /&gt;
&amp;lt;code&amp;gt;https://&amp;lt;IP-Adresse des Servers&amp;gt;:3000&amp;lt;/code&amp;gt; kann man testen, ob der Alexa-Fhem Service läuft - der Seitenaufruf liefert eine Zeile JSON-Code, beginnend mit&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;header&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;UnsupportedOperationError&amp;quot;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Device anlegen ===&lt;br /&gt;
Das Modul 39_alexa.pm stellt innerhalb von FHEM verschiedene Attribute z.B. alexaName oder alexaRoom zur Verfügung. Manche dieser Attribute (wie z.b. alexaName) werden in beiden Skills verwendet, andere werden ausschließlich bei einer Nutzung des Alexa Custom Skill verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Alexa Device geschieht durch die nachfolgende Definition:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skills ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Security Profile anlegen ====&lt;br /&gt;
Die Erzeugung eines Sicherheitsprofils muss nur einmal erfolgen, es wird dann für alle weiteren Skills verwendet.&lt;br /&gt;
# Nach der Anmeldung Auswahl von &#039;&#039;APPS &amp;amp; SERVICES&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend auswählen &#039;&#039;Security Profiles&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-05-apps_and_services_-_security_profiles.png|200px]]&lt;br /&gt;
# Auswählen &#039;&#039;Create a New Security Profile&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-06-apps_and_services_-_create_a_new_security_profile.png|200px]]&lt;br /&gt;
# Dann einen Namen und eine Beschreibung für das Profil eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-07-apps_and_services_-_security_profile_management.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Login with Amazon =====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo &#039;&#039;Client Id&#039;&#039; und &#039;&#039;Client Secret&#039;&#039; zu finden sind}}&lt;br /&gt;
# Oben rechts auf &#039;&#039;Login with Amazon&#039;&#039; klicken.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-08-login_with_amazon.png|200px]]&lt;br /&gt;
# Auf der neu geladenen Seite auswählen &#039;&#039;Sign up&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-09-login_with_amazon_-_sign_up.png|200px]]&lt;br /&gt;
# Anschließend im Dropdown Menü das vorher angelegte Profil auswählen und mit &#039;&#039;Confirm&#039;&#039; bestätigen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-10-login_with_amazon_-_create_new_profile.png|200px]] [[Datei:Developer.amazon.com-11-login_with_amazon_-_create_new_profile2.png|200px]]&lt;br /&gt;
# Im folgenden Fenster die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496] eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen. &#039;&#039;&#039;Todo Erklärungsbedarf: WARUM diese Adresse&#039;&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]&lt;br /&gt;
# Anschließend bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad klicken und &#039;&#039;Web Settings&#039;&#039; auswählen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]&lt;br /&gt;
# Im neu geladenen Fenster anklicken von &#039;&#039;Edit&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-14-login_with_amazon_-_edit.png|200px]]&lt;br /&gt;
# Anschließend bei &#039;&#039;Allowed Return URLs&#039;&#039; die folgenden drei Adressen eingeben. &#039;&#039;xxx&#039;&#039; muss hierbei durch den Wert ersetzt werden, der in den beiden Abschnitten [[#SmartHome_Skill_anlegen | SmartHome Skill anlegen]] bzw. [[#Custom_Skill_anlegen | Custom Skill anlegen]] jeweils unter Punkt 4 (Seite &#039;&#039;Configuration&#039;&#039;) bei &#039;&#039;Redirect Urls&#039;&#039; am Ende der URLs angezeigt wird&lt;br /&gt;
## [https://layla.amazon.co.uk/api/skill/link/xxx https://layla.amazon.co.uk/api/skill/link/xxx]&lt;br /&gt;
## [https://pitangui.amazon.com/api/skill/link/xxx https://pitangui.amazon.com/api/skill/link/xxx]&lt;br /&gt;
## [https://layla.amazon.com/api/skill/link/xxx https://layla.amazon.com/api/skill/link/xxx]&lt;br /&gt;
.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-15-login_with_amazon_-_allowed_return_urls.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Skills bearbeiten ====&lt;br /&gt;
# Im Menü den Punkt &#039;&#039;ALEXA&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend im Feld &#039;&#039;Alexa Skills Kit&#039;&#039; auf &#039;&#039;Get started&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== SmartHome Skill anlegen =====&lt;br /&gt;
# Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&lt;br /&gt;
# Auf der folgenden Seite eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
#:* &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;SmartHome Skill API&#039;&#039; &lt;br /&gt;
#:* &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Basic&amp;quot;)&lt;br /&gt;
#:* &#039;&#039;Payload Version&#039;&#039; -&amp;gt; &#039;&#039;v2 (other devices)&#039;&#039; &amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-19-alexa_-_alex_skills_kit_-_skill_information.png|200px]]&lt;br /&gt;
# Die folgende Seite einfach mit &#039;&#039;Next&#039;&#039; überspringen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-20-alexa_-_alex_skills_kit_-_interaction_model.png|200px]]&lt;br /&gt;
# Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben:&lt;br /&gt;
#:* &#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; ist vorausgewählt und kann nicht geändert werden.&lt;br /&gt;
#:* &#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld die ARN aus Abschnitt [[#ARN_der_AWS_Lambda_Funktion_bestimmen | AWS Lambda Funktion]] eintragen. &lt;br /&gt;
#:* &#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt;    (wörtlich 1:1 eintragen)&lt;br /&gt;
#:* &#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&lt;br /&gt;
#:* &#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&lt;br /&gt;
#:* &#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-21-alexa_-_alex_skills_kit_-_configuration.png|200px]] [[Datei:Developer.amazon.com-22-alexa_-_alex_skills_kit_-_test.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Custom Skill anlegen =====&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Auf der folgenden Seite (&#039;&#039;Skill Information&#039;&#039;) die nachstehenden Daten eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;Custom Interaction Model&#039;&#039; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Advanced&amp;quot;. Dieser wird in der Alexa App unter &amp;quot;Meine Skills&amp;quot; angezeigt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Invocation Name&#039;&#039; -&amp;gt; Aufruf des Skills, unter dem dieser später gestartet wird. Z.B. &amp;quot;Alexa, starte James&amp;quot;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_2.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Interaction Model&#039;&#039; folgende Eingaben tätigen und mit &#039;&#039;Next&#039;&#039; abschließen&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In einem separaten Browserfenster FHEM aufrufen, und für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen. Es erscheint ein Popup-Fenster mit ziemlich vielen Zeilen.&lt;br /&gt;
&amp;lt;li&amp;gt;In die Box &#039;&#039;Intent Schema&#039;&#039; kopiert man den ersten Teil dieser FHEM-Ausgabe hinein, also:&amp;lt;br/&amp;gt;&amp;lt;blockquote&amp;gt;&lt;br /&gt;
 { &lt;br /&gt;
   &amp;quot;intents&amp;quot; : [ &lt;br /&gt;
    &amp;lt;hier ziemlich viele Zeilen&amp;gt;  &lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Nun die &#039;&#039;Custom Slot Types&#039;&#039; einrichten. Dazu muss aus dem zweiten Teil der FHEM-Ausgabe jeweils der Slot-Type (z.B. &amp;lt;code&amp;gt;FHEM_article&amp;lt;/code&amp;gt;) in das Feld &#039;&#039;TYPE&#039;&#039; eingetragen werden, das nach dem Anklicken von &#039;&#039;Add Slot Type&#039;&#039; erscheint. In das darunter liegende größere Textfeld kommen die möglichen Werte für diesen Slot, so wie sie aus der FHEM-Ausgabe abzulesen sind. Dann mit &#039;&#039;Save&#039;&#039; sichern. Als Custom Slot Type erscheint dann für diesen Beispiel-Slot&lt;br /&gt;
 FHEM_article 	der | die | das | den&lt;br /&gt;
d.h., die Zeilenumbrüche bei den möglichen Werten werden als &amp;quot;|&amp;quot; dargestellt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hier muss nun ein Bruch im Arbeitsfluss durchgeführt werden, denn bei der Erstellung des Custom Skills kommt es auf die Reihenfolge der Einträge an. Deshalb zunächst diese FHEM-Ausgabe schließen, und für dasselbe FHEM-Device &amp;lt;code&amp;gt;get MyAlexa customSlotTypes&amp;lt;/code&amp;gt; ausführen. Auch diese Ausgabe wird, wie oben beschriebeen, in Custom Slot Types eingetragen (erst der TYPE, dann die möglichen Werte)&lt;br /&gt;
&amp;lt;li&amp;gt;Anschließend erneut die FHEM-Ausgabe schließen und erneut  für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
&amp;lt;li&amp;gt;Unter &#039;&#039;Sample Utterances&#039;&#039; nun den Text aus dem dritten Teil dieser FHEM-Ausgabe hineinkopieren&amp;lt;br /&amp;gt;[[Datei:CustomSkill_5.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben und mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld den Wert aus Abschnitt [[#AWS_Lambda_Funktion_anlegen | AWS Lambda Funktion anlegen]] (Punkt 12) eintragen. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Do you allow users to create an account or link to an existing account with you?&#039;&#039; -&amp;gt; &#039;&#039;Yes&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt; (wörtlich 1:1 eintragen)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Beim Sichern dieser Seite mit &#039;&#039;Next&#039;&#039; kann es zu einer Fehlermeldung kommen, wenn man seine Skill-Definitionen mit dem einfachen SmartHome-Skill begonnen hat. Deshalb muss noch der entsprechende Trigger für die [[#AWS_Lambda-Funktion | AWS Lambda Funktion]] nachgetragen werden, dies wird in Abschnitt [[#Trigger_f.C3.BCr_Custom_Skill_hinzuf.C3.BCgen | Trigger für Custom Skill hinzufügen]] beschrieben.&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:CustomSkill_6.PNG|400px]] [[Datei:CustomSkill_7.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Testen ====&lt;br /&gt;
Hat man den Custom Skill angelegt, bietet dieser auch eine komfortable Testmöglichkeit. Dazu wählt man in der Übersichtsseite &#039;&#039;All Skills&#039;&#039; den Button &#039;&#039;Edit&#039;&#039; des Alexa Custom Skill aus. Auf der nachfolgenden Seite dann links &#039;&#039;Test&#039;&#039;. &lt;br /&gt;
Die Testseite enthält &lt;br /&gt;
* ein Feld &#039;&#039;Voice Simulator&#039;&#039;, mit dem man die Sprachsausgabe testen kann, &lt;br /&gt;
* ein Feld &#039;&#039;Service Simulator&#039;&#039;, mit dem die Verarbeitung von Alexa-Kommandois getestet werden kann. Hier kann man z.B. eintragen&lt;br /&gt;
 &amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Siebenundzwanzig Uhr&amp;quot;&lt;br /&gt;
 &amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
==== Skill Id bestimmen ====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die &#039;&#039;Alexa Skill Id&#039;&#039; zu finden ist}}&lt;br /&gt;
Für das [[#AWS_Lamba_Funktion_anlegen | Anlegen einer &#039;&#039;AWS Lambda Funktion&#039;&#039;]] bzw für die [[#Alexa-Fhem_konfigurieren | Konfiguration von Alexa-Fhem]] wird die &#039;&#039;Alexa Skill Id&#039;&#039; benötigt. An diese kommt man wie folgt:&lt;br /&gt;
# Anmelden wie unter [[#Alexa_Skills | Alexa Skills]] beschrieben.&lt;br /&gt;
# Menüpunkt &#039;&#039;ALEXA&#039;&#039; auswählen, wie [[#Skills_bearbeiten | Skills bearbeiten]] erklärt.&lt;br /&gt;
# Beim gewünschten Eintrag auf &#039;&#039;Edit&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]&lt;br /&gt;
# Die Id, die nun oben angezeigt wird, ist die gesuchte. Sie hat typischerweise das Format &amp;lt;code&amp;gt;amzn1.ask.skill.[Zahlen und Bindestriche]&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AWS Lambda Funktion ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-01-site.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-02-login.png|200px]]&lt;br /&gt;
# Den Punkt &#039;&#039;Lambda&#039;&#039; links auf der Startseite auswählen, bzw. im Menü &#039;&#039;Services&#039;&#039; unter &#039;&#039;Compute&#039;&#039; den Menüpunkt &#039;&#039;Lambda&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-03-lambda.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== AWS Lambda Funktion anlegen ====&lt;br /&gt;
# Für eine erste Lambda-Funktion den Punkt &#039;&#039;Get Started Now&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]&lt;br /&gt;
# Den Blueprint &#039;&#039;Blank function&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]&lt;br /&gt;
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Smart Home&#039;&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]&lt;br /&gt;
## Achtung, es ist möglich, dass dabei &#039;&#039;Alexa Smart Home&#039;&#039; überhaupt nicht angeboten wird. Dann bitte ganz rechts oben in der Ecke nachsehen, welche Region bzw. welches Land ausgewählt ist. Empfohlen wird, &#039;&#039;Ireland&#039;&#039; auszuwählen. Dann erscheint bei den Funktionen auch &#039;&#039;Alexa Smart Home&#039;&#039;.&lt;br /&gt;
# Bei &#039;&#039;Application Id&#039;&#039; den Wert eintragen, dessen Ermittlung im Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]] beschrieben wird, den Haken bei &#039;&#039;Enable trigger&#039;&#039; setzen und mit &#039;&#039;Next&#039;&#039; bestätigen &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]&lt;br /&gt;
# Auf der Konfigurationsseite eingeben:&lt;br /&gt;
## &#039;&#039;Name&#039;&#039; -&amp;gt; &#039;&#039;FHEM&#039;&#039;&lt;br /&gt;
## &#039;&#039;Runtime&#039;&#039; -&amp;gt; Node.js 4.3. &lt;br /&gt;
## &#039;&#039;Role&#039;&#039; -&amp;gt; &#039;&#039;Choose an existing role&#039;&#039; &lt;br /&gt;
### Achtung: wenn es noch keine existing role gibt, zuerst &#039;&#039;Create a custom role&#039;&#039; -&amp;gt; in dem Popup dann &#039;&#039;lambda_basic_execution&#039;&#039; auswählen und auf &#039;&#039;Allow&#039;&#039; klicken sowie bei &#039;&#039;Existing role&#039;&#039; dann &#039;&#039;x&#039;&#039; wählen.&lt;br /&gt;
# Auf der Code-Seite ist im großen Textfeld dann der Code aus der Datei &#039;&#039;lambda.js&#039;&#039; im Paket [[#Alexa-Fhem_installieren | Alexa-Fhem]] vollständig einzufügen. Dabei muss der vorhandene Code im Texteil komplett gelöscht, der Teil aus der &#039;&#039;lamda.js&#039;&#039; eingefügt und noch der Hostname im Quellcode an den eigenen Hostnamen angepasst werden. &lt;br /&gt;
# Anschließend alles mit &#039;&#039;Next&#039;&#039; bestätigen.&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-07-configure_function.png|200px]]&lt;br /&gt;
# Auf der Übersichtsseite dann &#039;&#039;Create function&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-08-review.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Trigger für Custom Skill hinzufügen ====&lt;br /&gt;
Editiert man eine Lambda-Funktion, werden auf der Seite &#039;&#039;Triggers&#039;&#039; diejenigen Dienste angezeigt, die diese Funktion aufrufen.&lt;br /&gt;
* Hier taucht der Trigger &#039;&#039;Alexa Smart Home&#039;&#039; zusammen mit der &#039;&#039;Application Id&#039;&#039; auf, der bei der Einrichtung des SmartHome-Skills eingetragen wurde.&lt;br /&gt;
* Zur Verbindung mit dem Custom Skill ist es nötig, einen zweiten Trigger hinzuzufügen. Durch Anklicken von &#039;&#039;Add Trigger&#039;&#039; wird eine Auswahlseite eingeblendet. Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Skills Kit&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&lt;br /&gt;
&lt;br /&gt;
==== ARN der AWS Lambda Funktion bestimmen ====&lt;br /&gt;
# Auf der Übersichtsseite oben links den Menüpunkt &#039;&#039;Functions&#039;&#039; aúswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-09-go_overview.png|200px]]&lt;br /&gt;
# Anschließend den Radiobutton der angelegten Funktion &#039;&#039;FHEM&#039;&#039; markieren und im Menü &#039;&#039;Action&#039;&#039; den Punkt &#039;&#039;Show ARN&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]&lt;br /&gt;
# Es wird nun eine ARN Adresse angezeigt, die für den Abschnitt [[#SmartHome_Skill_anlegen| SmartHome Skill anlegen]] benötigt wird&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-2-arn.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Absichern des Zugriffs ===&lt;br /&gt;
Natürlich muss der Zugriff auf den von Alexa-Fhem verwendeten Port (default: 3000, Bestandteil des Codes in der AWS Lambda-Funktion) durch die Firewall freigeschaltet werden (auf einer FritzBox unter &amp;quot;Portfreigaben&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== Absicherung direkt in Alexa-FHEM ====&lt;br /&gt;
Die Kommunikation zwischen Amazon AWS und Alexa-FHEM ist auf die folgenden Arten gesichert:&lt;br /&gt;
* Die Verbindung erfolgt per HTTPS&lt;br /&gt;
* Es werden nur Verbindung angenommen auf denen ein gültiges Alexa-Event gesendet wird. &lt;br /&gt;
* Es werden nur Verbindungen angenommen die ein gültiges und noch nicht abgelaufenes OAuth-Token enthalten. Jedes neue Token wird live bei Amazon auf Gültigkeit geprüft.    &lt;br /&gt;
* Es werden nur Verbindungen mit lokal konfigurierter Skill-ID angenommen.&lt;br /&gt;
* Es ist nicht möglich von außen beliebige FHEM Kommandos zu senden. Die FHEM Kommandos werden nur lokal erzeugt.&lt;br /&gt;
&lt;br /&gt;
Wer möchte kann Alexa-FHEM natürlich noch weiter absichern. Es gilt aber, dass nicht jedes zusätzliche Glied in der Kette die Sicherheit sondern unter Umständen nur die Angriffsfläche erhöht. Ein falsch konfigurierter und nach aussen offener Apache (oder anderer ReverseProxy) ist unter Umständen ein größeres Risiko als Alexa-FHEM alleine.&lt;br /&gt;
&lt;br /&gt;
==== Absicherung per ReverseProxy ====&lt;br /&gt;
&amp;lt;s&amp;gt;Die Kommunikation zwischen Amazon und FHEM ist wegen der Verwendung von SSL schon verschlüsselt - prinzipiell kann aber jeder von außen mit Alexa-Fhem kommunizieren. Man sollte sich deshalb im Klaren darüber sein, dass dies eine Sicherheitslücke darstellt:&amp;lt;/s&amp;gt; Jeder offene Port verleitet zu Angriffen, und mit zunehmender Verbreitung von Alexa steigt auch das Risiko. Es wird deshalb empfohlen, vor den eigentlichen Alexa-Server zur Absicherung einen Apache-Webserver als ReverseProxy zu setzen. Nicht nur ist der Apache eine hervorragend stabile und seit Jahrzehnten getestete Software, sondern die Konfiguration als ReverseProxy erlaubt auch, den Zugriff auf den Alexa-Fhem-Rechner auf die Amazon-Maschinen zu beschränken.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung: Dies ist keine allgemeine Anleitung in Sachen Computersicherheit.&#039;&#039;&#039; Im Folgenden gehen wir davon aus, dass &lt;br /&gt;
* Grundbegriffe wie Firewall, IP-Ports, SSL und Dynamic DNS vertraut sind&lt;br /&gt;
* Ein Apache Webserver (idealerweise auf einer zweiten Maschine) bereits installiert ist und die Konfiguration verstanden wurde (wenn nicht: Es gibt im Netz &#039;&#039;tausende&#039;&#039; von Anleitungen dafür...)&lt;br /&gt;
* Ein Servername von einem DynDNS-Anbieter - sagen wir &#039;&#039;myhome.is-my-castle.com&#039;&#039; - bereits von &#039;&#039;außen&#039;&#039; auf unser SmartHome zeigt.&lt;br /&gt;
* Alexa-Fhem in einer der oben beschriebenen Basiskonfigurationen läuft, d.h. der Zugriff auf &amp;lt;code&amp;gt;https://myhome.is-my-castle.com:3000&amp;lt;/code&amp;gt; ergibt, wie im Punkt [[#Alexa-Fhem_testen|Alexa-Fhem testen]] beschrieben, eine Antwort des Node.js Servers.&lt;br /&gt;
&lt;br /&gt;
Als erster Schritt zur Absicherung muss das ReverseProxy Modul für den Apache installiert und mit &amp;lt;code&amp;gt;a2enmod&amp;lt;/code&amp;gt; aktiviert werden, hierzu sei auf [https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension diese Anleitung] verwiesen. Der zweite Schritt besteht darin, den SSL-Zugriff durch ein Passwort abzusichern. Dazu wird auf dem Apache-Rechner das Programm &lt;br /&gt;
 htpasswd &amp;lt;passwdfile&amp;gt; &amp;lt;username&amp;gt;&lt;br /&gt;
ausgeführt, das Programm fragt dann nach dem gewünschten Passwort. Wir nehmen im Folgenden an, dass das Passwortfile &#039;&#039;/etc/apache2/htpasswd&#039;&#039; ist, der gesetzte Username &#039;&#039;alexa&#039;&#039; lautet und das Passwort &#039;&#039;my_smarthome&#039;&#039; ist.&lt;br /&gt;
&lt;br /&gt;
Im dritten Schritt wird nun in das Apache-Konfigurationsfile die Weiterleitung auf den eigentlichen Alexa-Fhem-Rechner eingetragen. Dazu wählen wir, dass von außen der Standard-SSL-Port 443 benutzt werden soll, sowie als Verzeichnisname &#039;&#039;/alexa&#039;&#039;. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; Dieser Code soll &#039;&#039;&#039;nicht&#039;&#039;&#039; in die Default-Konfiguration des Apache-Webservers. Sondern in eine separate Datei (Dateiname z.B. &amp;quot;fhem&amp;quot;), die ins Unterverzeichnis /etc/apache2/conf.d gestellt wird.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
  ServerName myhome.is-my-castle.com&lt;br /&gt;
  SSLEngine on&lt;br /&gt;
  SSLProxyEngine on&lt;br /&gt;
  SSLProxyCheckPeerCN off&lt;br /&gt;
  SSLProxyCheckPeerName off&lt;br /&gt;
  SSLCertificateKeyFile /etc/apache2/mycert/server.key&lt;br /&gt;
  SSLCertificateFile /etc/apache2/mycert/server.crt&lt;br /&gt;
 &amp;lt;Location /alexa&amp;gt;&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthName &amp;quot;Authentication Required&amp;quot;&lt;br /&gt;
  AuthUserFile &amp;quot;/etc/apache2/htpasswd&amp;quot;&lt;br /&gt;
  Require valid-user&lt;br /&gt;
  ProxyPass https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  ProxyPassReverse https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  Order deny,allow&lt;br /&gt;
  Allow from All&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 (... Hier eventuell weitere Umleitungen)&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
Nach einem Neustart des Apache-Servers, dem Schließen des Ports 3000 in der Firewall sowie dem Öffnen des Ports 443 ist der Alexa-Fhem-Rechner von außen nur noch erreichbar durch den Aufruf von &amp;lt;code&amp;gt;https://myhome.is-my-castle.com/alexa&amp;lt;/code&amp;gt; und verlangt unmittelbar die Eingabe von Username und Passwort.&lt;br /&gt;
&lt;br /&gt;
Der vierte Schritt ist nun, den Code der AWS Lambda-Funktion an fünf Stellen zu verändern&lt;br /&gt;
 &#039;&#039;&#039;const PORT=443;&#039;&#039;&#039;&lt;br /&gt;
 const HOST=&#039;myhome.is-my-castle.com&#039;;&lt;br /&gt;
 &#039;&#039;&#039;const PATH=&#039;/alexa&#039;;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;const AUTH=&#039;alexa:my_smarthome&#039;;&#039;&#039;&#039;&lt;br /&gt;
 // entry&lt;br /&gt;
 exports.handler = function(event, context, callback) {&lt;br /&gt;
  console.log(`EVENT: ${event}`);&lt;br /&gt;
  console.log(`CONTEXT: ${context}`);  &lt;br /&gt;
  var post_data = JSON.stringify(event);&lt;br /&gt;
  var options = {&lt;br /&gt;
    hostname: HOST,&lt;br /&gt;
    port: PORT,&lt;br /&gt;
    //family: 6,&lt;br /&gt;
    &#039;&#039;&#039;path: PATH,&#039;&#039;&#039;&lt;br /&gt;
    method: &#039;POST&#039;,&lt;br /&gt;
    &#039;&#039;&#039;auth: AUTH,&#039;&#039;&#039;&lt;br /&gt;
    rejectUnauthorized: false, // accept self-signed&lt;br /&gt;
 (etc., Rest des Codes wie gehabt)&lt;br /&gt;
Natürlich muss der Zugriff getestet werden. Bei Beachtung aller dieser Schritte werden alle un-autorisierten Zugriffe von außen abgewehrt. Eine noch weiter gehende Sicherung ist möglich, dazu kann in der Serverkonfiguration der Zugriff auf die Amazon-Domains beschränkt werden. Das ganze Alexa-System ist aber noch in konstanter Weiterentwicklung, diese Domain-Namen können sich also noch ändern.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung in der Alexa App==&lt;br /&gt;
Nachdem die Alexa Skills angelegt wurden, müssen diese noch in der Alexa App eingerichtet werden.&lt;br /&gt;
Dafür jeweils per Desktop-Browser auf [http://alexa.amazon.de alexa.amazon.de] anmelden, nicht die App unter iOS oder Android verwenden. Diese hat Probleme mit der OAuth Verknüpfung.&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skill ===&lt;br /&gt;
# Auf &#039;&#039;Skills&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Oben rechts &#039;&#039;Meine Skills&#039;&#039;  bzw. &#039;&#039;Ihre Skills&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]&lt;br /&gt;
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]&lt;br /&gt;
# Oben Rechts in den Details des Skills auf &#039;&#039;Skill aktivieren&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]&lt;br /&gt;
# In dem neu geöffneten Fenster die Autorisierung bestätigen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]&lt;br /&gt;
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein &amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-06-success.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Geräte ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden&lt;br /&gt;
# Auf &#039;&#039;Smart Home&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Geräte suchen&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-07-Gerätesuche.png|200px]]&lt;br /&gt;
# Wurde soweit alles korrekt eingerichtet, werden nun die gefundenen Geräte angezeigt.&lt;br /&gt;
&lt;br /&gt;
Tip: Es macht Sinn, unter &#039;&#039;Meine Gruppen&#039;&#039; Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. &amp;quot;Licht&amp;quot;) haben.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung unter FHEM ==&lt;br /&gt;
Im Folgenden werden exemplarisch ein paar Geräte beschrieben, die man nutzbringend mit FHEM einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Custom Skills übersetzt die Kombination der Attribute &#039;&#039;alexaMapping&#039;&#039; und &#039;&#039;homebridgeMapping&#039;&#039; Sprachbefehle (&amp;quot;Intents&amp;quot;) in gerätespezifische Kommandos. &lt;br /&gt;
* Das Attribut alexaMapping wird am Alexa-Device gesetzt und dient dazu, erkannte Sprachkommandos in abstrakte Characteristiken zu überführen. Für den einfacheren SmartHome Skill hat darum das Attribut &#039;&#039;alexaMapping&#039;&#039; keine Bedeutung, sondern nur der &#039;&#039;genericDeviceType&#039;&#039; des zu steuernden Gerätes.&lt;br /&gt;
* Das Attribut homebridgeMapping wird für beide Skills am zu steuernden Gerät gesetzt und übersetzt diese Charakteristiken in die konkreten Befehle, die das Gerät versteht. Der inhalt des Attributs wird von links nach rechts ausgewertet und ist wie folgt aufgebaut:&lt;br /&gt;
** Das Attribut enthält eine durch Leerzeichen getrennte Liste aus Konfigurationen für jeweils eine Characteristik&lt;br /&gt;
** Jede einzelne der Characteristik-Konfigurationen besteht aus dem Namen der Characteristik, gefolgt von &amp;quot;=&amp;quot; und einer kommaseparierten Liste von Parametern.&lt;br /&gt;
  attr &amp;lt;device&amp;gt; homebridgeMapping &amp;lt;Characteristic1&amp;gt;=&amp;lt;param1.1&amp;gt;,&amp;lt;param1.2&amp;gt;,... &amp;lt;Characteristic2&amp;gt;=&amp;lt;param2.1&amp;gt;,&amp;lt;param2.2&amp;gt;,...&lt;br /&gt;
** Jeder Parameter besteht entweder aus&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;cmd&amp;gt;:&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&amp;lt;/code&amp;gt;, hier können nicht verwendete Elemente von links nach rechts weg gelassen werden.&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;=&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;, hier kann &amp;lt;code&amp;gt;&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt; entweder ein Wert oder semikolonseparierte Liste sein.&lt;br /&gt;
*** Oder dem schlüsselwort &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;, welches alle vorhandenen (default) Parameter dieser Characteristik löscht. &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt; kann auch an Stelle einer ganzen Characteristik-Konfiguration stehen&lt;br /&gt;
Weiter führende Dokumentation zum homebridgeMapping findet sich unter https://forum.fhem.de/index.php/topic,48558.0.html&lt;br /&gt;
&lt;br /&gt;
=== Einfacher Schalter ===&lt;br /&gt;
* Ein einfacher Schalter, der die set-Kommandos &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039; kennt, kann direkt mit Alexa-Fhem gekoppelt werden &lt;br /&gt;
* Für kompliziertere Aktionen, etwa das Übermitteln eines spezifischen Schaltbefehls an FHEM, ist die Einrichtung eines Dummies zu empfehlen. &lt;br /&gt;
Ob Dummy oder nicht, wichtig sind die drei fett gedruckten Zeilen&lt;br /&gt;
 define Alexa.Party dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaName party&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Party group AlexaGeräte&lt;br /&gt;
 attr Alexa.Party room AlexaRoom&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party setList on off&#039;&#039;&#039;&lt;br /&gt;
Selbstverständlich kann man diesen Dummy mit einem notify oder DOIF abfangen, um die gewünschte Schaltaktion auszuführen. &lt;br /&gt;
&lt;br /&gt;
Ein Alternative zum Dummy ist das Anlegen eines readingsProxy, dem die entsprechenden Attribute gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Weil es sich hierbei um eines der einfachen Geräte handelt, die Alexa selbst im SmartHome Skill bearbeiten kann, ist auch der zweite Schritt bei der Einrichtung in der Alexa App sinnvoll: Der Schalter wird dann im Bereich Smart Home der Alexa App erkannt. Wer ihn auch mit dem Custon Skill bedienen möchte, muss natürlich Sorge tragen, dass der Alexa-Name &#039;&#039;party&#039;&#039; bei den FHEM_Devices auftaucht und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sind (siehe Abschnitt [[##Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
=== Wecker ===&lt;br /&gt;
Dieses Gerät kann man nur mit dem Custom Skill bedienen, es wird also &#039;&#039;&#039;nicht&#039;&#039;&#039; im Bereich Smart Home der Alexa App auftauchen. Wir richten einen Dummy ein, wichtig sind wieder die fett gedruckten Zeilen:&lt;br /&gt;
 define Alexa.Weckzeit dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaName weckzeit&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit genericDeviceType clock&lt;br /&gt;
 attr Alexa.Weckzeit group AlexaGeräte&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit room AlexaRoom&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit setList Weckzeit:time&#039;&#039;&#039;&lt;br /&gt;
Das Attribut &#039;&#039;genericDeviceTye&#039;&#039; ist nicht wichtig, weil es ein generisches Device dieser Art gar nicht gibt. Wichtig hingegen ist das Attribut &#039;&#039;homebridgeMapping&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Für das Gerät &#039;&#039;MyAlexa&#039;&#039;, das in Abschnitt definiert wurde, muss im Attribut &#039;&#039;alexaMapping&#039;&#039; auftauchen&lt;br /&gt;
 Weckzeit=verb=stelle,valuePrefix=für;auf,values=AMAZON.TIME,valueSuffix=uhr&lt;br /&gt;
Darüber hinaus muss der Alexa-Name &#039;&#039;weckzeit&#039;&#039; bei den FHEM_Devices auftauchen und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sein (siehe Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
Der Aufruf dieses Gerätes mit Alexa erfolgt dann z.B. mit den Sätzen&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Uhr Siebenundzwanzig&amp;quot;&lt;br /&gt;
&amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
Zur weiteren Bearbeitung kann man jetzt mit einem DOIF Statusänderungen des Dummies abfangen und durch eine kleine Helperfunktion ins &amp;quot;echte&amp;quot; FHEM weiterleiten.&lt;br /&gt;
  define Alexa.Weckzeit.N DOIF ([&amp;quot;Alexa.Weckzeit:.*&amp;quot;])({AlexaHelper(&amp;quot;Alexa.Weckzeit&amp;quot;,&amp;quot;$EVENT&amp;quot;)}) &lt;br /&gt;
Die Helperfunktion (z.B. in 99_myUtils.pm) stellt aus der übergebenen Zeit (immer im Format dd:mm) eine sprachkompatible Nachricht $nc und einen mit den FHEM-Zeitangaben kompatiblen String $nt zusammen und reicht beide an eine Routine &#039;&#039;changeWakeTime&#039;&#039; weiter (dokumentiert in den [https://www.dpunkt.de/buecher/12387/9783960090120-smarthome-hacks.html Smart Home Hacks]).&lt;br /&gt;
 sub AlexaHelper($$){&lt;br /&gt;
  my ($name,$event)=@_;&lt;br /&gt;
  if( $name eq &amp;quot;Alexa.Weckzeit&amp;quot; ){ &lt;br /&gt;
    my ($nc,$nt);&lt;br /&gt;
    #-- volle Stunde----------------------------------------&lt;br /&gt;
    if( $event =~ /(\d+):00/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr&amp;quot;,$1);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:00:00&amp;quot;,$1);&lt;br /&gt;
    #-- nicht volle Stunde---------------------------------&lt;br /&gt;
    }elsif( $event =~ /(\d+):(\d+)/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr %d&amp;quot;,$1,$2);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:%02d:00&amp;quot;,$1,$2);&lt;br /&gt;
    }&lt;br /&gt;
    changeWakeTime(\&#039;GalaxyTab.EG\&#039;,\&#039;$nc\&#039;,\&#039;$nt\&#039;);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lichtszene ===&lt;br /&gt;
Eine Lichtszene wird mit dem Modul LightScene angelegt. Wir gehen davon aus, dass in der Lichtszene die beiden Szenen Alle_An und Alle_Aus, sowie mindestens eine weitere Szene (hier: Sitzgruppe) definiert wurde.&lt;br /&gt;
* Nachfolgend wird ein Beispiel beschrieben, wie man eine Lichtszene mit dem einfachen SmartHome Skill steuern kann. Die verwendeten Kommandos sind dann&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtungsitzgruppe an&amp;quot; -&amp;gt; LightScene Sitzgruppe wird ausgewählt&lt;br /&gt;
...&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung aus&amp;quot; -&amp;gt; LightScene Alle_Aus wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Künftig wird man LightScene mit dem Custom Skill eventuell direkt steuern können - allerdings hat das einen geringeren WAF, als die Steuerung über den SmartHome Skill: Der Einschaltsatz muss dann mindestens lauten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dafür wird es aber auch möglich sein direkt die SzenenNamen im gesprochenen Kommando zu verwenden und so auf die Umwege über dummys und ähnliches zu verzichten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im ersten Schritt wird ein Dummy für die Gesamtbeleuchtung eingerichtet:&lt;br /&gt;
 define Alexa.Beleuchtung dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaName beleuchtung&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
Anschließend wird für jede vorhandene Lichtszene (außer Alle_An und Alle_Aus) ein weiterer Dummy angelegt:&lt;br /&gt;
 define Alexa.Beleuchtung.Sitzgruppe dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaName beleuchtungsitzgruppe&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe genericDeviceType switch&#039;&#039;&#039; &lt;br /&gt;
Die eigentliche Steuerung übernimmt dann ein DOIF&lt;br /&gt;
 define Alexa.Beleuchtung.N DOIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung.Sitzgruppe:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Sitzgruppe,&lt;br /&gt;
  set Alexa.Beleuchtung off,&lt;br /&gt;
   ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSIF&lt;br /&gt;
 ... &amp;lt;weitere on-Events der anderen Szenen werden abgefangen&amp;gt;&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_An,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:off&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_Aus,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
Mit diesem DOIF wird ein Radiobutton simuliert, d.h. wie bei den Stationstasten vor Uralt-Radios sorgt die Auswahl einer Szene immer dafür, dass alle anderen Dummies ausgeschaltet werden.&lt;br /&gt;
Natürlich kann man das auch mit einem kleinen Perl-Programm erreichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zwei andere Ansätze Lichtszenen zu schalten die ohne DOIF auskommen sind im Folgenden beschrieben:&lt;br /&gt;
&lt;br /&gt;
* Wenn es von Interesse ist die Steuerung mit einer Darstellung in FTUI zu verbinden: Statt der oben beschriebenen dummy Devices kann man readingsProxy Devices mit passenden setFn und valueFn analog zum  [[Harmony#Button_f.C3.BCr_eine_bestimmte_Activity_im_Frontend_und_Homekit_.C3.BCber_readingsProxy|diesem Beispiel für harmony aktivitäten]] verwenden.&lt;br /&gt;
&lt;br /&gt;
* Für jede zu schaltende Szene wird ein dummy angelegt dessen homebridgeMapping direkt auf das LightScene Device zeigt:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;dummy&amp;gt; dummy&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; setList on off&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; homebridgeMapping On=&amp;lt;light scene&amp;gt;::state,valueOn=&amp;lt;szene&amp;gt;,cmdOn=scene+&amp;lt;szene&amp;gt;,cmdOff=scene+&amp;lt;szene aus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der zweiten Variante wird davon ausgegangen das der aktuelle status nicht abgefragt oder angezeigt werden soll. Deshalb gibt es keine direkte RadioButton Funktionalität.&lt;br /&gt;
&lt;br /&gt;
== Nutzung ==&lt;br /&gt;
Um den Namen zu bestimmen, unter dem ein Gerät mit Alexa angesprochen wird, verwendet Alexa-Fhem mit absteigender Priorität:&lt;br /&gt;
* das alexaName Attribut&lt;br /&gt;
* das alias Attribut&lt;br /&gt;
* das NAME Internal&lt;br /&gt;
Damit Alexa ein Gerät eindeutig identifizieren kann, sollten eindeutige Gerätenamen verwendet werden, bestehed möglichst aus einem Wort und ohne Ziffern. Wenn Alexa einen Namen nicht versteht, kann man unter [http://alexa.amazon.de/spa/index.html] nachsehen was tatsächlich verstanden wurde und den Gerätenamen ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
=== SmartHome Skill ===&lt;br /&gt;
Gruppen (Räume) müssen in der Alexa App konfiguriert werden. Über das API lassen sich nur der Name und die Schalteigenschaften übergeben.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Einrichtung des SmartHome Skills sollte Alexa mit den folgenden Befehlen nutzbar sein:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; ein”&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; aus”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;wert&amp;gt; prozent”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Skill ===&lt;br /&gt;
Der Custom Skill erlaubt im Gegensatz zum SmartHome Skill eine weitreichende Konfiguration der möglichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=im Forum}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions)&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
====Allgemeiner Hinweis====&lt;br /&gt;
Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein &#039;&#039;http://&#039;&#039; davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
const PORT=3000;&lt;br /&gt;
const HOST=&#039;mein.host.name&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Freigabe von Port 3000====&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von &amp;lt;b&amp;gt;UnityMedia&amp;lt;/b&amp;gt; z.B. funktionieren derzeit leider nicht. Eine möglicher &amp;quot;Workaround&amp;quot; wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276}}&lt;br /&gt;
&lt;br /&gt;
Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können.&lt;br /&gt;
Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.&lt;br /&gt;
&lt;br /&gt;
Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde. &lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter &#039;&#039;Internet -&amp;gt; Freigaben -&amp;gt; Portfreigaben&#039;&#039; statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: &#039;&#039;https://mein.hostname:3000&#039;&#039;. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.&lt;br /&gt;
&lt;br /&gt;
Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.&lt;br /&gt;
&lt;br /&gt;
====Probleme mit node.js - npm install====&lt;br /&gt;
&lt;br /&gt;
Falls eine Fehlermeldung auftritt, dass &amp;quot;npm&amp;quot; nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: [[Homebridge_einrichten#NodeJS_installieren|NodeJS installieren]] sowie [[Homebridge_einrichten#Python.2C_g.2B.2B.2C_MDNS_installieren|Python, g++, MDNS installieren]], siehe auch folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
====Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich====&lt;br /&gt;
Wenn man auf der Konsole angemeldet ist, den Befehl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/syntaxhighlight&amp;gt;eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter [[Homebridge_einrichten#NodeJS_installieren]] nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter [[Alexa-Fhem#Voraussetzungen]] erfüllt sind! Keine Experimente mit Versionen die darunter liegen.&lt;br /&gt;
&lt;br /&gt;
====Fehlermeldung &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039; Fehler angezeigt beim Start von alexa-fhem====&lt;br /&gt;
Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039;, lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
====Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder====&lt;br /&gt;
Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder. &lt;br /&gt;
&lt;br /&gt;
Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; die folgenden Zeilen rauslöschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;nat-pmp&amp;quot;: &amp;quot;10.0.1.1&amp;quot;,&lt;br /&gt;
        &amp;quot;nat-upnp&amp;quot;: true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn alexa-fhem keine Geräte findet?====&lt;br /&gt;
Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut &#039;&#039;genericDeviceType switch&#039;&#039; hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut &#039;&#039;alias&#039;&#039; eine besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann.&lt;br /&gt;
Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?====&lt;br /&gt;
Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:&lt;br /&gt;
* wenn nichts bei alexa-fhem ankommt: port forwarding prüfen&lt;br /&gt;
* wenn lambda.js nichts los wird: im cloudwatch log nachsehen&lt;br /&gt;
* wenn bei lambda.js nichts ankommt: den trigger prüfen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst sollte man sich unter &#039;&#039;http://aws.amazon.com&#039;&#039; das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger.&lt;br /&gt;
Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf &#039;&#039;Triggers&#039;&#039; klicken und mit &#039;&#039;Add trigger&#039;&#039; erneut einen anlegen. Hier muss, wie in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 7, die &#039;&#039;Application Id&#039;&#039; stehen und der Haken bei &#039;&#039;Enable trigger&#039;&#039; gesetzt sein. Dann alexa-fhem neu starten.&lt;br /&gt;
Wenn ihr Änderugen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sein, dass immer noch keine Log im Cloudwatch ([http://docs.aws.amazon.com/de_de/lambda/latest/dg/monitoring-functions-logs.html]) zu sehen ist. In dem Fall hilft es, eine neue Role Policy anzulegen. &lt;br /&gt;
* in der AWS Console [https://console.aws.amazon.com] oben links auf Services klicken, und in der Gruppe &amp;quot;Security, Identity &amp;amp; Compliance&amp;quot; auf IAM klicken&lt;br /&gt;
* links auf Roles klicken&lt;br /&gt;
* Auf dem Knopf &amp;quot;Create Role&amp;quot; klicken&lt;br /&gt;
* AWS Services &amp;gt; Lambda auswählen, unten auf Next:Permissions klicken&lt;br /&gt;
* im Filter / Policy Type,  &amp;quot;log&amp;quot; eintragen (ohne quotes)&lt;br /&gt;
* CloudWatchLogsFullAccess hacken, auf Next:Review unten klicken&lt;br /&gt;
* Name vergeben und mit &amp;quot;Create role&amp;quot; bestätigen&lt;br /&gt;
* Oben links auf Services klicken, und in der Gruppe &amp;quot;Compute&amp;quot;, auf Lambda klicken&lt;br /&gt;
* auf den Name der Funktion klicken&lt;br /&gt;
* Reiter Configuration auswählen&lt;br /&gt;
* in Existing Role, den neukreierten Role auswählen&lt;br /&gt;
* oben auf Save (und Testen wenn gewünscht) klicken.&lt;br /&gt;
Schon sollte eine neue Gruppe im Cloudwatch sichtbar sein. Die Suche von den Devices in Alexa wiederholen, und die Logs analysieren&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Der User in der User= Directive von alexa.service muss Ausführungsrecht auf dem alexa binary haben (x), so wie auch mind. Lesezugriff auf dem Verzeichnis nach -U Option in der ExecStart= Directive und auch auf dem WorkingDirectory }}&lt;br /&gt;
Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei &#039;&#039;alexa&#039;&#039; muss ausführbar sein. Also z.B. so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
die Datei ausführbar machen. Sofern der User &amp;quot;pi&amp;quot; Eigentümer ist, ist kein sudo erforderlich.&lt;br /&gt;
&lt;br /&gt;
Eine lauffähige Konfiguration ist {{Link2Forum|Topic=71612|Message=668383|LinkText=hier}} zu sehen.&lt;br /&gt;
&lt;br /&gt;
Ein Fehler in der Rechtekonfiguration führt in der Regel zu folgendem Ergebnis nach &amp;lt;code&amp;gt;sudo systemctl status alexa&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;   Loaded: loaded (/etc/systemd/system/alexa.service; enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since mer. 2017-09-06 02:33:23 CEST; 3s ago&lt;br /&gt;
  Process: 18332 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa (code=exited, status=217/USER)&lt;br /&gt;
 Main PID: 18332 (code=exited, status=217/USER)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wie kann ich via Alexa-FHEM auf FHEM zugreifen, wenn der Port mit Benutzername/Kennwort geschützt ist?====&lt;br /&gt;
&lt;br /&gt;
Hierzu muss die Datei &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; geöffnet werden und der Abschnitt &amp;quot;connections&amp;quot; um folgende Zeile ergänzt werden:&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;auth&amp;quot;: {&amp;quot;user&amp;quot;: &amp;quot;fhem&amp;quot;, &amp;quot;pass&amp;quot;: &amp;quot;fhempassword&amp;quot;},&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei Verwendung von SSL bei FHEM muss auch noch &amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;ssl&amp;quot;: true,&amp;lt;/pre&amp;gt; hinzugefügt werden&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=22736</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=22736"/>
		<updated>2017-09-25T11:19:50Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Kleine Änderung im Bereich AWS Lambda Funktion anlegen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Alexa-Fhem&#039;&#039;&#039; ist eine in JavaScript geschriebene und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im {{Link2Forum|Topic=60244|LinkText=Forum}} veröffentlicht.&lt;br /&gt;
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModTechName=&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=justme1968&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
===Glossar===&lt;br /&gt;
*Echo bzw. Echo Dot (im Folgenden maskulin bezeichnet) sind die derzeit verfügbaren Geräte des Alexa-Systems &#039;&#039;&#039;BILDER EINSTELLEN - Achtung Urheberrecht&#039;&#039;&#039;&lt;br /&gt;
*AVS ist der Amazon Voice Service, d.h. die Spracherkennungskomponente des Systems.{{Randnotiz|RNTyp=r|RNText=Für die Nutzung der Amazon AWS-Dienste müssen zwingend die Daten einer Kreditkarte angegeben werden. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen. Die Autoren dieser Anleitung und der darin beschriebenen Module übernehmen keine Haftung für eventuelle Kosten, die aus der Nutzung der AWS entstehen. }}&lt;br /&gt;
*AWS sind die Amazon Web Services, also per URL erreichbare Dienste zur Ausführung von Berechnungen etc. Im Rahmen von Alexa-Fhem wird bei AWS eine eigene JavaScript-Funktion hinterlegt, die zur Kommunikation mit dem FHEM-Server dient. Im Jargon von Amazon ist dies eine so genannte Lambda-Funktion &#039;&#039;&#039;WARUM ? Nachlesen bei Amazon&#039;&#039;&#039;.&lt;br /&gt;
*Card bezeichnet einen Eintrag in der Alexa-App, der die erkannte Sprachnachricht sowie weiter gehenden Informationen über die Reaktion von Alexa enzthält und Rückmeldung an Amazon erlaubt.&lt;br /&gt;
*Skill (engl. für Fähigkeit) ist die Bezeichnung für eine per Spracherkennung bediente Funktionalität des Alexa-Systems, z.B. zur Nachrichtenansage, zur Wettervorhersage oder zur Steuerung von FHEM&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
[[Datei:2gpXyLN.jpg|200px|thumb|right|Grafische Darstellung der beteiligten Komponenten]]&lt;br /&gt;
Echo -&amp;gt; AVS -&amp;gt; AWS Lambda -&amp;gt; alexa-fhem -&amp;gt; AWS Lambda -&amp;gt; AVS -&amp;gt; Echo&lt;br /&gt;
 &lt;br /&gt;
*Der Echo (oder ein anderes Alexa/AVS fähiges Gerät)  nimmt Audiodaten auf und schickt diese an AVS  (Amazon Voice Service) zur Erkennung&lt;br /&gt;
*AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den erkannten Daten&lt;br /&gt;
:*Beim Alexa SmartHome Skill sind die möglichen Sätze für die Spracherkennung relativ fest vorgegeben &lt;br /&gt;
:*Beim Alexa Custom Skill kommen die dazu nötigen Informationen aus dem &#039;&#039;Interaction Model&#039;&#039; der Alexa Skills Configuration&lt;br /&gt;
*Das Event wird an den unter &#039;&#039;Configuration&#039;&#039; in der Alexa Skills Configuration hinterlegten Endpoint geschickt&lt;br /&gt;
:*Beim Alexa SmartHome Skill ist das zwingend eine AWS Lambda Routine&lt;br /&gt;
:*Beim Alexa Custom Skill kann das im Prinzip auch ein eigener Web Service sein&lt;br /&gt;
*Das Event wird vom &amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; code an alexa-fhem weitergeleitet&lt;br /&gt;
*alexa-fhem steuert FHEM und sendet ein Antwort-Event zurück&lt;br /&gt;
*&amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; nimmt diese Antwort entgegen und gibt sie an AVS zurück&lt;br /&gt;
*AVS sogt dafür das der Echo &#039;antwortet&#039; und dass die Card in der Alexa App erscheint&lt;br /&gt;
&lt;br /&gt;
===Anmerkungen===&lt;br /&gt;
*Ein Skill hat keinen Zugriff auf die Audiodaten&lt;br /&gt;
*Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und &#039;einfach&#039; Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.&lt;br /&gt;
*Wenn man berücksichtigt welchen Weg die Daten insgesamt gehen, ist es erstaunlich, wie schnell die Reaktion auf einen gesprochenen Satz erfolgt.&lt;br /&gt;
&lt;br /&gt;
=== Abgrenzung des &#039;&#039;&#039;Alexa Smart Home Skills&#039;&#039;&#039; und des &#039;&#039;&#039;Alexa Custom Skills&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Smart_Home|Alexa Smart Home Skill]] ist ein Amazon-Alexa-Standard-Skill, der wesentliche Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein &amp;quot;Alexa, schalte die Wohnzimmerlampe an&amp;quot; um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik &amp;quot;Smart Home&amp;quot; als Skill angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Custom|Alexa Custom Skill]] ist kein Standard-Smart-Home-Skill, sondern ein individuell entwickelter Skill, so wie alle anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik &amp;quot;Smart Home&amp;quot; angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. &amp;quot;Alexa, starte [Name des Skills]&amp;quot;) oder direkt angesprochen wird (z.B. &amp;quot;Alexa, frage [Name des Skills] wie ist der Status von [Device] &amp;quot;). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch werden anspruchsvollere Steuerungsmöglichkeiten nur mit diesem realisiert werden können.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Da die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Während der Konfiguration sollten alle nachfolgenden Abschnitte parallel in gleichzeitig geöffneten Browserfenstern durchgeführt werden, die jeweils bis zum Abschluss geöffnet bleiben müssen. }}&lt;br /&gt;
Grundvoraussetzung für alle folgenden Schritte ist das Vorhandensein eines Amazon-Accounts. Es wird davon ausgegangen, dass die Konten für alle im Folgenden genutzten Amazon-Dienste eingerichtet wurden.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get install build-essential libssl-dev&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss NodeJS installiert werden. Leider ist die Version im Debian Repository deutlich zu alt, daher wird mit den folgenden Befehlen das Node Repository hinzugefügt und NodeJS (in der LTS Version) entsprechend installiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem installieren ===&lt;br /&gt;
&#039;&#039;&#039;Aus gegebenem Anlass: Dies ist weder eine Einführung in Linux, noch eine Anfängerdokumentation für FHEM.&#039;&#039;&#039; Also erst die Grundlagen lernen, und dann mit Alexa beginnen !&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Version ist jeweils  {{Link2Forum|Topic=60244|Message=540117|LinkText=hier}} zu finden.&lt;br /&gt;
&lt;br /&gt;
====Erstinstallation====&lt;br /&gt;
Hier wird die Erstinstallation von Alexa-Fhem beschrieben.&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Die tgz-Datei unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;tar -xvzf dateiname.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;mv package alexa-fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/syntaxhighlight&amp;gt; (kein sudo!). Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Home-Verzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; Insbesondere ist zu beachten, dass dieser Nutzer u.U. im Startskript explizit gesetzt wird. Mit dem untenstehenden Skript ist das &#039;&#039;nicht&#039;&#039; der User fhem, sondern der User &#039;&#039;pi&#039;&#039;. Das Symbol &#039;&#039;~/&#039;&#039; verweist auf das Home-Verzeichnis des Benutzers, der gerade die Installation vornimmt.&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;.alexa/config.json&#039;&#039; kopieren. Achtung: Installiert man alexa-fhem als root-user, zeigt das Symbol &#039;&#039;~/&#039;&#039; auf &#039;&#039;/root&#039;&#039; - und die Konfigurationsdatei wird ggf. bei einem manuellen Start von Alexa-Fhem nicht gefunden.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis kopiert werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
&#039;&#039;Vor&#039;&#039; der Installation von Alexa-Fhem muss man folgende Anwendungen installieren:&lt;br /&gt;
* Node.js (die aktuelle Version findet man unter https://nodejs.org/en/download/)&lt;br /&gt;
* OpenSSL (http://slproweb.com/products/Win32OpenSSL.html oder https://www.heise.de/download/product/win32-openssl-47316/download)&lt;br /&gt;
Erst dann fängt man mit Alexa-Fhem an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Die tgz-Datei im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren.&amp;lt;br/&amp;gt; Bei der Fehlermeldung wie &amp;quot;Der Befehl &amp;quot;npm&amp;quot; ist entweder falsch geschrieben oder konnte nicht gefunden werden.&amp;quot; ist die Installation von Node.js zu überprüfen.&lt;br /&gt;
# SSL Zertifikat erzeugen. Dafür muss man alle Befehle aus dem Skript &#039;&#039;createKey.sh&#039;&#039; nacheinander manuell ausführen. Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken. Der Windows-Welt unbekannter Befehl &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt; ist durch &amp;lt;code&amp;gt;move /y&amp;lt;/code&amp;gt; zu ersetzen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl rsa -in key.pem -out newkey.pem&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;move /y newkey.pem key.pem&amp;lt;/syntaxhighlight&amp;gt; Eventuelle Fehlermeldung &amp;quot;can&#039;t open config file: /usr/local/ssl/openssl.cnf&amp;quot; o.Ä. lässt sich durch Befehl &amp;lt;code&amp;gt;set OPENSSL_CONF=&amp;lt;OpenSSL-Verzeichnis&amp;gt;\bin\openssl.cfg&amp;lt;/code&amp;gt; beheben, wobei &amp;lt;OpenSSL-Verzeichnis&amp;gt; durch den entsprechenden Installationspfad (typischerweise &amp;lt;code&amp;gt;c:\OpenSSL-Win32&amp;lt;/code&amp;gt;) zu ersetzen ist.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Benutzerverzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; In aktuellen Versionen von Windows (ab Windows 7 bzw. ab Windows Server 2008 R2) liegt das Verzeichnis unter &amp;lt;code&amp;gt;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;lt;/code&amp;gt;, also z.B. für Benutzer &amp;quot;Administrator&amp;quot; - unter &amp;lt;code&amp;gt;C:\Users\Administrator&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;Falls Windows sich weigert das Verzichniss mit dem Punkt am Anfang zu erstellen, kann man das aus der Kommandozeile machen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
mkdir &amp;quot;.alexa&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;C:\Users\&amp;lt;Benutzername&amp;gt;\.alexa\config.json&#039;&#039; kopieren.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;lt;/code&amp;gt;) kopiert werden.&lt;br /&gt;
&lt;br /&gt;
====Update====&lt;br /&gt;
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen, in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version im Hauptverzeichnis von FHEM entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/syntaxhighlight&amp;gt; alle Abhängigkeiten installieren.&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem konfigurieren ====&lt;br /&gt;
Der Inhalt der Datei &#039;&#039;~/.alexa/config.json&#039;&#039; muss an die eigene Umgebung angepasst werden. &lt;br /&gt;
# &#039;&#039;nat-pmp&#039;&#039; -&amp;gt; wenn nat-pmp verwendet werden soll: die ip des eigenen routers,&lt;br /&gt;
# &#039;&#039;nat-upnp&#039;&#039; -&amp;gt; wenn nat-upnp verwendet werden soll: &#039;&#039;true&#039;&#039;,&lt;br /&gt;
# &#039;&#039;applicationId&#039;&#039; &lt;br /&gt;
#:* Wenn man nur den SmartHome-Skill verwenden möchte, kann dieser Eintrag leer bleiben.&lt;br /&gt;
#:* Ansonsten ist er mit der SkillID des Alexa Custom Skills zu belegen, siehe Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]]&lt;br /&gt;
# &#039;&#039;oauthClientID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; dem Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
# &#039;&#039;server&#039;&#039; -&amp;gt; IP-Adresse des eigenen FHEM-Servers&lt;br /&gt;
# &#039;&#039;port&#039;&#039; -&amp;gt; Portnummer des eigenen FHEM-Servers&lt;br /&gt;
Beispiel:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;alexa&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Alexa TEST&amp;quot;,&lt;br /&gt;
        &amp;quot;keyFile&amp;quot;: &amp;quot;./key.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;certFile&amp;quot;: &amp;quot;./cert.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;applicationId&amp;quot;: &amp;quot;amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;,&lt;br /&gt;
        &amp;quot;oauthClientID&amp;quot;: &amp;quot;amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;connections&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;server&amp;quot;: &amp;quot;192.168.0.xxx.xxx&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: &amp;quot;8083&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;room=AlexaRoom&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Mehrere Custom Skills lassen sich mit der folgenden Syntax eintragen&lt;br /&gt;
         &amp;quot;applicationId&amp;quot;: [ &amp;quot;amzn1.ask.skill.1&amp;quot; , &amp;quot;amzn1.ask.skill.2&amp;quot; ],&lt;br /&gt;
         &amp;quot;oauthClientID&amp;quot;: [ &amp;quot;amzn1.application-oa2-client.1&amp;quot; , &amp;quot;amzn1.application-oa2-client.1&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
Danach durch Aufruf von &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/syntaxhighlight&amp;gt; den Dienst starten (kein sudo!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unter Windows startet man Alexa-Dienst durch &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node alexa&amp;lt;/syntaxhighlight&amp;gt; aus der &amp;lt;code&amp;gt;alex-fhem/bin&amp;lt;/code&amp;gt; (also erst z.B. durch &amp;lt;code&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;quot;&amp;lt;/code&amp;gt; ins richtige Verzeichnis kommen)&lt;br /&gt;
&lt;br /&gt;
Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem aus FHEM heraus starten ====&lt;br /&gt;
Zunächst das Start-up-Skript aus diesem Post herunterladen {{Link2Forum|Topic=60244|Message=517271|LinkText=https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271}} und unter /etc/init.d/alexa speichern.&lt;br /&gt;
&lt;br /&gt;
Das Script geht davon aus, das der alexa-fhem script unter /opt/fhem/alexa-fhem liegt, und die logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Nun folgende Kommandos ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo chmod 755 /etc/init.d/alexa&lt;br /&gt;
sudo update-rc.d alexa defaults&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; den User fhem für die Nutzung von sudo zulassen (&amp;lt;code&amp;gt;sudo nano /etc/sudoers&amp;lt;/code&amp;gt;), z.B. durch Anfügen der nachfolgenden Zeile:&lt;br /&gt;
&amp;lt;code&amp;gt;fhem ALL=(ALL) NOPASSWD: ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.Status dummy&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa dummy&lt;br /&gt;
attr FHEM.Alexa event-on-change-reading state&lt;br /&gt;
attr FHEM.Alexa webCmd status:start:stop:restart&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq &amp;quot;start&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa start &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;stop&amp;quot;)&lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa stop &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;restart&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa restart &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;status&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa status &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem als Service (systemd) installieren ====&lt;br /&gt;
Auf neueren Installationen (z.B. RPi Jessie) wird init.d durch systemd ersetzt. Folgend die Anleitung um alexa-fhem als Service zu installieren auf einem Raspberry Pi mit Jessie.&lt;br /&gt;
&lt;br /&gt;
Zunächst einen neuen Benutzer anlegen unter dem alexa-fhem laufen soll, falls man nicht möchtet dass alexa-fhem z.B. mit dem fhem User ausgeführt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd -M --system alexa&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht der Benutzer keine Gruppen, aber man kann den Benutzer auch der Gruppe &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt; hinzufügen (&amp;lt;code&amp;gt;sudo usermod -a -G dialout alexa&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Datei &amp;quot;alexa.service&amp;quot; unter &amp;lt;code&amp;gt;/etc/systemd/system&amp;lt;/code&amp;gt; anlegen:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Node.js Alexa Server &lt;br /&gt;
 After=syslog.target network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=alexa &lt;br /&gt;
 WorkingDirectory=/opt/alexa/alexa-fhem&lt;br /&gt;
 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=10&lt;br /&gt;
 KillMode=process&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target &lt;br /&gt;
&lt;br /&gt;
Den Pfad &amp;lt;code&amp;gt;/home/alexa/.alexa&amp;lt;/code&amp;gt; an die Systemgegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo. &lt;br /&gt;
&lt;br /&gt;
Im WorkingDirectory wird der alexa Dienst die Zertifikate suchen.&lt;br /&gt;
&lt;br /&gt;
Achtung: Natürlich muss der Benutzer auch Zugriff sowohl auf das Verzeichnis mit der config als auch das alexa-fhem Verzeichnis und das WorkingDirectory haben.&lt;br /&gt;
&lt;br /&gt;
Um den Service zu aktiveren und zu starten helfen folgende Befehle:&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable alexa&lt;br /&gt;
 sudo systemctl start alexa&lt;br /&gt;
&lt;br /&gt;
Status abfragen mit&lt;br /&gt;
 sudo systemctl status alexa&lt;br /&gt;
&lt;br /&gt;
Log einsehen?&lt;br /&gt;
 sudo journalctl -u alexa&lt;br /&gt;
&lt;br /&gt;
(mit &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; kann man den follow Modus aktivieren, wie &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;).&lt;br /&gt;
Bei einen reboot startet alexa-fhem jetzt automatisch.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem testen ====&lt;br /&gt;
Node.Js stellt einen Web-Server am Port 3000 bereit, das oben erzeugte Zertifikat sichert diesen Zugang per SSL ab. Durch Aufruf der Adresse&lt;br /&gt;
&amp;lt;code&amp;gt;https://&amp;lt;IP-Adresse des Servers&amp;gt;:3000&amp;lt;/code&amp;gt; kann man testen, ob der Alexa-Fhem Service läuft - der Seitenaufruf liefert eine Zeile JSON-Code, beginnend mit&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;header&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;UnsupportedOperationError&amp;quot;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Device anlegen ===&lt;br /&gt;
Das Modul 39_alexa.pm stellt innerhalb von FHEM verschiedene Attribute z.B. alexaName oder alexaRoom zur Verfügung. Manche dieser Attribute (wie z.b. alexaName) werden in beiden Skills verwendet, andere werden ausschließlich bei einer Nutzung des Alexa Custom Skill verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Alexa Device geschieht durch die nachfolgende Definition:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skills ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Security Profile anlegen ====&lt;br /&gt;
Die Erzeugung eines Sicherheitsprofils muss nur einmal erfolgen, es wird dann für alle weiteren Skills verwendet.&lt;br /&gt;
# Nach der Anmeldung Auswahl von &#039;&#039;APPS &amp;amp; SERVICES&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend auswählen &#039;&#039;Security Profiles&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-05-apps_and_services_-_security_profiles.png|200px]]&lt;br /&gt;
# Auswählen &#039;&#039;Create a New Security Profile&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-06-apps_and_services_-_create_a_new_security_profile.png|200px]]&lt;br /&gt;
# Dann einen Namen und eine Beschreibung für das Profil eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-07-apps_and_services_-_security_profile_management.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Login with Amazon =====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo &#039;&#039;Client Id&#039;&#039; und &#039;&#039;Client Secret&#039;&#039; zu finden sind}}&lt;br /&gt;
# Oben rechts auf &#039;&#039;Login with Amazon&#039;&#039; klicken.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-08-login_with_amazon.png|200px]]&lt;br /&gt;
# Auf der neu geladenen Seite auswählen &#039;&#039;Sign up&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-09-login_with_amazon_-_sign_up.png|200px]]&lt;br /&gt;
# Anschließend im Dropdown Menü das vorher angelegte Profil auswählen und mit &#039;&#039;Confirm&#039;&#039; bestätigen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-10-login_with_amazon_-_create_new_profile.png|200px]] [[Datei:Developer.amazon.com-11-login_with_amazon_-_create_new_profile2.png|200px]]&lt;br /&gt;
# Im folgenden Fenster die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496] eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen. &#039;&#039;&#039;Todo Erklärungsbedarf: WARUM diese Adresse&#039;&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]&lt;br /&gt;
# Anschließend bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad klicken und &#039;&#039;Web Settings&#039;&#039; auswählen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]&lt;br /&gt;
# Im neu geladenen Fenster anklicken von &#039;&#039;Edit&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-14-login_with_amazon_-_edit.png|200px]]&lt;br /&gt;
# Anschließend bei &#039;&#039;Allowed Return URLs&#039;&#039; die folgenden drei Adressen eingeben. &#039;&#039;xxx&#039;&#039; muss hierbei durch den Wert ersetzt werden, der in den beiden Abschnitten [[#SmartHome_Skill_anlegen | SmartHome Skill anlegen]] bzw. [[#Custom_Skill_anlegen | Custom Skill anlegen]] jeweils unter Punkt 4 (Seite &#039;&#039;Configuration&#039;&#039;) bei &#039;&#039;Redirect Urls&#039;&#039; am Ende der URLs angezeigt wird&lt;br /&gt;
## [https://layla.amazon.co.uk/api/skill/link/xxx https://layla.amazon.co.uk/api/skill/link/xxx]&lt;br /&gt;
## [https://pitangui.amazon.com/api/skill/link/xxx https://pitangui.amazon.com/api/skill/link/xxx]&lt;br /&gt;
## [https://layla.amazon.com/api/skill/link/xxx https://layla.amazon.com/api/skill/link/xxx]&lt;br /&gt;
.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-15-login_with_amazon_-_allowed_return_urls.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Skills bearbeiten ====&lt;br /&gt;
# Im Menü den Punkt &#039;&#039;ALEXA&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend im Feld &#039;&#039;Alexa Skills Kit&#039;&#039; auf &#039;&#039;Get started&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== SmartHome Skill anlegen =====&lt;br /&gt;
# Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&lt;br /&gt;
# Auf der folgenden Seite eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
#:* &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;SmartHome Skill API&#039;&#039; &lt;br /&gt;
#:* &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Basic&amp;quot;)&lt;br /&gt;
#:* &#039;&#039;Payload Version&#039;&#039; -&amp;gt; &#039;&#039;v2 (other devices)&#039;&#039; &amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-19-alexa_-_alex_skills_kit_-_skill_information.png|200px]]&lt;br /&gt;
# Die folgende Seite einfach mit &#039;&#039;Next&#039;&#039; überspringen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-20-alexa_-_alex_skills_kit_-_interaction_model.png|200px]]&lt;br /&gt;
# Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben:&lt;br /&gt;
#:* &#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; ist vorausgewählt und kann nicht geändert werden.&lt;br /&gt;
#:* &#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld die ARN aus Abschnitt [[#ARN_der_AWS_Lambda_Funktion_bestimmen | AWS Lambda Funktion]] eintragen. &lt;br /&gt;
#:* &#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt;    (wörtlich 1:1 eintragen)&lt;br /&gt;
#:* &#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&lt;br /&gt;
#:* &#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&lt;br /&gt;
#:* &#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-21-alexa_-_alex_skills_kit_-_configuration.png|200px]] [[Datei:Developer.amazon.com-22-alexa_-_alex_skills_kit_-_test.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Custom Skill anlegen =====&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Auf der folgenden Seite (&#039;&#039;Skill Information&#039;&#039;) die nachstehenden Daten eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;Custom Interaction Model&#039;&#039; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Advanced&amp;quot;. Dieser wird in der Alexa App unter &amp;quot;Meine Skills&amp;quot; angezeigt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Invocation Name&#039;&#039; -&amp;gt; Aufruf des Skills, unter dem dieser später gestartet wird. Z.B. &amp;quot;Alexa, starte James&amp;quot;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_2.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Interaction Model&#039;&#039; folgende Eingaben tätigen und mit &#039;&#039;Next&#039;&#039; abschließen&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In einem separaten Browserfenster FHEM aufrufen, und für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen. Es erscheint ein Popup-Fenster mit ziemlich vielen Zeilen.&lt;br /&gt;
&amp;lt;li&amp;gt;In die Box &#039;&#039;Intent Schema&#039;&#039; kopiert man den ersten Teil dieser FHEM-Ausgabe hinein, also:&amp;lt;br/&amp;gt;&amp;lt;blockquote&amp;gt;&lt;br /&gt;
 { &lt;br /&gt;
   &amp;quot;intents&amp;quot; : [ &lt;br /&gt;
    &amp;lt;hier ziemlich viele Zeilen&amp;gt;  &lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Nun die &#039;&#039;Custom Slot Types&#039;&#039; einrichten. Dazu muss aus dem zweiten Teil der FHEM-Ausgabe jeweils der Slot-Type (z.B. &amp;lt;code&amp;gt;FHEM_article&amp;lt;/code&amp;gt;) in das Feld &#039;&#039;TYPE&#039;&#039; eingetragen werden, das nach dem Anklicken von &#039;&#039;Add Slot Type&#039;&#039; erscheint. In das darunter liegende größere Textfeld kommen die möglichen Werte für diesen Slot, so wie sie aus der FHEM-Ausgabe abzulesen sind. Dann mit &#039;&#039;Save&#039;&#039; sichern. Als Custom Slot Type erscheint dann für diesen Beispiel-Slot&lt;br /&gt;
 FHEM_article 	der | die | das | den&lt;br /&gt;
d.h., die Zeilenumbrüche bei den möglichen Werten werden als &amp;quot;|&amp;quot; dargestellt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hier muss nun ein Bruch im Arbeitsfluss durchgeführt werden, denn bei der Erstellung des Custom Skills kommt es auf die Reihenfolge der Einträge an. Deshalb zunächst diese FHEM-Ausgabe schließen, und für dasselbe FHEM-Device &amp;lt;code&amp;gt;get MyAlexa customSlotTypes&amp;lt;/code&amp;gt; ausführen. Auch diese Ausgabe wird, wie oben beschriebeen, in Custom Slot Types eingetragen (erst der TYPE, dann die möglichen Werte)&lt;br /&gt;
&amp;lt;li&amp;gt;Anschließend erneut die FHEM-Ausgabe schließen und erneut  für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
&amp;lt;li&amp;gt;Unter &#039;&#039;Sample Utterances&#039;&#039; nun den Text aus dem dritten Teil dieser FHEM-Ausgabe hineinkopieren&amp;lt;br /&amp;gt;[[Datei:CustomSkill_5.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben und mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld den Wert aus Abschnitt [[#AWS_Lambda_Funktion_anlegen | AWS Lambda Funktion anlegen]] (Punkt 12) eintragen. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Do you allow users to create an account or link to an existing account with you?&#039;&#039; -&amp;gt; &#039;&#039;Yes&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt; (wörtlich 1:1 eintragen)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Beim Sichern dieser Seite mit &#039;&#039;Next&#039;&#039; kann es zu einer Fehlermeldung kommen, wenn man seine Skill-Definitionen mit dem einfachen SmartHome-Skill begonnen hat. Deshalb muss noch der entsprechende Trigger für die [[#AWS_Lambda-Funktion | AWS Lambda Funktion]] nachgetragen werden, dies wird in Abschnitt [[#Trigger_f.C3.BCr_Custom_Skill_hinzuf.C3.BCgen | Trigger für Custom Skill hinzufügen]] beschrieben.&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:CustomSkill_6.PNG|400px]] [[Datei:CustomSkill_7.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Testen ====&lt;br /&gt;
Hat man den Custom Skill angelegt, bietet dieser auch eine komfortable Testmöglichkeit. Dazu wählt man in der Übersichtsseite &#039;&#039;All Skills&#039;&#039; den Button &#039;&#039;Edit&#039;&#039; des Alexa Custom Skill aus. Auf der nachfolgenden Seite dann links &#039;&#039;Test&#039;&#039;. &lt;br /&gt;
Die Testseite enthält &lt;br /&gt;
* ein Feld &#039;&#039;Voice Simulator&#039;&#039;, mit dem man die Sprachsausgabe testen kann, &lt;br /&gt;
* ein Feld &#039;&#039;Service Simulator&#039;&#039;, mit dem die Verarbeitung von Alexa-Kommandois getestet werden kann. Hier kann man z.B. eintragen&lt;br /&gt;
 &amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Siebenundzwanzig Uhr&amp;quot;&lt;br /&gt;
 &amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
==== Skill Id bestimmen ====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die &#039;&#039;Alexa Skill Id&#039;&#039; zu finden ist}}&lt;br /&gt;
Für das [[#AWS_Lamba_Funktion_anlegen | Anlegen einer &#039;&#039;AWS Lambda Funktion&#039;&#039;]] bzw für die [[#Alexa-Fhem_konfigurieren | Konfiguration von Alexa-Fhem]] wird die &#039;&#039;Alexa Skill Id&#039;&#039; benötigt. An diese kommt man wie folgt:&lt;br /&gt;
# Anmelden wie unter [[#Alexa_Skills | Alexa Skills]] beschrieben.&lt;br /&gt;
# Menüpunkt &#039;&#039;ALEXA&#039;&#039; auswählen, wie [[#Skills_bearbeiten | Skills bearbeiten]] erklärt.&lt;br /&gt;
# Beim gewünschten Eintrag auf &#039;&#039;Edit&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]&lt;br /&gt;
# Die Id, die nun oben angezeigt wird, ist die gesuchte. Sie hat typischerweise das Format &amp;lt;code&amp;gt;amzn1.ask.skill.[Zahlen und Bindestriche]&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AWS Lambda Funktion ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-01-site.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-02-login.png|200px]]&lt;br /&gt;
# Den Punkt &#039;&#039;Lambda&#039;&#039; links auf der Startseite auswählen, bzw. im Menü &#039;&#039;Services&#039;&#039; unter &#039;&#039;Compute&#039;&#039; den Menüpunkt &#039;&#039;Lambda&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-03-lambda.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== AWS Lambda Funktion anlegen ====&lt;br /&gt;
# Für eine erste Lambda-Funktion den Punkt &#039;&#039;Get Started Now&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]&lt;br /&gt;
# Den Blueprint &#039;&#039;Blank function&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]&lt;br /&gt;
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Smart Home&#039;&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]&lt;br /&gt;
## Achtung, es ist möglich, dass dabei &#039;&#039;Alexa Smart Home&#039;&#039; überhaupt nicht angeboten wird. Dann bitte ganz rechts oben in der Ecke nachsehen, welche Region bzw. welches Land ausgewählt ist. Empfohlen wird, &#039;&#039;Ireland&#039;&#039; auszuwählen. Dann erscheint bei den Funktionen auch &#039;&#039;Alexa Smart Home&#039;&#039;.&lt;br /&gt;
# Bei &#039;&#039;Application Id&#039;&#039; den Wert eintragen, dessen Ermittlung im Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]] beschrieben wird, den Haken bei &#039;&#039;Enable trigger&#039;&#039; setzen und mit &#039;&#039;Next&#039;&#039; bestätigen &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]&lt;br /&gt;
# Auf der Konfigurationsseite eingeben:&lt;br /&gt;
## &#039;&#039;Name&#039;&#039; -&amp;gt; &#039;&#039;FHEM&#039;&#039;&lt;br /&gt;
## &#039;&#039;Runtime&#039;&#039; -&amp;gt; Node.js 4.3. &lt;br /&gt;
## &#039;&#039;Role&#039;&#039; -&amp;gt; &#039;&#039;Choose an existing role&#039;&#039; &lt;br /&gt;
### Achtung: wenn es noch keine existing role gibt, zuerst &#039;&#039;Create a custom role&#039;&#039; -&amp;gt; in dem Popup dann &#039;&#039;lambda_basic_execution&#039;&#039; auswählen und auf &#039;&#039;Allow&#039;&#039; klicken sowie bei &#039;&#039;Existing role&#039;&#039; dann &#039;&#039;x&#039;&#039; wählen.&lt;br /&gt;
# Auf der Code-Seite wird bzw. im großen Textfeld ist dann der Code aus der Datei &#039;&#039;lambda.js&#039;&#039; im Paket [[#Alexa-Fhem_installieren | Alexa-Fhem]] vollständig einzufügen. Dabei muss der vorhandene Code im Texteil komplett gelöscht, der Teil aus der &#039;&#039;lamda.js&#039;&#039; eingefügt und noch der Hostname im Quellcode an den eigenen Hostnamen angepasst werden. &lt;br /&gt;
# Anschließend alles mit &#039;&#039;Next&#039;&#039; bestätigen.&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-07-configure_function.png|200px]]&lt;br /&gt;
# Auf der Übersichtsseite dann &#039;&#039;Create function&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-08-review.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Trigger für Custom Skill hinzufügen ====&lt;br /&gt;
Editiert man eine Lambda-Funktion, werden auf der Seite &#039;&#039;Triggers&#039;&#039; diejenigen Dienste angezeigt, die diese Funktion aufrufen.&lt;br /&gt;
* Hier taucht der Trigger &#039;&#039;Alexa Smart Home&#039;&#039; zusammen mit der &#039;&#039;Application Id&#039;&#039; auf, der bei der Einrichtung des SmartHome-Skills eingetragen wurde.&lt;br /&gt;
* Zur Verbindung mit dem Custom Skill ist es nötig, einen zweiten Trigger hinzuzufügen. Durch Anklicken von &#039;&#039;Add Trigger&#039;&#039; wird eine Auswahlseite eingeblendet. Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Skills Kit&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&lt;br /&gt;
&lt;br /&gt;
==== ARN der AWS Lambda Funktion bestimmen ====&lt;br /&gt;
# Auf der Übersichtsseite oben links den Menüpunkt &#039;&#039;Functions&#039;&#039; aúswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-09-go_overview.png|200px]]&lt;br /&gt;
# Anschließend den Radiobutton der angelegten Funktion &#039;&#039;FHEM&#039;&#039; markieren und im Menü &#039;&#039;Action&#039;&#039; den Punkt &#039;&#039;Show ARN&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]&lt;br /&gt;
# Es wird nun eine ARN Adresse angezeigt, die für den Abschnitt [[#SmartHome_Skill_anlegen| SmartHome Skill anlegen]] benötigt wird&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-2-arn.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Absichern des Zugriffs ===&lt;br /&gt;
Natürlich muss der Zugriff auf den von Alexa-Fhem verwendeten Port (default: 3000, Bestandteil des Codes in der AWS Lambda-Funktion) durch die Firewall freigeschaltet werden (auf einer FritzBox unter &amp;quot;Portfreigaben&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== Absicherung direkt in Alexa-FHEM ====&lt;br /&gt;
Die Kommunikation zwischen Amazon AWS und Alexa-FHEM ist auf die folgenden Arten gesichert:&lt;br /&gt;
* Die Verbindung erfolgt per HTTPS&lt;br /&gt;
* Es werden nur Verbindung angenommen auf denen ein gültiges Alexa-Event gesendet wird. &lt;br /&gt;
* Es werden nur Verbindungen angenommen die ein gültiges und noch nicht abgelaufenes OAuth-Token enthalten. Jedes neue Token wird live bei Amazon auf Gültigkeit geprüft.    &lt;br /&gt;
* Es werden nur Verbindungen mit lokal konfigurierter Skill-ID angenommen.&lt;br /&gt;
* Es ist nicht möglich von außen beliebige FHEM Kommandos zu senden. Die FHEM Kommandos werden nur lokal erzeugt.&lt;br /&gt;
&lt;br /&gt;
Wer möchte kann Alexa-FHEM natürlich noch weiter absichern. Es gilt aber, dass nicht jedes zusätzliche Glied in der Kette die Sicherheit sondern unter Umständen nur die Angriffsfläche erhöht. Ein falsch konfigurierter und nach aussen offener Apache (oder anderer ReverseProxy) ist unter Umständen ein größeres Risiko als Alexa-FHEM alleine.&lt;br /&gt;
&lt;br /&gt;
==== Absicherung per ReverseProxy ====&lt;br /&gt;
&amp;lt;s&amp;gt;Die Kommunikation zwischen Amazon und FHEM ist wegen der Verwendung von SSL schon verschlüsselt - prinzipiell kann aber jeder von außen mit Alexa-Fhem kommunizieren. Man sollte sich deshalb im Klaren darüber sein, dass dies eine Sicherheitslücke darstellt:&amp;lt;/s&amp;gt; Jeder offene Port verleitet zu Angriffen, und mit zunehmender Verbreitung von Alexa steigt auch das Risiko. Es wird deshalb empfohlen, vor den eigentlichen Alexa-Server zur Absicherung einen Apache-Webserver als ReverseProxy zu setzen. Nicht nur ist der Apache eine hervorragend stabile und seit Jahrzehnten getestete Software, sondern die Konfiguration als ReverseProxy erlaubt auch, den Zugriff auf den Alexa-Fhem-Rechner auf die Amazon-Maschinen zu beschränken.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung: Dies ist keine allgemeine Anleitung in Sachen Computersicherheit.&#039;&#039;&#039; Im Folgenden gehen wir davon aus, dass &lt;br /&gt;
* Grundbegriffe wie Firewall, IP-Ports, SSL und Dynamic DNS vertraut sind&lt;br /&gt;
* Ein Apache Webserver (idealerweise auf einer zweiten Maschine) bereits installiert ist und die Konfiguration verstanden wurde (wenn nicht: Es gibt im Netz &#039;&#039;tausende&#039;&#039; von Anleitungen dafür...)&lt;br /&gt;
* Ein Servername von einem DynDNS-Anbieter - sagen wir &#039;&#039;myhome.is-my-castle.com&#039;&#039; - bereits von &#039;&#039;außen&#039;&#039; auf unser SmartHome zeigt.&lt;br /&gt;
* Alexa-Fhem in einer der oben beschriebenen Basiskonfigurationen läuft, d.h. der Zugriff auf &amp;lt;code&amp;gt;https://myhome.is-my-castle.com:3000&amp;lt;/code&amp;gt; ergibt, wie im Punkt [[#Alexa-Fhem_testen|Alexa-Fhem testen]] beschrieben, eine Antwort des Node.js Servers.&lt;br /&gt;
&lt;br /&gt;
Als erster Schritt zur Absicherung muss das ReverseProxy Modul für den Apache installiert und mit &amp;lt;code&amp;gt;a2enmod&amp;lt;/code&amp;gt; aktiviert werden, hierzu sei auf [https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension diese Anleitung] verwiesen. Der zweite Schritt besteht darin, den SSL-Zugriff durch ein Passwort abzusichern. Dazu wird auf dem Apache-Rechner das Programm &lt;br /&gt;
 htpasswd &amp;lt;passwdfile&amp;gt; &amp;lt;username&amp;gt;&lt;br /&gt;
ausgeführt, das Programm fragt dann nach dem gewünschten Passwort. Wir nehmen im Folgenden an, dass das Passwortfile &#039;&#039;/etc/apache2/htpasswd&#039;&#039; ist, der gesetzte Username &#039;&#039;alexa&#039;&#039; lautet und das Passwort &#039;&#039;my_smarthome&#039;&#039; ist.&lt;br /&gt;
&lt;br /&gt;
Im dritten Schritt wird nun in das Apache-Konfigurationsfile die Weiterleitung auf den eigentlichen Alexa-Fhem-Rechner eingetragen. Dazu wählen wir, dass von außen der Standard-SSL-Port 443 benutzt werden soll, sowie als Verzeichnisname &#039;&#039;/alexa&#039;&#039;. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; Dieser Code soll &#039;&#039;&#039;nicht&#039;&#039;&#039; in die Default-Konfiguration des Apache-Webservers. Sondern in eine separate Datei (Dateiname z.B. &amp;quot;fhem&amp;quot;), die ins Unterverzeichnis /etc/apache2/conf.d gestellt wird.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
  ServerName myhome.is-my-castle.com&lt;br /&gt;
  SSLEngine on&lt;br /&gt;
  SSLProxyEngine on&lt;br /&gt;
  SSLProxyCheckPeerCN off&lt;br /&gt;
  SSLProxyCheckPeerName off&lt;br /&gt;
  SSLCertificateKeyFile /etc/apache2/mycert/server.key&lt;br /&gt;
  SSLCertificateFile /etc/apache2/mycert/server.crt&lt;br /&gt;
 &amp;lt;Location /alexa&amp;gt;&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthName &amp;quot;Authentication Required&amp;quot;&lt;br /&gt;
  AuthUserFile &amp;quot;/etc/apache2/htpasswd&amp;quot;&lt;br /&gt;
  Require valid-user&lt;br /&gt;
  ProxyPass https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  ProxyPassReverse https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  Order deny,allow&lt;br /&gt;
  Allow from All&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 (... Hier eventuell weitere Umleitungen)&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
Nach einem Neustart des Apache-Servers, dem Schließen des Ports 3000 in der Firewall sowie dem Öffnen des Ports 443 ist der Alexa-Fhem-Rechner von außen nur noch erreichbar durch den Aufruf von &amp;lt;code&amp;gt;https://myhome.is-my-castle.com/alexa&amp;lt;/code&amp;gt; und verlangt unmittelbar die Eingabe von Username und Passwort.&lt;br /&gt;
&lt;br /&gt;
Der vierte Schritt ist nun, den Code der AWS Lambda-Funktion an fünf Stellen zu verändern&lt;br /&gt;
 &#039;&#039;&#039;const PORT=443;&#039;&#039;&#039;&lt;br /&gt;
 const HOST=&#039;myhome.is-my-castle.com&#039;;&lt;br /&gt;
 &#039;&#039;&#039;const PATH=&#039;/alexa&#039;;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;const AUTH=&#039;alexa:my_smarthome&#039;;&#039;&#039;&#039;&lt;br /&gt;
 // entry&lt;br /&gt;
 exports.handler = function(event, context, callback) {&lt;br /&gt;
  console.log(`EVENT: ${event}`);&lt;br /&gt;
  console.log(`CONTEXT: ${context}`);  &lt;br /&gt;
  var post_data = JSON.stringify(event);&lt;br /&gt;
  var options = {&lt;br /&gt;
    hostname: HOST,&lt;br /&gt;
    port: PORT,&lt;br /&gt;
    //family: 6,&lt;br /&gt;
    &#039;&#039;&#039;path: PATH,&#039;&#039;&#039;&lt;br /&gt;
    method: &#039;POST&#039;,&lt;br /&gt;
    &#039;&#039;&#039;auth: AUTH,&#039;&#039;&#039;&lt;br /&gt;
    rejectUnauthorized: false, // accept self-signed&lt;br /&gt;
 (etc., Rest des Codes wie gehabt)&lt;br /&gt;
Natürlich muss der Zugriff getestet werden. Bei Beachtung aller dieser Schritte werden alle un-autorisierten Zugriffe von außen abgewehrt. Eine noch weiter gehende Sicherung ist möglich, dazu kann in der Serverkonfiguration der Zugriff auf die Amazon-Domains beschränkt werden. Das ganze Alexa-System ist aber noch in konstanter Weiterentwicklung, diese Domain-Namen können sich also noch ändern.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung in der Alexa App==&lt;br /&gt;
Nachdem die Alexa Skills angelegt wurden, müssen diese noch in der Alexa App eingerichtet werden.&lt;br /&gt;
Dafür jeweils per Desktop-Browser auf [http://alexa.amazon.de alexa.amazon.de] anmelden, nicht die App unter iOS oder Android verwenden. Diese hat Probleme mit der OAuth Verknüpfung.&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skill ===&lt;br /&gt;
# Auf &#039;&#039;Skills&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Oben rechts &#039;&#039;Meine Skills&#039;&#039;  bzw. &#039;&#039;Ihre Skills&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]&lt;br /&gt;
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]&lt;br /&gt;
# Oben Rechts in den Details des Skills auf &#039;&#039;Skill aktivieren&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]&lt;br /&gt;
# In dem neu geöffneten Fenster die Autorisierung bestätigen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]&lt;br /&gt;
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein &amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-06-success.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Geräte ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden&lt;br /&gt;
# Auf &#039;&#039;Smart Home&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Geräte suchen&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-07-Gerätesuche.png|200px]]&lt;br /&gt;
# Wurde soweit alles korrekt eingerichtet, werden nun die gefundenen Geräte angezeigt.&lt;br /&gt;
&lt;br /&gt;
Tip: Es macht Sinn, unter &#039;&#039;Meine Gruppen&#039;&#039; Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. &amp;quot;Licht&amp;quot;) haben.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung unter FHEM ==&lt;br /&gt;
Im Folgenden werden exemplarisch ein paar Geräte beschrieben, die man nutzbringend mit FHEM einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Custom Skills übersetzt die Kombination der Attribute &#039;&#039;alexaMapping&#039;&#039; und &#039;&#039;homebridgeMapping&#039;&#039; Sprachbefehle (&amp;quot;Intents&amp;quot;) in gerätespezifische Kommandos. &lt;br /&gt;
* Das Attribut alexaMapping wird am Alexa-Device gesetzt und dient dazu, erkannte Sprachkommandos in abstrakte Characteristiken zu überführen. Für den einfacheren SmartHome Skill hat darum das Attribut &#039;&#039;alexaMapping&#039;&#039; keine Bedeutung, sondern nur der &#039;&#039;genericDeviceType&#039;&#039; des zu steuernden Gerätes.&lt;br /&gt;
* Das Attribut homebridgeMapping wird für beide Skills am zu steuernden Gerät gesetzt und übersetzt diese Charakteristiken in die konkreten Befehle, die das Gerät versteht. Der inhalt des Attributs wird von links nach rechts ausgewertet und ist wie folgt aufgebaut:&lt;br /&gt;
** Das Attribut enthält eine durch Leerzeichen getrennte Liste aus Konfigurationen für jeweils eine Characteristik&lt;br /&gt;
** Jede einzelne der Characteristik-Konfigurationen besteht aus dem Namen der Characteristik, gefolgt von &amp;quot;=&amp;quot; und einer kommaseparierten Liste von Parametern.&lt;br /&gt;
  attr &amp;lt;device&amp;gt; homebridgeMapping &amp;lt;Characteristic1&amp;gt;=&amp;lt;param1.1&amp;gt;,&amp;lt;param1.2&amp;gt;,... &amp;lt;Characteristic2&amp;gt;=&amp;lt;param2.1&amp;gt;,&amp;lt;param2.2&amp;gt;,...&lt;br /&gt;
** Jeder Parameter besteht entweder aus&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;cmd&amp;gt;:&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&amp;lt;/code&amp;gt;, hier können nicht verwendete Elemente von links nach rechts weg gelassen werden.&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;=&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;, hier kann &amp;lt;code&amp;gt;&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt; entweder ein Wert oder semikolonseparierte Liste sein.&lt;br /&gt;
*** Oder dem schlüsselwort &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;, welches alle vorhandenen (default) Parameter dieser Characteristik löscht. &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt; kann auch an Stelle einer ganzen Characteristik-Konfiguration stehen&lt;br /&gt;
Weiter führende Dokumentation zum homebridgeMapping findet sich unter https://forum.fhem.de/index.php/topic,48558.0.html&lt;br /&gt;
&lt;br /&gt;
=== Einfacher Schalter ===&lt;br /&gt;
* Ein einfacher Schalter, der die set-Kommandos &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039; kennt, kann direkt mit Alexa-Fhem gekoppelt werden &lt;br /&gt;
* Für kompliziertere Aktionen, etwa das Übermitteln eines spezifischen Schaltbefehls an FHEM, ist die Einrichtung eines Dummies zu empfehlen. &lt;br /&gt;
Ob Dummy oder nicht, wichtig sind die drei fett gedruckten Zeilen&lt;br /&gt;
 define Alexa.Party dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaName party&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Party group AlexaGeräte&lt;br /&gt;
 attr Alexa.Party room AlexaRoom&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party setList on off&#039;&#039;&#039;&lt;br /&gt;
Selbstverständlich kann man diesen Dummy mit einem notify oder DOIF abfangen, um die gewünschte Schaltaktion auszuführen. &lt;br /&gt;
&lt;br /&gt;
Ein Alternative zum Dummy ist das Anlegen eines readingsProxy, dem die entsprechenden Attribute gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Weil es sich hierbei um eines der einfachen Geräte handelt, die Alexa selbst im SmartHome Skill bearbeiten kann, ist auch der zweite Schritt bei der Einrichtung in der Alexa App sinnvoll: Der Schalter wird dann im Bereich Smart Home der Alexa App erkannt. Wer ihn auch mit dem Custon Skill bedienen möchte, muss natürlich Sorge tragen, dass der Alexa-Name &#039;&#039;party&#039;&#039; bei den FHEM_Devices auftaucht und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sind (siehe Abschnitt [[##Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
=== Wecker ===&lt;br /&gt;
Dieses Gerät kann man nur mit dem Custom Skill bedienen, es wird also &#039;&#039;&#039;nicht&#039;&#039;&#039; im Bereich Smart Home der Alexa App auftauchen. Wir richten einen Dummy ein, wichtig sind wieder die fett gedruckten Zeilen:&lt;br /&gt;
 define Alexa.Weckzeit dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaName weckzeit&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit genericDeviceType clock&lt;br /&gt;
 attr Alexa.Weckzeit group AlexaGeräte&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit room AlexaRoom&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit setList Weckzeit:time&#039;&#039;&#039;&lt;br /&gt;
Das Attribut &#039;&#039;genericDeviceTye&#039;&#039; ist nicht wichtig, weil es ein generisches Device dieser Art gar nicht gibt. Wichtig hingegen ist das Attribut &#039;&#039;homebridgeMapping&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Für das Gerät &#039;&#039;MyAlexa&#039;&#039;, das in Abschnitt definiert wurde, muss im Attribut &#039;&#039;alexaMapping&#039;&#039; auftauchen&lt;br /&gt;
 Weckzeit=verb=stelle,valuePrefix=für;auf,values=AMAZON.TIME,valueSuffix=uhr&lt;br /&gt;
Darüber hinaus muss der Alexa-Name &#039;&#039;weckzeit&#039;&#039; bei den FHEM_Devices auftauchen und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sein (siehe Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
Der Aufruf dieses Gerätes mit Alexa erfolgt dann z.B. mit den Sätzen&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Uhr Siebenundzwanzig&amp;quot;&lt;br /&gt;
&amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
Zur weiteren Bearbeitung kann man jetzt mit einem DOIF Statusänderungen des Dummies abfangen und durch eine kleine Helperfunktion ins &amp;quot;echte&amp;quot; FHEM weiterleiten.&lt;br /&gt;
  define Alexa.Weckzeit.N DOIF ([&amp;quot;Alexa.Weckzeit:.*&amp;quot;])({AlexaHelper(&amp;quot;Alexa.Weckzeit&amp;quot;,&amp;quot;$EVENT&amp;quot;)}) &lt;br /&gt;
Die Helperfunktion (z.B. in 99_myUtils.pm) stellt aus der übergebenen Zeit (immer im Format dd:mm) eine sprachkompatible Nachricht $nc und einen mit den FHEM-Zeitangaben kompatiblen String $nt zusammen und reicht beide an eine Routine &#039;&#039;changeWakeTime&#039;&#039; weiter (dokumentiert in den [https://www.dpunkt.de/buecher/12387/9783960090120-smarthome-hacks.html Smart Home Hacks]).&lt;br /&gt;
 sub AlexaHelper($$){&lt;br /&gt;
  my ($name,$event)=@_;&lt;br /&gt;
  if( $name eq &amp;quot;Alexa.Weckzeit&amp;quot; ){ &lt;br /&gt;
    my ($nc,$nt);&lt;br /&gt;
    #-- volle Stunde----------------------------------------&lt;br /&gt;
    if( $event =~ /(\d+):00/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr&amp;quot;,$1);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:00:00&amp;quot;,$1);&lt;br /&gt;
    #-- nicht volle Stunde---------------------------------&lt;br /&gt;
    }elsif( $event =~ /(\d+):(\d+)/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr %d&amp;quot;,$1,$2);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:%02d:00&amp;quot;,$1,$2);&lt;br /&gt;
    }&lt;br /&gt;
    changeWakeTime(\&#039;GalaxyTab.EG\&#039;,\&#039;$nc\&#039;,\&#039;$nt\&#039;);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lichtszene ===&lt;br /&gt;
Eine Lichtszene wird mit dem Modul LightScene angelegt. Wir gehen davon aus, dass in der Lichtszene die beiden Szenen Alle_An und Alle_Aus, sowie mindestens eine weitere Szene (hier: Sitzgruppe) definiert wurde.&lt;br /&gt;
* Nachfolgend wird ein Beispiel beschrieben, wie man eine Lichtszene mit dem einfachen SmartHome Skill steuern kann. Die verwendeten Kommandos sind dann&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtungsitzgruppe an&amp;quot; -&amp;gt; LightScene Sitzgruppe wird ausgewählt&lt;br /&gt;
...&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung aus&amp;quot; -&amp;gt; LightScene Alle_Aus wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Künftig wird man LightScene mit dem Custom Skill eventuell direkt steuern können - allerdings hat das einen geringeren WAF, als die Steuerung über den SmartHome Skill: Der Einschaltsatz muss dann mindestens lauten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dafür wird es aber auch möglich sein direkt die SzenenNamen im gesprochenen Kommando zu verwenden und so auf die Umwege über dummys und ähnliches zu verzichten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im ersten Schritt wird ein Dummy für die Gesamtbeleuchtung eingerichtet:&lt;br /&gt;
 define Alexa.Beleuchtung dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaName beleuchtung&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
Anschließend wird für jede vorhandene Lichtszene (außer Alle_An und Alle_Aus) ein weiterer Dummy angelegt:&lt;br /&gt;
 define Alexa.Beleuchtung.Sitzgruppe dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaName beleuchtungsitzgruppe&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe genericDeviceType switch&#039;&#039;&#039; &lt;br /&gt;
Die eigentliche Steuerung übernimmt dann ein DOIF&lt;br /&gt;
 define Alexa.Beleuchtung.N DOIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung.Sitzgruppe:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Sitzgruppe,&lt;br /&gt;
  set Alexa.Beleuchtung off,&lt;br /&gt;
   ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSIF&lt;br /&gt;
 ... &amp;lt;weitere on-Events der anderen Szenen werden abgefangen&amp;gt;&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_An,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:off&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_Aus,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
Mit diesem DOIF wird ein Radiobutton simuliert, d.h. wie bei den Stationstasten vor Uralt-Radios sorgt die Auswahl einer Szene immer dafür, dass alle anderen Dummies ausgeschaltet werden.&lt;br /&gt;
Natürlich kann man das auch mit einem kleinen Perl-Programm erreichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zwei andere Ansätze Lichtszenen zu schalten die ohne DOIF auskommen sind im Folgenden beschrieben:&lt;br /&gt;
&lt;br /&gt;
* Wenn es von Interesse ist die Steuerung mit einer Darstellung in FTUI zu verbinden: Statt der oben beschriebenen dummy Devices kann man readingsProxy Devices mit passenden setFn und valueFn analog zum  [[Harmony#Button_f.C3.BCr_eine_bestimmte_Activity_im_Frontend_und_Homekit_.C3.BCber_readingsProxy|diesem Beispiel für harmony aktivitäten]] verwenden.&lt;br /&gt;
&lt;br /&gt;
* Für jede zu schaltende Szene wird ein dummy angelegt dessen homebridgeMapping direkt auf das LightScene Device zeigt:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;dummy&amp;gt; dummy&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; setList on off&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; homebridgeMapping On=&amp;lt;light scene&amp;gt;::state,valueOn=&amp;lt;szene&amp;gt;,cmdOn=scene+&amp;lt;szene&amp;gt;,cmdOff=scene+&amp;lt;szene aus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der zweiten Variante wird davon ausgegangen das der aktuelle status nicht abgefragt oder angezeigt werden soll. Deshalb gibt es keine direkte RadioButton Funktionalität.&lt;br /&gt;
&lt;br /&gt;
== Nutzung ==&lt;br /&gt;
Um den Namen zu bestimmen, unter dem ein Gerät mit Alexa angesprochen wird, verwendet Alexa-Fhem mit absteigender Priorität:&lt;br /&gt;
* das alexaName Attribut&lt;br /&gt;
* das alias Attribut&lt;br /&gt;
* das NAME Internal&lt;br /&gt;
Damit Alexa ein Gerät eindeutig identifizieren kann, sollten eindeutige Gerätenamen verwendet werden, bestehed möglichst aus einem Wort und ohne Ziffern. Wenn Alexa einen Namen nicht versteht, kann man unter [http://alexa.amazon.de/spa/index.html] nachsehen was tatsächlich verstanden wurde und den Gerätenamen ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
=== SmartHome Skill ===&lt;br /&gt;
Gruppen (Räume) müssen in der Alexa App konfiguriert werden. Über das API lassen sich nur der Name und die Schalteigenschaften übergeben.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Einrichtung des SmartHome Skills sollte Alexa mit den folgenden Befehlen nutzbar sein:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; ein”&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; aus”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;wert&amp;gt; prozent”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Skill ===&lt;br /&gt;
Der Custom Skill erlaubt im Gegensatz zum SmartHome Skill eine weitreichende Konfiguration der möglichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=im Forum}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions)&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
====Allgemeiner Hinweis====&lt;br /&gt;
Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein &#039;&#039;http://&#039;&#039; davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
const PORT=3000;&lt;br /&gt;
const HOST=&#039;mein.host.name&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Freigabe von Port 3000====&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von &amp;lt;b&amp;gt;UnityMedia&amp;lt;/b&amp;gt; z.B. funktionieren derzeit leider nicht. Eine möglicher &amp;quot;Workaround&amp;quot; wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276}}&lt;br /&gt;
&lt;br /&gt;
Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können.&lt;br /&gt;
Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.&lt;br /&gt;
&lt;br /&gt;
Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde. &lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter &#039;&#039;Internet -&amp;gt; Freigaben -&amp;gt; Portfreigaben&#039;&#039; statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: &#039;&#039;https://mein.hostname:3000&#039;&#039;. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.&lt;br /&gt;
&lt;br /&gt;
Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.&lt;br /&gt;
&lt;br /&gt;
====Probleme mit node.js - npm install====&lt;br /&gt;
&lt;br /&gt;
Falls eine Fehlermeldung auftritt, dass &amp;quot;npm&amp;quot; nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: [[Homebridge_einrichten#NodeJS_installieren|NodeJS installieren]] sowie [[Homebridge_einrichten#Python.2C_g.2B.2B.2C_MDNS_installieren|Python, g++, MDNS installieren]], siehe auch folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
====Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich====&lt;br /&gt;
Wenn man auf der Konsole angemeldet ist, den Befehl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/syntaxhighlight&amp;gt;eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter [[Homebridge_einrichten#NodeJS_installieren]] nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter [[Alexa-Fhem#Voraussetzungen]] erfüllt sind! Keine Experimente mit Versionen die darunter liegen.&lt;br /&gt;
&lt;br /&gt;
====Fehlermeldung &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039; Fehler angezeigt beim Start von alexa-fhem====&lt;br /&gt;
Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039;, lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
====Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder====&lt;br /&gt;
Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder. &lt;br /&gt;
&lt;br /&gt;
Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; die folgenden Zeilen rauslöschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;nat-pmp&amp;quot;: &amp;quot;10.0.1.1&amp;quot;,&lt;br /&gt;
        &amp;quot;nat-upnp&amp;quot;: true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn alexa-fhem keine Geräte findet?====&lt;br /&gt;
Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut &#039;&#039;genericDeviceType switch&#039;&#039; hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut &#039;&#039;alias&#039;&#039; eine besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann.&lt;br /&gt;
Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?====&lt;br /&gt;
Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:&lt;br /&gt;
* wenn nichts bei alexa-fhem ankommt: port forwarding prüfen&lt;br /&gt;
* wenn lambda.js nichts los wird: im cloudwatch log nachsehen&lt;br /&gt;
* wenn bei lambda.js nichts ankommt: den trigger prüfen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst sollte man sich unter &#039;&#039;http://aws.amazon.com&#039;&#039; das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger.&lt;br /&gt;
Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf &#039;&#039;Triggers&#039;&#039; klicken und mit &#039;&#039;Add trigger&#039;&#039; erneut einen anlegen. Hier muss, wie in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 7, die &#039;&#039;Application Id&#039;&#039; stehen und der Haken bei &#039;&#039;Enable trigger&#039;&#039; gesetzt sein. Dann alexa-fhem neu starten.&lt;br /&gt;
Wenn ihr Änderugen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es kann sein, dass immer noch keine Log im Cloudwatch ([http://docs.aws.amazon.com/de_de/lambda/latest/dg/monitoring-functions-logs.html]) zu sehen ist. In dem Fall hilft es, eine neue Role Policy anzulegen. &lt;br /&gt;
* in der AWS Console [https://console.aws.amazon.com] oben links auf Services klicken, und in der Gruppe &amp;quot;Security, Identity &amp;amp; Compliance&amp;quot; auf IAM klicken&lt;br /&gt;
* links auf Roles klicken&lt;br /&gt;
* Auf dem Knopf &amp;quot;Create Role&amp;quot; klicken&lt;br /&gt;
* AWS Services &amp;gt; Lambda auswählen, unten auf Next:Permissions klicken&lt;br /&gt;
* im Filter / Policy Type,  &amp;quot;log&amp;quot; eintragen (ohne quotes)&lt;br /&gt;
* CloudWatchLogsFullAccess hacken, auf Next:Review unten klicken&lt;br /&gt;
* Name vergeben und mit &amp;quot;Create role&amp;quot; bestätigen&lt;br /&gt;
* Oben links auf Services klicken, und in der Gruppe &amp;quot;Compute&amp;quot;, auf Lambda klicken&lt;br /&gt;
* auf den Name der Funktion klicken&lt;br /&gt;
* Reiter Configuration auswählen&lt;br /&gt;
* in Existing Role, den neukreierten Role auswählen&lt;br /&gt;
* oben auf Save (und Testen wenn gewünscht) klicken.&lt;br /&gt;
Schon sollte eine neue Gruppe im Cloudwatch sichtbar sein. Die Suche von den Devices in Alexa wiederholen, und die Logs analysieren&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Der User in der User= Directive von alexa.service muss Ausführungsrecht auf dem alexa binary haben (x), so wie auch mind. Lesezugriff auf dem Verzeichnis nach -U Option in der ExecStart= Directive und auch auf dem WorkingDirectory }}&lt;br /&gt;
Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei &#039;&#039;alexa&#039;&#039; muss ausführbar sein. Also z.B. so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
die Datei ausführbar machen. Sofern der User &amp;quot;pi&amp;quot; Eigentümer ist, ist kein sudo erforderlich.&lt;br /&gt;
&lt;br /&gt;
Eine lauffähige Konfiguration ist {{Link2Forum|Topic=71612|Message=668383|LinkText=hier}} zu sehen.&lt;br /&gt;
&lt;br /&gt;
Ein Fehler in der Rechtekonfiguration führt in der Regel zu folgendem Ergebnis nach &amp;lt;code&amp;gt;sudo systemctl status alexa&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;   Loaded: loaded (/etc/systemd/system/alexa.service; enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since mer. 2017-09-06 02:33:23 CEST; 3s ago&lt;br /&gt;
  Process: 18332 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa (code=exited, status=217/USER)&lt;br /&gt;
 Main PID: 18332 (code=exited, status=217/USER)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Wie kann ich via Alexa-FHEM auf FHEM zugreifen, wenn der Port mit Benutzername/Kennwort geschützt ist?====&lt;br /&gt;
&lt;br /&gt;
Hierzu muss die Datei &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; geöffnet werden und der Abschnitt &amp;quot;connections&amp;quot; um folgende Zeile ergänzt werden:&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;auth&amp;quot;: {&amp;quot;user&amp;quot;: &amp;quot;fhem&amp;quot;, &amp;quot;pass&amp;quot;: &amp;quot;fhempassword&amp;quot;},&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei Verwendung von SSL bei FHEM muss auch noch &amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;ssl&amp;quot;: true,&amp;lt;/pre&amp;gt; hinzugefügt werden&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22678</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22678"/>
		<updated>2017-09-23T08:00:32Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: &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&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 Dongel am PI installieren ===&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain 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 Raspberry 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 (Download-Link ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für den Raspberry zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beide Programme (presenced/collectord) 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. Nach Installation der *.deb Pakete sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-rc.d presenced defaults&lt;br /&gt;
sudo update-rc.d collectord defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von presenced ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] Beschreibung zum PRESENCE Modul enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Jeden Raum einzeln ansprechen mittels presenced ===&lt;br /&gt;
=== Jeden Raum einzeln ansprechen mittels lepresenced ===&lt;br /&gt;
=== Alle Räume gemeinsam ansprechen mittels collectord ===&lt;br /&gt;
&lt;br /&gt;
== Batterieüberwachung == &lt;br /&gt;
&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;
= 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>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22677</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22677"/>
		<updated>2017-09-23T08:00:15Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Überschriften neu sortiert&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&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&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 Dongel am PI installieren ===&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain 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 Raspberry 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 (Download-Link ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für den Raspberry zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beide Programme (presenced/collectord) 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. Nach Installation der *.deb Pakete sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-rc.d presenced defaults&lt;br /&gt;
sudo update-rc.d collectord defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von presenced ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] Beschreibung zum PRESENCE Modul enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Jeden Raum einzeln ansprechen mittels presenced ===&lt;br /&gt;
=== Jeden Raum einzeln ansprechen mittels lepresenced ===&lt;br /&gt;
=== Alle Räume gemeinsam ansprechen mittels collectord ===&lt;br /&gt;
&lt;br /&gt;
== Batterieüberwachung == &lt;br /&gt;
&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;
= 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>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22676</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=22676"/>
		<updated>2017-09-23T07:55:14Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Neue Struktur für den Artikel&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 =&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&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 Dongel am PI installieren ====&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain 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 Raspberry 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 (Download-Link ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für den Raspberry zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beide Programme (presenced/collectord) 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. Nach Installation der *.deb Pakete sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-rc.d presenced defaults&lt;br /&gt;
sudo update-rc.d collectord defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von presenced ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] Beschreibung zum PRESENCE Modul enthalten.&lt;br /&gt;
&lt;br /&gt;
==== Jeden Raum einzeln ansprechen mittels presenced ====&lt;br /&gt;
==== Jeden Raum einzeln ansprechen mittels lepresenced ==== &lt;br /&gt;
==== Alle Räume gemeinsam ansprechen mittels collectord ==== &lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung === &lt;br /&gt;
&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;
== 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>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22602</id>
		<title>DbLog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22602"/>
		<updated>2017-09-18T04:26:17Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Code des userReadings korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Protokolliert Ereignisse in einer Datenbank&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=93_DbLog.pm&lt;br /&gt;
|ModOwner=tobiasfaust ({{Link2FU|118|Forum}}/[[Benutzer Diskussion:Tobias.faust|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit der Zeit entstehen im fhem recht umfangreiche Log-Daten für die verschiedensten konfigurierten Devices. Die übliche Einstiegs-[[Konfiguration]] sieht vor, dass die Logs als [http://fhem.de/commandref_DE.html#FileLog FileLog] gespeichert werden - je nach Einstellung in wenigen sehr großen oder vielen kleineren Dateien. Der Datei-basierte Zugriff ist allerdings nicht wirklick performant und kann schnell zum Flaschenhals werden (z.B. bei der Darstellung von Graphen über einen längeren Zeitraum).&lt;br /&gt;
&lt;br /&gt;
Alternativ kann Fhem die Log-Daten mittels [http://fhem.de/commandref_DE.html#DbLog DbLog] in einer Datenbank speichern. Diese kann lokal als einfache SQLite- oder als zentrale Server-Datenbank (s.u.) gestaltet sein. Schon eine lokale einfache SQLite-Datenbank ist in der Regel deutlich performanter als File-basierte Logs.&lt;br /&gt;
&lt;br /&gt;
Damit eine Datenbank-Nutzung möglich ist, müssen folgende Anpassungen gemacht werden:&lt;br /&gt;
# [[#Datenbank|Erstellen einer entsprechenden Datenbank]]&lt;br /&gt;
# [[#Datenbank-Anbindung mittels db.conf|Konfiguration der Datenbank-Anbindung in FHEM]]&lt;br /&gt;
# [[#Konfiguration als Device in fhem.cfg|Anpassen aller (oder einzelner) Konfigurationen von FileLog nach DbLog]]&lt;br /&gt;
# [[#Anpassen der gplot-Konfigurationen|Ggf. Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
=== Datenbank-Anbindung mittels db.conf ===&lt;br /&gt;
DbLog wird durch 2 verschiedene Einträge aktiviert/definiert. In einer Datei namens &#039;&#039;&#039;db.conf&#039;&#039;&#039; werden die Parameter für eine Verbindung zur Datenbank (host, username, password, etc.) hinterlegt. Diese Datei kann in einem beliebigen Verzeichnis angelegt werden. Für eine MySQL-Datenbank sieht die db.conf folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
 %dbconfig= (&lt;br /&gt;
     connection =&amp;gt; &amp;quot;mysql:database=fhem;host=db;port=3306&amp;quot;,&lt;br /&gt;
     user =&amp;gt; &amp;quot;fhemuser&amp;quot;,&lt;br /&gt;
     password =&amp;gt; &amp;quot;fhempassword&amp;quot;,&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation befindet sich eine Beispielkonfiguration mit der Syntax für jeden unterstützen Datenbanktyp.&lt;br /&gt;
Es wird empfohlen diese Datei zu kopieren und erst dann entsprechend zu bearbeiten. Am Besten kopiert man diese Datei in das FHEM Home Directory /opt/fhem/ und achtet auf die entsprechenden Rechte!&lt;br /&gt;
 chown fhem:dialout /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration als Device ===&lt;br /&gt;
Das DbLog Device wird dann definiert mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; DbLog &amp;lt;configfilename&amp;gt; &amp;lt;regexp&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;configfilename&amp;gt;&#039;&#039; dem Pfad zur zuvor angelegten db.conf entspricht.&lt;br /&gt;
Ein Beispiel hierfür wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;&lt;br /&gt;
Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit vielen teils irrelevanten Werten gefüllt wird. Man kann daher die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Dies ist in [[#Finetuning des Loggings]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Finetuning des Loggings ===&lt;br /&gt;
Bei der Konfiguration des Log-Devices werden die zu loggenden Daten definiert - in der einfachsten Form sieht das so aus: &amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;. Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit sehr vielen und teils nicht benötigten Werten gefüllt wird und schnell wächst. Die Datenbank ist zwar deutlich leistungsfähiger, was große Datenmengen angeht, Datensparsamkeit kann aber schnell sinnvoll werden...&lt;br /&gt;
&lt;br /&gt;
Um das Log-Aufkommen einzugrenzen gibt es 2 Ansätze:&lt;br /&gt;
* Einschränkung über den &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag&lt;br /&gt;
* Einschränkung über DbLogExclude-Einträge der jeweiligen Devices&lt;br /&gt;
* Einschränkung über DbLogInclude-Einträge des jeweiligen Devices&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über den zentralen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag ====&lt;br /&gt;
Man kann die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Die erste Wildcard, also das erste &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt;, entspricht dem in FHEM verwendeten Device-Namen. Die zweite Wildcard entspricht dem vom Device ausgegebenen zu loggenden Wert. Separiert werden beiden Angaben durch einen Doppelpunkt. &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel, um zwar alle definierten Devices zu erfassen, aber nur die Werte Temperatur, Ventilposition und Luftfeuchte in die Datenbank zu schreiben wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).* &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über die jeweiligen Devices ====&lt;br /&gt;
Man kann die zu loggenden Werte für einzelne Devices separat einschränken, ohne dies im zentralen define-Eintrag machen zu müssen. Dies kann interessant sein, wenn beispielsweise ein Device Fehlerwerte meldet, die uninteressant sind, oder es meldet unnötig häufig Werte - beides ist z.B. bei 1-wire-Temperatursensoren gerne der Fall.&lt;br /&gt;
&lt;br /&gt;
Um das einzuschränken gibt es 2 Stellparameter, die als Attribute direkt zum jeweiligen Device konfiguriert werden:&lt;br /&gt;
* DbLogExclude - definiert Werte, die nicht geloggt werden sollen&lt;br /&gt;
* DbLogInclude - definiert Werte, die geloggt werden sollen ( siehe attr DbLogSelectionMode )&lt;br /&gt;
* event-min-interval, event-on-change-reading und event-on-update-reading beeinflussen, wie häufig Werte geloggt werden (vgl. [http://fhem.de/commandref_DE.html#event-on-update-reading commandref])&lt;br /&gt;
&lt;br /&gt;
Eine konkrete Konfiguration für einen sehr gesprächigen 1-wire-Temperatursensor könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define EG_Balkon GPIO4 BUSMASTER&lt;br /&gt;
attr EG_Balkon DbLogExclude failures,T,85     # logge keine &amp;quot;failures&amp;quot;, &amp;quot;T&amp;quot;-Werte und &amp;quot;85&amp;quot;-Werte (default-Werte, wenn keine Temperatur gelesen werden kann)&lt;br /&gt;
attr EG_Balkon event-on-change-reading state  # logge nur, wenn sich ein Wert ändert (wenn sich die Temperatur nicht ändert, logge das nicht)&lt;br /&gt;
attr EG_Balkon event-min-interval state:900   # logge spätestens alle 900sec = 15min&lt;br /&gt;
attr EG_Balkon event-on-update-reading .*     # logge alle Werte, die aktualisiert werden&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;1-Wire-Device vom Typ OWTHERM oder OWSWITCH&amp;gt; DbLogExclude data.*      # verhindert das Logging der state-Eintragungen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine in diesem {{Link2Forum|Topic=33697|Message=264127}} vorgestellte Strategie zur Vermeidung unnötigen Loggings ist, dass bei der Definition von Devices durch das nachfolgende &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; automatisch ein DbLogExclude für alle Werte (.*) des Devices zugewiesen wird und dies nur bei Interesse an geloggten Werten gelöscht bzw. angepasst wird:&lt;br /&gt;
&amp;lt;code&amp;gt;define nDbLogExclude notify global:DEFINED.* attr $EVTPART1 DbLogExclude .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es mittlerweile möglich, lediglich erwünschte Werte (Positiv-Liste) zu loggen und alle anderen zu verwerfen. Hierfür wird im LogDevice das attribut DbLogSelectionMode Include verwendet. Nun kann für jedes Device mit DbLogInclude &amp;lt;Reading1&amp;gt;,&amp;lt;Reading2&amp;gt;,... angegeben werden, welche Readings geloggt werden sollen. &lt;br /&gt;
Integriert ist ebenfalls ein &amp;quot;min-interval&amp;quot;, siehe commandref.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
Unterstützte Datenbanksysteme (Auswahl):&lt;br /&gt;
* Sqlite&lt;br /&gt;
* MySQL&lt;br /&gt;
* PostGreSql&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Die Datenbank ist relativ simpel gestaltet und besteht lediglich aus den folgenden beiden Tabellen:&lt;br /&gt;
* current&lt;br /&gt;
* history&lt;br /&gt;
&lt;br /&gt;
DbLog ist auf eine feste Tabellenstruktur angewiesen. Man muss daher in seiner Datenbank eine Tabelle mit folgenden Spalten anlegen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Spalte&lt;br /&gt;
! Beschreibung (en)&lt;br /&gt;
! Beschreibung (de)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TIMESTAMP&#039;&#039;&#039;&lt;br /&gt;
| timestamp of event&lt;br /&gt;
| Zeitstempel&lt;br /&gt;
| 2007-12-30 21:45:22 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEVICE&#039;&#039;&#039;&lt;br /&gt;
| device name&lt;br /&gt;
| Device-Name&lt;br /&gt;
| Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TYPE&#039;&#039;&#039;&lt;br /&gt;
| device type&lt;br /&gt;
| Device-Typ&lt;br /&gt;
| KS300&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;EVENT&#039;&#039;&#039;&lt;br /&gt;
| event specification as full string&lt;br /&gt;
| Eventspezifikation als Text&lt;br /&gt;
| humidity: 71 (%)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;READING&#039;&#039;&#039;&lt;br /&gt;
| name of reading extracted from event&lt;br /&gt;
| Bezeichnung des Readings&lt;br /&gt;
| humidity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VALUE&#039;&#039;&#039;&lt;br /&gt;
| actual reading extracted from event&lt;br /&gt;
| Wert des Readings&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UNIT&#039;&#039;&#039;&lt;br /&gt;
| unit extracted from event&lt;br /&gt;
| Einheit des Readings&lt;br /&gt;
| %&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Vorlagen zur Anlage von Tabellen und Indizes sind für jeden unterstützten Datenbanktyp im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation, oder hier zu finden: [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/dblog/ Link]. Das MySQL-Skript (db_create_mysql.sql) legt eine neue Datenbank, das PostGres-Skript (db_create_postgresql.sql) ein neues Schema mit Namen &amp;quot;fhem&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
==== current ====&lt;br /&gt;
Die Tabelle current enthält für jedes zu loggende Device lediglich den letzten Wert. Falls noch kein Wert geloggt wurde, ist diese Tabelle leer. &lt;br /&gt;
Falls der Inhalt gelöscht wird, bauen sich die Daten automatisch wieder auf. Es gehen durch das löschen der Tabelle current keine Log-Informationen verloren.&lt;br /&gt;
Der Inhalt wird aber u.a. für die Dropdown-Felder beim Plot-Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
Um doppelte Einträge in der Tabelle zu vermeiden, wurden die Möglichkeit geschaffen Primary Keys zu definieren. Da in der Spalte &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; u.U. bei verschiedenen Geräten gleiche Namen vorkommen können, sollte der Primary Key um den Gerätenamen erweitert werden. Der Primary Key sollte also aus &amp;lt;code&amp;gt;DEVICE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; bestehen. Um in der Datenbank &#039;&#039;fhem&#039;&#039; diesen PK zu setzen, kann folgender SQL Code verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`current` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== history ====&lt;br /&gt;
Die Tabelle history enthält alle bisher geloggten Daten. Löschen in dieser Tabelle bedeutet automatisch Datenverlust (gewollt oder nicht ... )&lt;br /&gt;
Der Inhalt dieser Tabelle wird verwendet, um die Plots zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
== Anpassen der gplot-Konfigurationen ==&lt;br /&gt;
Die meisten gplot-Konfigurationen sind bisher lediglich auf FileLog-Konfigurationen ausgelegt. Deshalb müssen sie für die Verwendung mit DbLog angepasst werden. Glücklicherweise beschränkt sich dies auf die reinen FileLog-Zeilen - es müssen die DbLog-Äquivalente hinzugefügt werden. Die FileLog-Einträge müssen zwar nicht gelöscht werden, wenn man aber FileLog und DbLog parallel betreibt, sollte man getrennte gplot-Dateien für beide Logging-Typen haben um Auswertungsprobleme erkennen zu können.&lt;br /&gt;
&lt;br /&gt;
Für die fht.gplot Konfiguration sähe die Anpassung wie folgt aus (lediglich die vier DbLog-Zeilen wurden hinzugefügt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2014-12-25 21:53:30&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 ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid y2tics&lt;br /&gt;
set ylabel &amp;quot;Actuator/Window (%)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set yrange 0:100&lt;br /&gt;
set y2range 5:25&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:.measured-temp\x3a:0:&lt;br /&gt;
#FileLog 4:.actuator\x3a:0:int&lt;br /&gt;
#FileLog 4:.desired-temp::&lt;br /&gt;
#FileLog 4:.window\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.measured-temp:0:&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.actuator:0:int&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.desired-temp::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.window::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Measured temperature&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Actuator (%)&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Desired Temperature&#039; ls l2 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Window&#039; ls l3 lw 1 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten: &lt;br /&gt;
&lt;br /&gt;
On-Off-Plots&lt;br /&gt;
&lt;br /&gt;
 EG_Bad:window:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:0/eg&lt;br /&gt;
&lt;br /&gt;
unter Berücksichtigung von dim-Werten:&lt;br /&gt;
&lt;br /&gt;
 EG_WoZi_Licht:value:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:($1eq&amp;quot;dim&amp;quot;?$2*0.01:0)/eg&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer SQLite-Datenbank ==&lt;br /&gt;
Im folgenden wird eine lokale SQLite-Datenbank auf einen Ubuntu-System angelegt (nach Quelle: [http://www.tatsch-it.de/fhem-dblog/ http://www.tatsch-it.de/fhem-dblog/])&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Installation von SQLite:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo aptitude install sqlite3 libdbi-perl libdbd-sqlite3-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anlegen der SQLite-Datenbank fhem.db&#039;&#039; (öffnet auch direkt eine SQL-Kommandozeile):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE &#039;history&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE TABLE &#039;current&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE INDEX Search_Idx ON `history` (DEVICE, READING, TIMESTAMP);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassen des Besitzers und der Rechte der Datenbank-Datei:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chown fhem /opt/fhem/fhem.db&lt;br /&gt;
sudo chmod 666 /opt/fhem/fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Datenbank-Anbindung des FHEM konfigurieren:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/db.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%dbconfig= (&lt;br /&gt;
  connection =&amp;gt; &amp;quot;SQLite:dbname=/opt/fhem/fhem.db&amp;quot;,&lt;br /&gt;
  user =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  password =&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Logging des FHEM auf die Datenbank konfigurieren:&#039;&#039; (hier sind nur die Anpassungen aufgeführt)&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/fhem.cfg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
attr global userattr DbLogExclude ...  # erlaubt es einzelne Einträge nicht zu loggen&lt;br /&gt;
...&lt;br /&gt;
define logdb DbLog ./db.conf .*:.*     # logt alle(!) auflaufenden Events aller Konfigurationen&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da durch diese &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Definition alle auflaufenden Events gelogt werden, müssen keine weiteren Anpassungen in der Konfiguration gemacht werden. Die FileLog-Einträge können bedenkenlos bestehen bleiben - dann wird in Datenbank und FileLog gelogt und man verliert keine Daten, falls etwas nicht klappt. Wenn alles wie geplant läuft, können die FileLog-Definitionen gelöscht werden (ebenso die Log-Dateien). Ebenso können die zu loggenden Daten später eingegrenzt werden (s. [[#Finetuning des Loggings]]).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;FHEM neu starten:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service fhem stop&lt;br /&gt;
sudo service fhem start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Kontrollieren, ob Logs in die Datenbank geschrieben werden:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from history order by TIMESTAMP;       # dies gibt alle(!) Logs chronologisch aus (kann nach längerem Betrieb recht lange dauern)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassung der glot-Dateien:&#039;&#039; siehe [[#Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer Mysql-Datenbank ==&lt;br /&gt;
Anstatt nano kann jeder andere kompatible Editor verwendet werden. Weiterhin bitte beachten, dass die hier genannten Befehle teilweise root-Rechte voraussetzen. Entweder komplett als root arbeiten, oder mittels sudo.&lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu/debian: &lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get install mysql-server mysql-client libdbd-mysql libdbd-mysql-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Installation sollte man aus Sicherheitsgründen ein Passwort für den mysql-root vergeben, wenn man nicht sogar ganz den Login verbietet.&lt;br /&gt;
&lt;br /&gt;
Hinweis: im Folgenden ist &amp;quot;#&amp;quot; der normale Prompt und &amp;quot;mysql&amp;gt;&amp;quot; der prompt innerhalb mysql, dieser kann mit exit verlassen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Test mal mit mysql verbinden:&lt;br /&gt;
 # mysql -p -u root&lt;br /&gt;
 Enter password:&lt;br /&gt;
 mysql&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
Jetzt die Tabellenstruktur anlegen. &lt;br /&gt;
Hierfür kann die Datei /opt/fhem/contrib/dblog/db_create_mysql.sql als Vorlage verwendet und das Passwort und der Benutzername geändert werden. &lt;br /&gt;
 cd /opt/fhem/contrib/dblog/&lt;br /&gt;
 nano db_create_mysql.sql&lt;br /&gt;
Dann wird die Datei eingelesen (root Passwort wird abgefragt): &lt;br /&gt;
&lt;br /&gt;
 # mysql -u root -p &amp;lt; db_create_mysql.sql&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man den Zugang testen: &lt;br /&gt;
&lt;br /&gt;
 # mysql -p -u &amp;lt;fhemuser&amp;gt;&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; show databases;&lt;br /&gt;
&lt;br /&gt;
Nun müsste eine Datenbank &amp;quot;fhem&amp;quot; angezeigt werden, die die Tabellen current und history enthält.&lt;br /&gt;
&lt;br /&gt;
Nun in der Datei db.conf den mysql-Block auskommentieren und ebenfalls Benutzername, Passwort UND HOST anpassen. Leider ist hier nicht standardmäßig localhost eingestellt.&lt;br /&gt;
 nano /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
Jetzt kann unter FHEM ein DbLog-Device angelegt werden (mit dem beispiel wird alles geloggt: &lt;br /&gt;
 define logdb DbLog ./db.conf .*:.*&lt;br /&gt;
Als State muss ein &amp;quot;connected&amp;quot; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Ein rereadcfg in Fhem stellt sicher, dass die neue Konfiguration übernommen wird - ein Neustart ist nicht erforderlich&lt;br /&gt;
&lt;br /&gt;
Nun kann die Funktion noch einmal überprüft werden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 # mysql -u &amp;lt;fhemuser&amp;gt; -p&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; use fhem;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0,00 sec)&lt;br /&gt;
 mysql&amp;gt; select * from history; # Achtung, kann sehr groß werden .... #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integration von DBLog in eigene Module ==&lt;br /&gt;
=== Bereitstellung der UNITS ===&lt;br /&gt;
Mit der DbLog_splitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Dazu muss der Modulautor in der [[DevelopmentModuleIntro#X_Initialize|Initialize-Funktion]] eine &amp;lt;code&amp;gt;DbLog_splitFn&amp;lt;/code&amp;gt; bereitstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{DbLog_splitFn}      = &amp;quot;X_DbLog_splitFn&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genaue Aufrufsyntax und Funktionweise einer DbLog_split-Funktion findet man [[DevelopmentModuleIntro#X_DbLog_split|hier]].&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Beim Anlegen der Datenbank per script wird die Value-Spalte nur als Varchar(32) definiert. Dieses kann dazu führen, dass besonders lange Readings (z.b. vom Modul sysmon) abgeschnitten werden und nicht in der Datenbank landen. Dieses lässt sich leicht beheben, indem man die Spalte auf Varchar(64) ändert (siehe auch {{Link2Forum|Topic=25648|Message=252433|LinkText=diesen Forenbeitrag}}).&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE current MODIFY VALUE VARCHAR(64);&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE history MODIFY VALUE VARCHAR(64);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Werte auslesen ==&lt;br /&gt;
Manchmal möchte man Daten aus den Logs abrufen ohne händisch in der Datenbank herumzuwühlen (s.u.). Dies ist insb. auch dann hilfreich, wenn man eigenen Funktionen, Notifys oder spezielle Plots entwirft, bei denen man auf Logdaten zugreifen möchte.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich beschrieben ist dies in der [http://fhem.de/commandref_DE.html#DbLog commandref#DbLog] und unterscheidet sich minimal (aber entscheidend) von der Struktur bei [[FileLog#Werte_auslesen|FileLogs]].&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, was man damit anstellen kann:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01 2016-10-03 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor vom 01.10.-03.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor von 8-16 Uhr am 01.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor:temperature&amp;lt;/code&amp;gt; nur die temperature Werte&lt;br /&gt;
* &amp;lt;code&amp;gt;{ ReadingsTimestamp(&amp;quot;meinSensor&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;0&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des aktuellen state des meinSensor&lt;br /&gt;
* &amp;lt;code&amp;gt;{ OldTimestamp(&amp;quot;meinSensor&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des letzten state des FHT_3a32&lt;br /&gt;
* &amp;lt;code&amp;gt;{ time_str2num(OldTimestamp(&amp;quot;meinSensor&amp;quot;)) }&amp;lt;/code&amp;gt; Timestamp in Sekunden des letzten state des meinSensor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Bearbeitung von Datenbank-Einträgen ==&lt;br /&gt;
{{Hinweis|Dieser Abschnitt soll lediglich eine kleine Einführung in die Datenbank-Bearbeitung liefern. Für vertiefende Informationen sollte man sich grundsätzlich mit SQL beschäftigen. Eine umfassende und gut verständliche Anleitung zu SQL bietet bspw. [http://www.w3schools.com/sql/default.asp w3schools].}}&lt;br /&gt;
Irgendwann wird der Fall eintreten, dass in der Datenbank Einträge drinstehen, die geändert oder gelöscht werden sollen (zB. fehlerhafte Sensor-Rückmeldungen, umbenannte Readings). In klassischen Log-Dateien würde man diese einfach bearbeiten und löschen/anpassen (wobei man aber tunlichst zuvor den fhem ausmacht um Datenfehler zu vermeiden). Eine Datenbank kann bearbeitet werden ohne den fhem abschalten zu müssen. &lt;br /&gt;
&lt;br /&gt;
Datenbanken kann man ohne weiter Hilfsmittel direkt von der Kommandozeile/Shell aus bearbeiten. Alternativ gibt es auch verschiedenste Tools (webbasiert oder als Applikation), die einen dabei unterstützen (Bsp. findet man u.a. [https://wiki.ubuntuusers.de/SQLite/#Grafische-Benutzeroberflaechen hier]). Für einfache Arbeiten reicht allerdings idR. Shell.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
&#039;&#039;&#039;Öffnen der DB unter Linux:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(Es werden Schreibrechte benötigt,ohne kann man die DB zwar öffnen, aber nichts machen)&lt;br /&gt;
 sudo sqlite3 fhem.db&lt;br /&gt;
Dadurch öffnet sich ein SQL-Konsole, auf der alle weiteren Befehle ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schliessen der DB:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hilfe anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Tabellen anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Schema der DB anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(vgl. oben [[DbLog#Datenbanken]] und [[DbLog#Beispiel: Anlegen und Nutzung einer SQLite-Datenbank]])&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .schema&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Eintäge anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Die Einträge liegen alle in der Tabelle &amp;quot;History&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ganz wichtig&#039;&#039;&#039; ist immer das &amp;quot;;&amp;quot; am Ende Zeile (bei allen Kommandos, die nicht mit einem &amp;quot;.&amp;quot; anfangen). Wenn es vergessen wurde zeigt die Konsole solange neue Zeilen bis ein &amp;quot;;&amp;quot; eingegeben wird. So kann ein Befehl auch bequem über mehrere Zeilen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY;&lt;br /&gt;
&lt;br /&gt;
Dies kann sehr lange dauern und kann ggf. mit &amp;lt;code&amp;gt;STRG-C&amp;lt;/code&amp;gt; abgebrochen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-Statements werden Strings in einfache Anführungsstriche gesetzt, Zahlen nicht.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LÖSCHEN aller Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Löschen kann nicht rückgängig gemacht werden!! Also IMMER erst die entsprechenden SELECT-Statements solange verfeinern bis wirklich nur die gewünschten Einträge angezeigt werden. Dann das &amp;lt;code&amp;gt;select *&amp;lt;/code&amp;gt; durch &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ersetzen.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; delete from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenbank reparieren ==&lt;br /&gt;
Es kann immer wieder mal vorkommen, dass Datenbanken Fehler enthalten. Das muss im Alltag garnicht auffallen und auch nicht immer schlimm enden. Wenn man auf der SQL-Konsole aber bspw. eine Meldung &amp;lt;code&amp;gt;Error: database disk image is malformed&amp;lt;/code&amp;gt; erhält, sollte man ein Reparatur vornehmen.&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
Die folgenden Schritte beschreiben, wie man eine SQLite-DB reparieren kann (Quelle: [http://techblog.dorogin.com/2011/05/sqliteexception-database-disk-image-is.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
DB öffnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Integritäts-Check durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sqlite&amp;gt; pragma integrity_check;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt hier ein &amp;quot;ok&amp;quot; ist die DB gesund. Ansonsten erscheint etwas wie&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** in database main ***&lt;br /&gt;
On tree page 118786 cell 1: Rowid 75 out of order (previous was 816660)&lt;br /&gt;
On tree page 118786 cell 4: Rowid 815704 out of order (previous was 816727)&lt;br /&gt;
Corruption detected in cell 0 on page 118786&lt;br /&gt;
Multiple uses for byte 132 of page 118786&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Datenbank-Dump erstellen (Export gesamten DB in die Datei &amp;quot;dump_all_20160516_1043.sql&amp;quot;) und DB verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .mode insert&lt;br /&gt;
sqlite&amp;gt; .output dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; .dump&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Neue Datenbank erstellen und den Dump einlesen, Integritäts-Check machen und verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem-neu.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .read dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; pragma integrity_check;&lt;br /&gt;
ok&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Spätestens jetzt fhem stoppen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem stop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Alte DB sichern und neue aktivieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv fhem.db fhem.db.sv_20160516&lt;br /&gt;
sudo mv fhem-neu.db fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Kontrollieren, dass die neue DB die gleichen Rechte wie die alte DB hat (und ggf. korrigieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 root root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
~/fhem$ sudo chown fhem:root fhem.db&lt;br /&gt;
&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 fhem root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
fhem wieder starten (und natürlich kontrollieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem start&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nützliche Codeschnipsel ==&lt;br /&gt;
Anbei ein paar nützliche Codeschnipsel rund um DbLog&lt;br /&gt;
&lt;br /&gt;
=== Dateigrösse mitloggen ===&lt;br /&gt;
Da die Datenbank ins Unermessliche wachsen kann, empfiehlt es sich - je nach Speicherplatz - ab einer bestimmten Grösse tätig zu werden. Dazu muss diese Grösse allerdings ermittelt werden. Diese geschieht mittels des Userreadings, welches man vorteilshafterweise mit im DbLog-device anlegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;attr myDbLog userReadings DbFileSize:reduceLogState.* { (split(&#039; &#039;,`du -m fhem.db`))[0] }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels dieses Attributs wird die Grösse der .db-Datei immer nach dem Ausführen des ReduceLog in das Reading &amp;quot;DbFileSize&amp;quot; in ganzzahligen MByte abgelegt.&lt;br /&gt;
&lt;br /&gt;
Basierend auf diesem Reading können dann weitere Aktionen, beispielsweise ein Plot, erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Heizleistung_und_Gasverbrauch|Beispiel das DbLog-Daten für SVG-Plots verwendet]]&lt;br /&gt;
* [[SVG-Plots von FileLog auf DbLog umstellen]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22539</id>
		<title>DbLog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22539"/>
		<updated>2017-09-11T09:11:27Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: SearchIndex beim SQLite Befehl hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Protokolliert Ereignisse in einer Datenbank&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=93_DbLog.pm&lt;br /&gt;
|ModOwner=tobiasfaust ({{Link2FU|118|Forum}}/[[Benutzer Diskussion:Tobias.faust|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit der Zeit entstehen im fhem recht umfangreiche Log-Daten für die verschiedensten konfigurierten Devices. Die übliche Einstiegs-[[Konfiguration]] sieht vor, dass die Logs als [http://fhem.de/commandref_DE.html#FileLog FileLog] gespeichert werden - je nach Einstellung in wenigen sehr großen oder vielen kleineren Dateien. Der Datei-basierte Zugriff ist allerdings nicht wirklick performant und kann schnell zum Flaschenhals werden (z.B. bei der Darstellung von Graphen über einen längeren Zeitraum).&lt;br /&gt;
&lt;br /&gt;
Alternativ kann Fhem die Log-Daten mittels [http://fhem.de/commandref_DE.html#DbLog DbLog] in einer Datenbank speichern. Diese kann lokal als einfache SQLite- oder als zentrale Server-Datenbank (s.u.) gestaltet sein. Schon eine lokale einfache SQLite-Datenbank ist in der Regel deutlich performanter als File-basierte Logs.&lt;br /&gt;
&lt;br /&gt;
Damit eine Datenbank-Nutzung möglich ist, müssen folgende Anpassungen gemacht werden:&lt;br /&gt;
# [[#Datenbank|Erstellen einer entsprechenden Datenbank]]&lt;br /&gt;
# [[#Datenbank-Anbindung mittels db.conf|Konfiguration der Datenbank-Anbindung in FHEM]]&lt;br /&gt;
# [[#Konfiguration als Device in fhem.cfg|Anpassen aller (oder einzelner) Konfigurationen von FileLog nach DbLog]]&lt;br /&gt;
# [[#Anpassen der gplot-Konfigurationen|Ggf. Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
=== Datenbank-Anbindung mittels db.conf ===&lt;br /&gt;
DbLog wird durch 2 verschiedene Einträge aktiviert/definiert. In einer Datei namens &#039;&#039;&#039;db.conf&#039;&#039;&#039; werden die Parameter für eine Verbindung zur Datenbank (host, username, password, etc.) hinterlegt. Diese Datei kann in einem beliebigen Verzeichnis angelegt werden. Für eine MySQL-Datenbank sieht die db.conf folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
 %dbconfig= (&lt;br /&gt;
     connection =&amp;gt; &amp;quot;mysql:database=fhem;host=db;port=3306&amp;quot;,&lt;br /&gt;
     user =&amp;gt; &amp;quot;fhemuser&amp;quot;,&lt;br /&gt;
     password =&amp;gt; &amp;quot;fhempassword&amp;quot;,&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation befindet sich eine Beispielkonfiguration mit der Syntax für jeden unterstützen Datenbanktyp.&lt;br /&gt;
Es wird empfohlen diese Datei zu kopieren und erst dann entsprechend zu bearbeiten. Am Besten kopiert man diese Datei in das FHEM Home Directory /opt/fhem/ und achtet auf die entsprechenden Rechte!&lt;br /&gt;
 chown fhem:dialout /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration als Device ===&lt;br /&gt;
Das DbLog Device wird dann definiert mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; DbLog &amp;lt;configfilename&amp;gt; &amp;lt;regexp&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;configfilename&amp;gt;&#039;&#039; dem Pfad zur zuvor angelegten db.conf entspricht.&lt;br /&gt;
Ein Beispiel hierfür wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;&lt;br /&gt;
Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit vielen teils irrelevanten Werten gefüllt wird. Man kann daher die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Dies ist in [[#Finetuning des Loggings]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Finetuning des Loggings ===&lt;br /&gt;
Bei der Konfiguration des Log-Devices werden die zu loggenden Daten definiert - in der einfachsten Form sieht das so aus: &amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;. Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit sehr vielen und teils nicht benötigten Werten gefüllt wird und schnell wächst. Die Datenbank ist zwar deutlich leistungsfähiger, was große Datenmengen angeht, Datensparsamkeit kann aber schnell sinnvoll werden...&lt;br /&gt;
&lt;br /&gt;
Um das Log-Aufkommen einzugrenzen gibt es 2 Ansätze:&lt;br /&gt;
* Einschränkung über den &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag&lt;br /&gt;
* Einschränkung über DbLogExclude-Einträge der jeweiligen Devices&lt;br /&gt;
* Einschränkung über DbLogInclude-Einträge des jeweiligen Devices&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über den zentralen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag ====&lt;br /&gt;
Man kann die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Die erste Wildcard, also das erste &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt;, entspricht dem in FHEM verwendeten Device-Namen. Die zweite Wildcard entspricht dem vom Device ausgegebenen zu loggenden Wert. Separiert werden beiden Angaben durch einen Doppelpunkt. &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel, um zwar alle definierten Devices zu erfassen, aber nur die Werte Temperatur, Ventilposition und Luftfeuchte in die Datenbank zu schreiben wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).* &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über die jeweiligen Devices ====&lt;br /&gt;
Man kann die zu loggenden Werte für einzelne Devices separat einschränken, ohne dies im zentralen define-Eintrag machen zu müssen. Dies kann interessant sein, wenn beispielsweise ein Device Fehlerwerte meldet, die uninteressant sind, oder es meldet unnötig häufig Werte - beides ist z.B. bei 1-wire-Temperatursensoren gerne der Fall.&lt;br /&gt;
&lt;br /&gt;
Um das einzuschränken gibt es 2 Stellparameter, die als Attribute direkt zum jeweiligen Device konfiguriert werden:&lt;br /&gt;
* DbLogExclude - definiert Werte, die nicht geloggt werden sollen&lt;br /&gt;
* DbLogInclude - definiert Werte, die geloggt werden sollen ( siehe attr DbLogSelectionMode )&lt;br /&gt;
* event-min-interval, event-on-change-reading und event-on-update-reading beeinflussen, wie häufig Werte geloggt werden (vgl. [http://fhem.de/commandref_DE.html#event-on-update-reading commandref])&lt;br /&gt;
&lt;br /&gt;
Eine konkrete Konfiguration für einen sehr gesprächigen 1-wire-Temperatursensor könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define EG_Balkon GPIO4 BUSMASTER&lt;br /&gt;
attr EG_Balkon DbLogExclude failures,T,85     # logge keine &amp;quot;failures&amp;quot;, &amp;quot;T&amp;quot;-Werte und &amp;quot;85&amp;quot;-Werte (default-Werte, wenn keine Temperatur gelesen werden kann)&lt;br /&gt;
attr EG_Balkon event-on-change-reading state  # logge nur, wenn sich ein Wert ändert (wenn sich die Temperatur nicht ändert, logge das nicht)&lt;br /&gt;
attr EG_Balkon event-min-interval state:900   # logge spätestens alle 900sec = 15min&lt;br /&gt;
attr EG_Balkon event-on-update-reading .*     # logge alle Werte, die aktualisiert werden&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;1-Wire-Device vom Typ OWTHERM oder OWSWITCH&amp;gt; DbLogExclude data.*      # verhindert das Logging der state-Eintragungen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine in diesem {{Link2Forum|Topic=33697|Message=264127}} vorgestellte Strategie zur Vermeidung unnötigen Loggings ist, dass bei der Definition von Devices durch das nachfolgende &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; automatisch ein DbLogExclude für alle Werte (.*) des Devices zugewiesen wird und dies nur bei Interesse an geloggten Werten gelöscht bzw. angepasst wird:&lt;br /&gt;
&amp;lt;code&amp;gt;define nDbLogExclude notify global:DEFINED.* attr $EVTPART1 DbLogExclude .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es mittlerweile möglich, lediglich erwünschte Werte (Positiv-Liste) zu loggen und alle anderen zu verwerfen. Hierfür wird im LogDevice das attribut DbLogSelectionMode Include verwendet. Nun kann für jedes Device mit DbLogInclude &amp;lt;Reading1&amp;gt;,&amp;lt;Reading2&amp;gt;,... angegeben werden, welche Readings geloggt werden sollen. &lt;br /&gt;
Integriert ist ebenfalls ein &amp;quot;min-interval&amp;quot;, siehe commandref.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
Unterstützte Datenbanksysteme (Auswahl):&lt;br /&gt;
* Sqlite&lt;br /&gt;
* MySQL&lt;br /&gt;
* PostGreSql&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Die Datenbank ist relativ simpel gestaltet und besteht lediglich aus den folgenden beiden Tabellen:&lt;br /&gt;
* current&lt;br /&gt;
* history&lt;br /&gt;
&lt;br /&gt;
DbLog ist auf eine feste Tabellenstruktur angewiesen. Man muss daher in seiner Datenbank eine Tabelle mit folgenden Spalten anlegen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Spalte&lt;br /&gt;
! Beschreibung (en)&lt;br /&gt;
! Beschreibung (de)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TIMESTAMP&#039;&#039;&#039;&lt;br /&gt;
| timestamp of event&lt;br /&gt;
| Zeitstempel&lt;br /&gt;
| 2007-12-30 21:45:22 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEVICE&#039;&#039;&#039;&lt;br /&gt;
| device name&lt;br /&gt;
| Device-Name&lt;br /&gt;
| Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TYPE&#039;&#039;&#039;&lt;br /&gt;
| device type&lt;br /&gt;
| Device-Typ&lt;br /&gt;
| KS300&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;EVENT&#039;&#039;&#039;&lt;br /&gt;
| event specification as full string&lt;br /&gt;
| Eventspezifikation als Text&lt;br /&gt;
| humidity: 71 (%)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;READING&#039;&#039;&#039;&lt;br /&gt;
| name of reading extracted from event&lt;br /&gt;
| Bezeichnung des Readings&lt;br /&gt;
| humidity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VALUE&#039;&#039;&#039;&lt;br /&gt;
| actual reading extracted from event&lt;br /&gt;
| Wert des Readings&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UNIT&#039;&#039;&#039;&lt;br /&gt;
| unit extracted from event&lt;br /&gt;
| Einheit des Readings&lt;br /&gt;
| %&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Vorlagen zur Anlage von Tabellen und Indizes sind für jeden unterstützten Datenbanktyp im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation, oder hier zu finden: [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/dblog/ Link]. Das MySQL-Skript (db_create_mysql.sql) legt eine neue Datenbank, das PostGres-Skript (db_create_postgresql.sql) ein neues Schema mit Namen &amp;quot;fhem&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
==== current ====&lt;br /&gt;
Die Tabelle current enthält für jedes zu loggende Device lediglich den letzten Wert. Falls noch kein Wert geloggt wurde, ist diese Tabelle leer. &lt;br /&gt;
Falls der Inhalt gelöscht wird, bauen sich die Daten automatisch wieder auf. Es gehen durch das löschen der Tabelle current keine Log-Informationen verloren.&lt;br /&gt;
Der Inhalt wird aber u.a. für die Dropdown-Felder beim Plot-Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
Um doppelte Einträge in der Tabelle zu vermeiden, wurden die Möglichkeit geschaffen Primary Keys zu definieren. Da in der Spalte &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; u.U. bei verschiedenen Geräten gleiche Namen vorkommen können, sollte der Primary Key um den Gerätenamen erweitert werden. Der Primary Key sollte also aus &amp;lt;code&amp;gt;DEVICE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; bestehen. Um in der Datenbank &#039;&#039;fhem&#039;&#039; diesen PK zu setzen, kann folgender SQL Code verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`current` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== history ====&lt;br /&gt;
Die Tabelle history enthält alle bisher geloggten Daten. Löschen in dieser Tabelle bedeutet automatisch Datenverlust (gewollt oder nicht ... )&lt;br /&gt;
Der Inhalt dieser Tabelle wird verwendet, um die Plots zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
== Anpassen der gplot-Konfigurationen ==&lt;br /&gt;
Die meisten gplot-Konfigurationen sind bisher lediglich auf FileLog-Konfigurationen ausgelegt. Deshalb müssen sie für die Verwendung mit DbLog angepasst werden. Glücklicherweise beschränkt sich dies auf die reinen FileLog-Zeilen - es müssen die DbLog-Äquivalente hinzugefügt werden. Die FileLog-Einträge müssen zwar nicht gelöscht werden, wenn man aber FileLog und DbLog parallel betreibt, sollte man getrennte gplot-Dateien für beide Logging-Typen haben um Auswertungsprobleme erkennen zu können.&lt;br /&gt;
&lt;br /&gt;
Für die fht.gplot Konfiguration sähe die Anpassung wie folgt aus (lediglich die vier DbLog-Zeilen wurden hinzugefügt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2014-12-25 21:53:30&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 ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid y2tics&lt;br /&gt;
set ylabel &amp;quot;Actuator/Window (%)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set yrange 0:100&lt;br /&gt;
set y2range 5:25&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:.measured-temp\x3a:0:&lt;br /&gt;
#FileLog 4:.actuator\x3a:0:int&lt;br /&gt;
#FileLog 4:.desired-temp::&lt;br /&gt;
#FileLog 4:.window\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.measured-temp:0:&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.actuator:0:int&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.desired-temp::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.window::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Measured temperature&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Actuator (%)&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Desired Temperature&#039; ls l2 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Window&#039; ls l3 lw 1 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten: &lt;br /&gt;
&lt;br /&gt;
On-Off-Plots&lt;br /&gt;
&lt;br /&gt;
 EG_Bad:window:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:0/eg&lt;br /&gt;
&lt;br /&gt;
unter Berücksichtigung von dim-Werten:&lt;br /&gt;
&lt;br /&gt;
 EG_WoZi_Licht:value:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:($1eq&amp;quot;dim&amp;quot;?$2*0.01:0)/eg&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer SQLite-Datenbank ==&lt;br /&gt;
Im folgenden wird eine lokale SQLite-Datenbank auf einen Ubuntu-System angelegt (nach Quelle: [http://www.tatsch-it.de/fhem-dblog/ http://www.tatsch-it.de/fhem-dblog/])&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Installation von SQLite:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo aptitude install sqlite3 libdbi-perl libdbd-sqlite3-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anlegen der SQLite-Datenbank fhem.db&#039;&#039; (öffnet auch direkt eine SQL-Kommandozeile):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE &#039;history&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE TABLE &#039;current&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE INDEX Search_Idx ON `history` (DEVICE, READING, TIMESTAMP);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassen des Besitzers und der Rechte der Datenbank-Datei:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chown fhem /opt/fhem/fhem.db&lt;br /&gt;
sudo chmod 666 /opt/fhem/fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Datenbank-Anbindung des FHEM konfigurieren:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/db.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%dbconfig= (&lt;br /&gt;
  connection =&amp;gt; &amp;quot;SQLite:dbname=/opt/fhem/fhem.db&amp;quot;,&lt;br /&gt;
  user =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  password =&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Logging des FHEM auf die Datenbank konfigurieren:&#039;&#039; (hier sind nur die Anpassungen aufgeführt)&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/fhem.cfg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
attr global userattr DbLogExclude ...  # erlaubt es einzelne Einträge nicht zu loggen&lt;br /&gt;
...&lt;br /&gt;
define logdb DbLog ./db.conf .*:.*     # logt alle(!) auflaufenden Events aller Konfigurationen&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da durch diese &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Definition alle auflaufenden Events gelogt werden, müssen keine weiteren Anpassungen in der Konfiguration gemacht werden. Die FileLog-Einträge können bedenkenlos bestehen bleiben - dann wird in Datenbank und FileLog gelogt und man verliert keine Daten, falls etwas nicht klappt. Wenn alles wie geplant läuft, können die FileLog-Definitionen gelöscht werden (ebenso die Log-Dateien). Ebenso können die zu loggenden Daten später eingegrenzt werden (s. [[#Finetuning des Loggings]]).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;FHEM neu starten:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service fhem stop&lt;br /&gt;
sudo service fhem start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Kontrollieren, ob Logs in die Datenbank geschrieben werden:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from history order by TIMESTAMP;       # dies gibt alle(!) Logs chronologisch aus (kann nach längerem Betrieb recht lange dauern)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassung der glot-Dateien:&#039;&#039; siehe [[#Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer Mysql-Datenbank ==&lt;br /&gt;
Anstatt nano kann jeder andere kompatible Editor verwendet werden. Weiterhin bitte beachten, dass die hier genannten Befehle teilweise root-Rechte voraussetzen. Entweder komplett als root arbeiten, oder mittels sudo.&lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu/debian: &lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get install mysql-server mysql-client libdbd-mysql libdbd-mysql-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Installation sollte man aus Sicherheitsgründen ein Passwort für den mysql-root vergeben, wenn man nicht sogar ganz den Login verbietet.&lt;br /&gt;
&lt;br /&gt;
Hinweis: im Folgenden ist &amp;quot;#&amp;quot; der normale Prompt und &amp;quot;mysql&amp;gt;&amp;quot; der prompt innerhalb mysql, dieser kann mit exit verlassen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Test mal mit mysql verbinden:&lt;br /&gt;
 # mysql -p -u root&lt;br /&gt;
 Enter password:&lt;br /&gt;
 mysql&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
Jetzt die Tabellenstruktur anlegen. &lt;br /&gt;
Hierfür kann die Datei /opt/fhem/contrib/dblog/db_create_mysql.sql als Vorlage verwendet und das Passwort und der Benutzername geändert werden. &lt;br /&gt;
 cd /opt/fhem/contrib/dblog/&lt;br /&gt;
 nano db_create_mysql.sql&lt;br /&gt;
Dann wird die Datei eingelesen (root Passwort wird abgefragt): &lt;br /&gt;
&lt;br /&gt;
 # mysql -u root -p &amp;lt; db_create_mysql.sql&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man den Zugang testen: &lt;br /&gt;
&lt;br /&gt;
 # mysql -p -u &amp;lt;fhemuser&amp;gt;&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; show databases;&lt;br /&gt;
&lt;br /&gt;
Nun müsste eine Datenbank &amp;quot;fhem&amp;quot; angezeigt werden, die die Tabellen current und history enthält.&lt;br /&gt;
&lt;br /&gt;
Nun in der Datei db.conf den mysql-Block auskommentieren und ebenfalls Benutzername, Passwort UND HOST anpassen. Leider ist hier nicht standardmäßig localhost eingestellt.&lt;br /&gt;
 nano /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
Jetzt kann unter FHEM ein DbLog-Device angelegt werden (mit dem beispiel wird alles geloggt: &lt;br /&gt;
 define logdb DbLog ./db.conf .*:.*&lt;br /&gt;
Als State muss ein &amp;quot;connected&amp;quot; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Ein rereadcfg in Fhem stellt sicher, dass die neue Konfiguration übernommen wird - ein Neustart ist nicht erforderlich&lt;br /&gt;
&lt;br /&gt;
Nun kann die Funktion noch einmal überprüft werden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 # mysql -u &amp;lt;fhemuser&amp;gt; -p&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; use fhem;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0,00 sec)&lt;br /&gt;
 mysql&amp;gt; select * from history; # Achtung, kann sehr groß werden .... #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integration von DBLog in eigene Module ==&lt;br /&gt;
=== Bereitstellung der UNITS ===&lt;br /&gt;
Mit der DbLog_splitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Dazu muss der Modulautor in der [[DevelopmentModuleIntro#X_Initialize|Initialize-Funktion]] eine &amp;lt;code&amp;gt;DbLog_splitFn&amp;lt;/code&amp;gt; bereitstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{DbLog_splitFn}      = &amp;quot;X_DbLog_splitFn&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genaue Aufrufsyntax und Funktionweise einer DbLog_split-Funktion findet man [[DevelopmentModuleIntro#X_DbLog_split|hier]].&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Beim Anlegen der Datenbank per script wird die Value-Spalte nur als Varchar(32) definiert. Dieses kann dazu führen, dass besonders lange Readings (z.b. vom Modul sysmon) abgeschnitten werden und nicht in der Datenbank landen. Dieses lässt sich leicht beheben, indem man die Spalte auf Varchar(64) ändert (siehe auch {{Link2Forum|Topic=25648|Message=252433|LinkText=diesen Forenbeitrag}}).&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE current MODIFY VALUE VARCHAR(64);&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE history MODIFY VALUE VARCHAR(64);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Werte auslesen ==&lt;br /&gt;
Manchmal möchte man Daten aus den Logs abrufen ohne händisch in der Datenbank herumzuwühlen (s.u.). Dies ist insb. auch dann hilfreich, wenn man eigenen Funktionen, Notifys oder spezielle Plots entwirft, bei denen man auf Logdaten zugreifen möchte.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich beschrieben ist dies in der [http://fhem.de/commandref_DE.html#DbLog commandref#DbLog] und unterscheidet sich minimal (aber entscheidend) von der Struktur bei [[FileLog#Werte_auslesen|FileLogs]].&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, was man damit anstellen kann:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01 2016-10-03 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor vom 01.10.-03.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor von 8-16 Uhr am 01.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor:temperature&amp;lt;/code&amp;gt; nur die temperature Werte&lt;br /&gt;
* &amp;lt;code&amp;gt;{ ReadingsTimestamp(&amp;quot;meinSensor&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;0&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des aktuellen state des meinSensor&lt;br /&gt;
* &amp;lt;code&amp;gt;{ OldTimestamp(&amp;quot;meinSensor&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des letzten state des FHT_3a32&lt;br /&gt;
* &amp;lt;code&amp;gt;{ time_str2num(OldTimestamp(&amp;quot;meinSensor&amp;quot;)) }&amp;lt;/code&amp;gt; Timestamp in Sekunden des letzten state des meinSensor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Bearbeitung von Datenbank-Einträgen ==&lt;br /&gt;
{{Hinweis|Dieser Abschnitt soll lediglich eine kleine Einführung in die Datenbank-Bearbeitung liefern. Für vertiefende Informationen sollte man sich grundsätzlich mit SQL beschäftigen. Eine umfassende und gut verständliche Anleitung zu SQL bietet bspw. [http://www.w3schools.com/sql/default.asp w3schools].}}&lt;br /&gt;
Irgendwann wird der Fall eintreten, dass in der Datenbank Einträge drinstehen, die geändert oder gelöscht werden sollen (zB. fehlerhafte Sensor-Rückmeldungen, umbenannte Readings). In klassischen Log-Dateien würde man diese einfach bearbeiten und löschen/anpassen (wobei man aber tunlichst zuvor den fhem ausmacht um Datenfehler zu vermeiden). Eine Datenbank kann bearbeitet werden ohne den fhem abschalten zu müssen. &lt;br /&gt;
&lt;br /&gt;
Datenbanken kann man ohne weiter Hilfsmittel direkt von der Kommandozeile/Shell aus bearbeiten. Alternativ gibt es auch verschiedenste Tools (webbasiert oder als Applikation), die einen dabei unterstützen (Bsp. findet man u.a. [https://wiki.ubuntuusers.de/SQLite/#Grafische-Benutzeroberflaechen hier]). Für einfache Arbeiten reicht allerdings idR. Shell.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
&#039;&#039;&#039;Öffnen der DB unter Linux:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(Es werden Schreibrechte benötigt,ohne kann man die DB zwar öffnen, aber nichts machen)&lt;br /&gt;
 sudo sqlite3 fhem.db&lt;br /&gt;
Dadurch öffnet sich ein SQL-Konsole, auf der alle weiteren Befehle ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schliessen der DB:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hilfe anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Tabellen anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Schema der DB anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(vgl. oben [[DbLog#Datenbanken]] und [[DbLog#Beispiel: Anlegen und Nutzung einer SQLite-Datenbank]])&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .schema&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Eintäge anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Die Einträge liegen alle in der Tabelle &amp;quot;History&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ganz wichtig&#039;&#039;&#039; ist immer das &amp;quot;;&amp;quot; am Ende Zeile (bei allen Kommandos, die nicht mit einem &amp;quot;.&amp;quot; anfangen). Wenn es vergessen wurde zeigt die Konsole solange neue Zeilen bis ein &amp;quot;;&amp;quot; eingegeben wird. So kann ein Befehl auch bequem über mehrere Zeilen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY;&lt;br /&gt;
&lt;br /&gt;
Dies kann sehr lange dauern und kann ggf. mit &amp;lt;code&amp;gt;STRG-C&amp;lt;/code&amp;gt; abgebrochen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-Statements werden Strings in einfache Anführungsstriche gesetzt, Zahlen nicht.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LÖSCHEN aller Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Löschen kann nicht rückgängig gemacht werden!! Also IMMER erst die entsprechenden SELECT-Statements solange verfeinern bis wirklich nur die gewünschten Einträge angezeigt werden. Dann das &amp;lt;code&amp;gt;select *&amp;lt;/code&amp;gt; durch &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ersetzen.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; delete from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenbank reparieren ==&lt;br /&gt;
Es kann immer wieder mal vorkommen, dass Datenbanken Fehler enthalten. Das muss im Alltag garnicht auffallen und auch nicht immer schlimm enden. Wenn man auf der SQL-Konsole aber bspw. eine Meldung &amp;lt;code&amp;gt;Error: database disk image is malformed&amp;lt;/code&amp;gt; erhält, sollte man ein Reparatur vornehmen.&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
Die folgenden Schritte beschreiben, wie man eine SQLite-DB reparieren kann (Quelle: [http://techblog.dorogin.com/2011/05/sqliteexception-database-disk-image-is.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
DB öffnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Integritäts-Check durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sqlite&amp;gt; pragma integrity_check;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt hier ein &amp;quot;ok&amp;quot; ist die DB gesund. Ansonsten erscheint etwas wie&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** in database main ***&lt;br /&gt;
On tree page 118786 cell 1: Rowid 75 out of order (previous was 816660)&lt;br /&gt;
On tree page 118786 cell 4: Rowid 815704 out of order (previous was 816727)&lt;br /&gt;
Corruption detected in cell 0 on page 118786&lt;br /&gt;
Multiple uses for byte 132 of page 118786&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Datenbank-Dump erstellen (Export gesamten DB in die Datei &amp;quot;dump_all_20160516_1043.sql&amp;quot;) und DB verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .mode insert&lt;br /&gt;
sqlite&amp;gt; .output dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; .dump&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Neue Datenbank erstellen und den Dump einlesen, Integritäts-Check machen und verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem-neu.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .read dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; pragma integrity_check;&lt;br /&gt;
ok&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Spätestens jetzt fhem stoppen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem stop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Alte DB sichern und neue aktivieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv fhem.db fhem.db.sv_20160516&lt;br /&gt;
sudo mv fhem-neu.db fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Kontrollieren, dass die neue DB die gleichen Rechte wie die alte DB hat (und ggf. korrigieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 root root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
~/fhem$ sudo chown fhem:root fhem.db&lt;br /&gt;
&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 fhem root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
fhem wieder starten (und natürlich kontrollieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem start&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nützliche Codeschnipsel ==&lt;br /&gt;
Anbei ein paar nützliche Codeschnipsel rund um DbLog&lt;br /&gt;
&lt;br /&gt;
=== Dateigrösse mitloggen ===&lt;br /&gt;
Da die Datenbank ins Unermessliche wachsen kann, empfiehlt es sich - je nach Speicherplatz - ab einer bestimmten Grösse tätig zu werden. Dazu muss diese Grösse allerdings ermittelt werden. Diese geschieht mittels des Userreadings, welches man vorteilshafterweise mit im DbLog-device anlegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;attr myDbLog userReadings DbFileSize:lastReduceLogResult.* { (split(&#039; &#039;,`du -m fhem.db`))[0] }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels dieses Attributs wird die Grösse der .db-Datei immer nach dem Ausführen des ReduceLog in das Reading &amp;quot;DbFileSize&amp;quot; in ganzzahligen MByte abgelegt.&lt;br /&gt;
&lt;br /&gt;
Basierend auf diesem Reading können dann weitere Aktionen, beispielsweise ein Plot, erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Heizleistung_und_Gasverbrauch|Beispiel das DbLog-Daten für SVG-Plots verwendet]]&lt;br /&gt;
* [[SVG-Plots von FileLog auf DbLog umstellen]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22523</id>
		<title>DbLog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22523"/>
		<updated>2017-09-08T18:46:30Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Hinweis bei mysql Datenbank anlegen auf root Rechte&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Protokolliert Ereignisse in einer Datenbank&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=93_DbLog.pm&lt;br /&gt;
|ModOwner=tobiasfaust ({{Link2FU|118|Forum}}/[[Benutzer Diskussion:Tobias.faust|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit der Zeit entstehen im fhem recht umfangreiche Log-Daten für die verschiedensten konfigurierten Devices. Die übliche Einstiegs-[[Konfiguration]] sieht vor, dass die Logs als [http://fhem.de/commandref_DE.html#FileLog FileLog] gespeichert werden - je nach Einstellung in wenigen sehr großen oder vielen kleineren Dateien. Der Datei-basierte Zugriff ist allerdings nicht wirklick performant und kann schnell zum Flaschenhals werden (z.B. bei der Darstellung von Graphen über einen längeren Zeitraum).&lt;br /&gt;
&lt;br /&gt;
Alternativ kann Fhem die Log-Daten mittels [http://fhem.de/commandref_DE.html#DbLog DbLog] in einer Datenbank speichern. Diese kann lokal als einfache SQLite- oder als zentrale Server-Datenbank (s.u.) gestaltet sein. Schon eine lokale einfache SQLite-Datenbank ist in der Regel deutlich performanter als File-basierte Logs.&lt;br /&gt;
&lt;br /&gt;
Damit eine Datenbank-Nutzung möglich ist, müssen folgende Anpassungen gemacht werden:&lt;br /&gt;
# [[#Datenbank|Erstellen einer entsprechenden Datenbank]]&lt;br /&gt;
# [[#Datenbank-Anbindung mittels db.conf|Konfiguration der Datenbank-Anbindung in FHEM]]&lt;br /&gt;
# [[#Konfiguration als Device in fhem.cfg|Anpassen aller (oder einzelner) Konfigurationen von FileLog nach DbLog]]&lt;br /&gt;
# [[#Anpassen der gplot-Konfigurationen|Ggf. Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
=== Datenbank-Anbindung mittels db.conf ===&lt;br /&gt;
DbLog wird durch 2 verschiedene Einträge aktiviert/definiert. In einer Datei namens &#039;&#039;&#039;db.conf&#039;&#039;&#039; werden die Parameter für eine Verbindung zur Datenbank (host, username, password, etc.) hinterlegt. Diese Datei kann in einem beliebigen Verzeichnis angelegt werden. Für eine MySQL-Datenbank sieht die db.conf folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
 %dbconfig= (&lt;br /&gt;
     connection =&amp;gt; &amp;quot;mysql:database=fhem;host=db;port=3306&amp;quot;,&lt;br /&gt;
     user =&amp;gt; &amp;quot;fhemuser&amp;quot;,&lt;br /&gt;
     password =&amp;gt; &amp;quot;fhempassword&amp;quot;,&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation befindet sich eine Beispielkonfiguration mit der Syntax für jeden unterstützen Datenbanktyp.&lt;br /&gt;
Es wird empfohlen diese Datei zu kopieren und erst dann entsprechend zu bearbeiten. Am Besten kopiert man diese Datei in das FHEM Home Directory /opt/fhem/ und achtet auf die entsprechenden Rechte!&lt;br /&gt;
 chown fhem:dialout /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration als Device ===&lt;br /&gt;
Das DbLog Device wird dann definiert mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; DbLog &amp;lt;configfilename&amp;gt; &amp;lt;regexp&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;configfilename&amp;gt;&#039;&#039; dem Pfad zur zuvor angelegten db.conf entspricht.&lt;br /&gt;
Ein Beispiel hierfür wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;&lt;br /&gt;
Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit vielen teils irrelevanten Werten gefüllt wird. Man kann daher die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Dies ist in [[#Finetuning des Loggings]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Finetuning des Loggings ===&lt;br /&gt;
Bei der Konfiguration des Log-Devices werden die zu loggenden Daten definiert - in der einfachsten Form sieht das so aus: &amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;. Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit sehr vielen und teils nicht benötigten Werten gefüllt wird und schnell wächst. Die Datenbank ist zwar deutlich leistungsfähiger, was große Datenmengen angeht, Datensparsamkeit kann aber schnell sinnvoll werden...&lt;br /&gt;
&lt;br /&gt;
Um das Log-Aufkommen einzugrenzen gibt es 2 Ansätze:&lt;br /&gt;
* Einschränkung über den &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag&lt;br /&gt;
* Einschränkung über DbLogExclude-Einträge der jeweiligen Devices&lt;br /&gt;
* Einschränkung über DbLogInclude-Einträge des jeweiligen Devices&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über den zentralen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag ====&lt;br /&gt;
Man kann die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Die erste Wildcard, also das erste &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt;, entspricht dem in FHEM verwendeten Device-Namen. Die zweite Wildcard entspricht dem vom Device ausgegebenen zu loggenden Wert. Separiert werden beiden Angaben durch einen Doppelpunkt. &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel, um zwar alle definierten Devices zu erfassen, aber nur die Werte Temperatur, Ventilposition und Luftfeuchte in die Datenbank zu schreiben wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).* &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über die jeweiligen Devices ====&lt;br /&gt;
Man kann die zu loggenden Werte für einzelne Devices separat einschränken, ohne dies im zentralen define-Eintrag machen zu müssen. Dies kann interessant sein, wenn beispielsweise ein Device Fehlerwerte meldet, die uninteressant sind, oder es meldet unnötig häufig Werte - beides ist z.B. bei 1-wire-Temperatursensoren gerne der Fall.&lt;br /&gt;
&lt;br /&gt;
Um das einzuschränken gibt es 2 Stellparameter, die als Attribute direkt zum jeweiligen Device konfiguriert werden:&lt;br /&gt;
* DbLogExclude - definiert Werte, die nicht geloggt werden sollen&lt;br /&gt;
* DbLogInclude - definiert Werte, die geloggt werden sollen ( siehe attr DbLogSelectionMode )&lt;br /&gt;
* event-min-interval, event-on-change-reading und event-on-update-reading beeinflussen, wie häufig Werte geloggt werden (vgl. [http://fhem.de/commandref_DE.html#event-on-update-reading commandref])&lt;br /&gt;
&lt;br /&gt;
Eine konkrete Konfiguration für einen sehr gesprächigen 1-wire-Temperatursensor könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define EG_Balkon GPIO4 BUSMASTER&lt;br /&gt;
attr EG_Balkon DbLogExclude failures,T,85     # logge keine &amp;quot;failures&amp;quot;, &amp;quot;T&amp;quot;-Werte und &amp;quot;85&amp;quot;-Werte (default-Werte, wenn keine Temperatur gelesen werden kann)&lt;br /&gt;
attr EG_Balkon event-on-change-reading state  # logge nur, wenn sich ein Wert ändert (wenn sich die Temperatur nicht ändert, logge das nicht)&lt;br /&gt;
attr EG_Balkon event-min-interval state:900   # logge spätestens alle 900sec = 15min&lt;br /&gt;
attr EG_Balkon event-on-update-reading .*     # logge alle Werte, die aktualisiert werden&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;1-Wire-Device vom Typ OWTHERM oder OWSWITCH&amp;gt; DbLogExclude data.*      # verhindert das Logging der state-Eintragungen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine in diesem {{Link2Forum|Topic=33697|Message=264127}} vorgestellte Strategie zur Vermeidung unnötigen Loggings ist, dass bei der Definition von Devices durch das nachfolgende &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; automatisch ein DbLogExclude für alle Werte (.*) des Devices zugewiesen wird und dies nur bei Interesse an geloggten Werten gelöscht bzw. angepasst wird:&lt;br /&gt;
&amp;lt;code&amp;gt;define nDbLogExclude notify global:DEFINED.* attr $EVTPART1 DbLogExclude .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es mittlerweile möglich, lediglich erwünschte Werte (Positiv-Liste) zu loggen und alle anderen zu verwerfen. Hierfür wird im LogDevice das attribut DbLogSelectionMode Include verwendet. Nun kann für jedes Device mit DbLogInclude &amp;lt;Reading1&amp;gt;,&amp;lt;Reading2&amp;gt;,... angegeben werden, welche Readings geloggt werden sollen. &lt;br /&gt;
Integriert ist ebenfalls ein &amp;quot;min-interval&amp;quot;, siehe commandref.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
Unterstützte Datenbanksysteme (Auswahl):&lt;br /&gt;
* Sqlite&lt;br /&gt;
* MySQL&lt;br /&gt;
* PostGreSql&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Die Datenbank ist relativ simpel gestaltet und besteht lediglich aus den folgenden beiden Tabellen:&lt;br /&gt;
* current&lt;br /&gt;
* history&lt;br /&gt;
&lt;br /&gt;
DbLog ist auf eine feste Tabellenstruktur angewiesen. Man muss daher in seiner Datenbank eine Tabelle mit folgenden Spalten anlegen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Spalte&lt;br /&gt;
! Beschreibung (en)&lt;br /&gt;
! Beschreibung (de)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TIMESTAMP&#039;&#039;&#039;&lt;br /&gt;
| timestamp of event&lt;br /&gt;
| Zeitstempel&lt;br /&gt;
| 2007-12-30 21:45:22 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEVICE&#039;&#039;&#039;&lt;br /&gt;
| device name&lt;br /&gt;
| Device-Name&lt;br /&gt;
| Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TYPE&#039;&#039;&#039;&lt;br /&gt;
| device type&lt;br /&gt;
| Device-Typ&lt;br /&gt;
| KS300&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;EVENT&#039;&#039;&#039;&lt;br /&gt;
| event specification as full string&lt;br /&gt;
| Eventspezifikation als Text&lt;br /&gt;
| humidity: 71 (%)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;READING&#039;&#039;&#039;&lt;br /&gt;
| name of reading extracted from event&lt;br /&gt;
| Bezeichnung des Readings&lt;br /&gt;
| humidity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VALUE&#039;&#039;&#039;&lt;br /&gt;
| actual reading extracted from event&lt;br /&gt;
| Wert des Readings&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UNIT&#039;&#039;&#039;&lt;br /&gt;
| unit extracted from event&lt;br /&gt;
| Einheit des Readings&lt;br /&gt;
| %&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Vorlagen zur Anlage von Tabellen und Indizes sind für jeden unterstützten Datenbanktyp im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation, oder hier zu finden: [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/dblog/ Link]. Das MySQL-Skript (db_create_mysql.sql) legt eine neue Datenbank, das PostGres-Skript (db_create_postgresql.sql) ein neues Schema mit Namen &amp;quot;fhem&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
==== current ====&lt;br /&gt;
Die Tabelle current enthält für jedes zu loggende Device lediglich den letzten Wert. Falls noch kein Wert geloggt wurde, ist diese Tabelle leer. &lt;br /&gt;
Falls der Inhalt gelöscht wird, bauen sich die Daten automatisch wieder auf. Es gehen durch das löschen der Tabelle current keine Log-Informationen verloren.&lt;br /&gt;
Der Inhalt wird aber u.a. für die Dropdown-Felder beim Plot-Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
Um doppelte Einträge in der Tabelle zu vermeiden, wurden die Möglichkeit geschaffen Primary Keys zu definieren. Da in der Spalte &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; u.U. bei verschiedenen Geräten gleiche Namen vorkommen können, sollte der Primary Key um den Gerätenamen erweitert werden. Der Primary Key sollte also aus &amp;lt;code&amp;gt;DEVICE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; bestehen. Um in der Datenbank &#039;&#039;fhem&#039;&#039; diesen PK zu setzen, kann folgender SQL Code verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`current` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== history ====&lt;br /&gt;
Die Tabelle history enthält alle bisher geloggten Daten. Löschen in dieser Tabelle bedeutet automatisch Datenverlust (gewollt oder nicht ... )&lt;br /&gt;
Der Inhalt dieser Tabelle wird verwendet, um die Plots zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
== Anpassen der gplot-Konfigurationen ==&lt;br /&gt;
Die meisten gplot-Konfigurationen sind bisher lediglich auf FileLog-Konfigurationen ausgelegt. Deshalb müssen sie für die Verwendung mit DbLog angepasst werden. Glücklicherweise beschränkt sich dies auf die reinen FileLog-Zeilen - es müssen die DbLog-Äquivalente hinzugefügt werden. Die FileLog-Einträge müssen zwar nicht gelöscht werden, wenn man aber FileLog und DbLog parallel betreibt, sollte man getrennte gplot-Dateien für beide Logging-Typen haben um Auswertungsprobleme erkennen zu können.&lt;br /&gt;
&lt;br /&gt;
Für die fht.gplot Konfiguration sähe die Anpassung wie folgt aus (lediglich die vier DbLog-Zeilen wurden hinzugefügt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2014-12-25 21:53:30&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 ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid y2tics&lt;br /&gt;
set ylabel &amp;quot;Actuator/Window (%)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set yrange 0:100&lt;br /&gt;
set y2range 5:25&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:.measured-temp\x3a:0:&lt;br /&gt;
#FileLog 4:.actuator\x3a:0:int&lt;br /&gt;
#FileLog 4:.desired-temp::&lt;br /&gt;
#FileLog 4:.window\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.measured-temp:0:&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.actuator:0:int&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.desired-temp::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.window::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Measured temperature&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Actuator (%)&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Desired Temperature&#039; ls l2 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Window&#039; ls l3 lw 1 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten: &lt;br /&gt;
&lt;br /&gt;
On-Off-Plots&lt;br /&gt;
&lt;br /&gt;
 EG_Bad:window:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:0/eg&lt;br /&gt;
&lt;br /&gt;
unter Berücksichtigung von dim-Werten:&lt;br /&gt;
&lt;br /&gt;
 EG_WoZi_Licht:value:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:($1eq&amp;quot;dim&amp;quot;?$2*0.01:0)/eg&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer SQLite-Datenbank ==&lt;br /&gt;
Im folgenden wird eine lokale SQLite-Datenbank auf einen Ubuntu-System angelegt (nach Quelle: [http://www.tatsch-it.de/fhem-dblog/ http://www.tatsch-it.de/fhem-dblog/])&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Installation von SQLite:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo aptitude install sqlite3 libdbi-perl libdbd-sqlite3-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anlegen der SQLite-Datenbank fhem.db&#039;&#039; (öffnet auch direkt eine SQL-Kommandozeile):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE &#039;history&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE TABLE &#039;current&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassen des Besitzers und der Rechte der Datenbank-Datei:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chown fhem /opt/fhem/fhem.db&lt;br /&gt;
sudo chmod 666 /opt/fhem/fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Datenbank-Anbindung des FHEM konfigurieren:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/db.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%dbconfig= (&lt;br /&gt;
  connection =&amp;gt; &amp;quot;SQLite:dbname=/opt/fhem/fhem.db&amp;quot;,&lt;br /&gt;
  user =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  password =&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Logging des FHEM auf die Datenbank konfigurieren:&#039;&#039; (hier sind nur die Anpassungen aufgeführt)&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/fhem.cfg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
attr global userattr DbLogExclude ...  # erlaubt es einzelne Einträge nicht zu loggen&lt;br /&gt;
...&lt;br /&gt;
define logdb DbLog ./db.conf .*:.*     # logt alle(!) auflaufenden Events aller Konfigurationen&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da durch diese &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Definition alle auflaufenden Events gelogt werden, müssen keine weiteren Anpassungen in der Konfiguration gemacht werden. Die FileLog-Einträge können bedenkenlos bestehen bleiben - dann wird in Datenbank und FileLog gelogt und man verliert keine Daten, falls etwas nicht klappt. Wenn alles wie geplant läuft, können die FileLog-Definitionen gelöscht werden (ebenso die Log-Dateien). Ebenso können die zu loggenden Daten später eingegrenzt werden (s. [[#Finetuning des Loggings]]).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;FHEM neu starten:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service fhem stop&lt;br /&gt;
sudo service fhem start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Kontrollieren, ob Logs in die Datenbank geschrieben werden:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from history order by TIMESTAMP;       # dies gibt alle(!) Logs chronologisch aus (kann nach längerem Betrieb recht lange dauern)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassung der glot-Dateien:&#039;&#039; siehe [[#Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer Mysql-Datenbank ==&lt;br /&gt;
Anstatt nano kann jeder andere kompatible Editor verwendet werden. Weiterhin bitte beachten, dass die hier genannten Befehle teilweise root-Rechte voraussetzen. Entweder komplett als root arbeiten, oder mittels sudo.&lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu/debian: &lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get install mysql-server mysql-client libdbd-mysql libdbd-mysql-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Installation sollte man aus Sicherheitsgründen ein Passwort für den mysql-root vergeben, wenn man nicht sogar ganz den Login verbietet.&lt;br /&gt;
&lt;br /&gt;
Hinweis: im Folgenden ist &amp;quot;#&amp;quot; der normale Prompt und &amp;quot;mysql&amp;gt;&amp;quot; der prompt innerhalb mysql, dieser kann mit exit verlassen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Test mal mit mysql verbinden:&lt;br /&gt;
 # mysql -p -u root&lt;br /&gt;
 Enter password:&lt;br /&gt;
 mysql&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
Jetzt die Tabellenstruktur anlegen. &lt;br /&gt;
Hierfür kann die Datei /opt/fhem/contrib/dblog/db_create_mysql.sql als Vorlage verwendet und das Passwort und der Benutzername geändert werden. &lt;br /&gt;
 cd /opt/fhem/contrib/dblog/&lt;br /&gt;
 nano db_create_mysql.sql&lt;br /&gt;
Dann wird die Datei eingelesen (root Passwort wird abgefragt): &lt;br /&gt;
&lt;br /&gt;
 # mysql -u root -p &amp;lt; db_create_mysql.sql&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man den Zugang testen: &lt;br /&gt;
&lt;br /&gt;
 # mysql -p -u &amp;lt;fhemuser&amp;gt;&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; show databases;&lt;br /&gt;
&lt;br /&gt;
Nun müsste eine Datenbank &amp;quot;fhem&amp;quot; angezeigt werden, die die Tabellen current und history enthält.&lt;br /&gt;
&lt;br /&gt;
Nun in der Datei db.conf den mysql-Block auskommentieren und ebenfalls Benutzername, Passwort UND HOST anpassen. Leider ist hier nicht standardmäßig localhost eingestellt.&lt;br /&gt;
 nano /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
Jetzt kann unter FHEM ein DbLog-Device angelegt werden (mit dem beispiel wird alles geloggt: &lt;br /&gt;
 define logdb DbLog ./db.conf .*:.*&lt;br /&gt;
Als State muss ein &amp;quot;connected&amp;quot; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Ein rereadcfg in Fhem stellt sicher, dass die neue Konfiguration übernommen wird - ein Neustart ist nicht erforderlich&lt;br /&gt;
&lt;br /&gt;
Nun kann die Funktion noch einmal überprüft werden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 # mysql -u &amp;lt;fhemuser&amp;gt; -p&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; use fhem;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0,00 sec)&lt;br /&gt;
 mysql&amp;gt; select * from history; # Achtung, kann sehr groß werden .... #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integration von DBLog in eigene Module ==&lt;br /&gt;
=== Bereitstellung der UNITS ===&lt;br /&gt;
Mit der DbLog_splitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Dazu muss der Modulautor in der [[DevelopmentModuleIntro#X_Initialize|Initialize-Funktion]] eine &amp;lt;code&amp;gt;DbLog_splitFn&amp;lt;/code&amp;gt; bereitstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{DbLog_splitFn}      = &amp;quot;X_DbLog_splitFn&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genaue Aufrufsyntax und Funktionweise einer DbLog_split-Funktion findet man [[DevelopmentModuleIntro#X_DbLog_split|hier]].&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Beim Anlegen der Datenbank per script wird die Value-Spalte nur als Varchar(32) definiert. Dieses kann dazu führen, dass besonders lange Readings (z.b. vom Modul sysmon) abgeschnitten werden und nicht in der Datenbank landen. Dieses lässt sich leicht beheben, indem man die Spalte auf Varchar(64) ändert (siehe auch {{Link2Forum|Topic=25648|Message=252433|LinkText=diesen Forenbeitrag}}).&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE current MODIFY VALUE VARCHAR(64);&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE history MODIFY VALUE VARCHAR(64);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Werte auslesen ==&lt;br /&gt;
Manchmal möchte man Daten aus den Logs abrufen ohne händisch in der Datenbank herumzuwühlen (s.u.). Dies ist insb. auch dann hilfreich, wenn man eigenen Funktionen, Notifys oder spezielle Plots entwirft, bei denen man auf Logdaten zugreifen möchte.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich beschrieben ist dies in der [http://fhem.de/commandref_DE.html#DbLog commandref#DbLog] und unterscheidet sich minimal (aber entscheidend) von der Struktur bei [[FileLog#Werte_auslesen|FileLogs]].&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, was man damit anstellen kann:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01 2016-10-03 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor vom 01.10.-03.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor von 8-16 Uhr am 01.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor:temperature&amp;lt;/code&amp;gt; nur die temperature Werte&lt;br /&gt;
* &amp;lt;code&amp;gt;{ ReadingsTimestamp(&amp;quot;meinSensor&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;0&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des aktuellen state des meinSensor&lt;br /&gt;
* &amp;lt;code&amp;gt;{ OldTimestamp(&amp;quot;meinSensor&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des letzten state des FHT_3a32&lt;br /&gt;
* &amp;lt;code&amp;gt;{ time_str2num(OldTimestamp(&amp;quot;meinSensor&amp;quot;)) }&amp;lt;/code&amp;gt; Timestamp in Sekunden des letzten state des meinSensor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Bearbeitung von Datenbank-Einträgen ==&lt;br /&gt;
{{Hinweis|Dieser Abschnitt soll lediglich eine kleine Einführung in die Datenbank-Bearbeitung liefern. Für vertiefende Informationen sollte man sich grundsätzlich mit SQL beschäftigen. Eine umfassende und gut verständliche Anleitung zu SQL bietet bspw. [http://www.w3schools.com/sql/default.asp w3schools].}}&lt;br /&gt;
Irgendwann wird der Fall eintreten, dass in der Datenbank Einträge drinstehen, die geändert oder gelöscht werden sollen (zB. fehlerhafte Sensor-Rückmeldungen, umbenannte Readings). In klassischen Log-Dateien würde man diese einfach bearbeiten und löschen/anpassen (wobei man aber tunlichst zuvor den fhem ausmacht um Datenfehler zu vermeiden). Eine Datenbank kann bearbeitet werden ohne den fhem abschalten zu müssen. &lt;br /&gt;
&lt;br /&gt;
Datenbanken kann man ohne weiter Hilfsmittel direkt von der Kommandozeile/Shell aus bearbeiten. Alternativ gibt es auch verschiedenste Tools (webbasiert oder als Applikation), die einen dabei unterstützen (Bsp. findet man u.a. [https://wiki.ubuntuusers.de/SQLite/#Grafische-Benutzeroberflaechen hier]). Für einfache Arbeiten reicht allerdings idR. Shell.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
&#039;&#039;&#039;Öffnen der DB unter Linux:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(Es werden Schreibrechte benötigt,ohne kann man die DB zwar öffnen, aber nichts machen)&lt;br /&gt;
 sudo sqlite3 fhem.db&lt;br /&gt;
Dadurch öffnet sich ein SQL-Konsole, auf der alle weiteren Befehle ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schliessen der DB:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hilfe anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Tabellen anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Schema der DB anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(vgl. oben [[DbLog#Datenbanken]] und [[DbLog#Beispiel: Anlegen und Nutzung einer SQLite-Datenbank]])&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .schema&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Eintäge anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Die Einträge liegen alle in der Tabelle &amp;quot;History&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ganz wichtig&#039;&#039;&#039; ist immer das &amp;quot;;&amp;quot; am Ende Zeile (bei allen Kommandos, die nicht mit einem &amp;quot;.&amp;quot; anfangen). Wenn es vergessen wurde zeigt die Konsole solange neue Zeilen bis ein &amp;quot;;&amp;quot; eingegeben wird. So kann ein Befehl auch bequem über mehrere Zeilen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY;&lt;br /&gt;
&lt;br /&gt;
Dies kann sehr lange dauern und kann ggf. mit &amp;lt;code&amp;gt;STRG-C&amp;lt;/code&amp;gt; abgebrochen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-Statements werden Strings in einfache Anführungsstriche gesetzt, Zahlen nicht.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LÖSCHEN aller Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Löschen kann nicht rückgängig gemacht werden!! Also IMMER erst die entsprechenden SELECT-Statements solange verfeinern bis wirklich nur die gewünschten Einträge angezeigt werden. Dann das &amp;lt;code&amp;gt;select *&amp;lt;/code&amp;gt; durch &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ersetzen.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; delete from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenbank reparieren ==&lt;br /&gt;
Es kann immer wieder mal vorkommen, dass Datenbanken Fehler enthalten. Das muss im Alltag garnicht auffallen und auch nicht immer schlimm enden. Wenn man auf der SQL-Konsole aber bspw. eine Meldung &amp;lt;code&amp;gt;Error: database disk image is malformed&amp;lt;/code&amp;gt; erhält, sollte man ein Reparatur vornehmen.&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
Die folgenden Schritte beschreiben, wie man eine SQLite-DB reparieren kann (Quelle: [http://techblog.dorogin.com/2011/05/sqliteexception-database-disk-image-is.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
DB öffnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Integritäts-Check durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sqlite&amp;gt; pragma integrity_check;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt hier ein &amp;quot;ok&amp;quot; ist die DB gesund. Ansonsten erscheint etwas wie&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** in database main ***&lt;br /&gt;
On tree page 118786 cell 1: Rowid 75 out of order (previous was 816660)&lt;br /&gt;
On tree page 118786 cell 4: Rowid 815704 out of order (previous was 816727)&lt;br /&gt;
Corruption detected in cell 0 on page 118786&lt;br /&gt;
Multiple uses for byte 132 of page 118786&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Datenbank-Dump erstellen (Export gesamten DB in die Datei &amp;quot;dump_all_20160516_1043.sql&amp;quot;) und DB verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .mode insert&lt;br /&gt;
sqlite&amp;gt; .output dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; .dump&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Neue Datenbank erstellen und den Dump einlesen, Integritäts-Check machen und verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem-neu.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .read dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; pragma integrity_check;&lt;br /&gt;
ok&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Spätestens jetzt fhem stoppen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem stop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Alte DB sichern und neue aktivieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv fhem.db fhem.db.sv_20160516&lt;br /&gt;
sudo mv fhem-neu.db fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Kontrollieren, dass die neue DB die gleichen Rechte wie die alte DB hat (und ggf. korrigieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 root root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
~/fhem$ sudo chown fhem:root fhem.db&lt;br /&gt;
&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 fhem root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
fhem wieder starten (und natürlich kontrollieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem start&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nützliche Codeschnipsel ==&lt;br /&gt;
Anbei ein paar nützliche Codeschnipsel rund um DbLog&lt;br /&gt;
&lt;br /&gt;
=== Dateigrösse mitloggen ===&lt;br /&gt;
Da die Datenbank ins Unermessliche wachsen kann, empfiehlt es sich - je nach Speicherplatz - ab einer bestimmten Grösse tätig zu werden. Dazu muss diese Grösse allerdings ermittelt werden. Diese geschieht mittels des Userreadings, welches man vorteilshafterweise mit im DbLog-device anlegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;attr myDbLog userReadings DbFileSize:lastReduceLogResult.* { (split(&#039; &#039;,`du -m fhem.db`))[0] }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels dieses Attributs wird die Grösse der .db-Datei immer nach dem Ausführen des ReduceLog in das Reading &amp;quot;DbFileSize&amp;quot; in ganzzahligen MByte abgelegt.&lt;br /&gt;
&lt;br /&gt;
Basierend auf diesem Reading können dann weitere Aktionen, beispielsweise ein Plot, erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Heizleistung_und_Gasverbrauch|Beispiel das DbLog-Daten für SVG-Plots verwendet]]&lt;br /&gt;
* [[SVG-Plots von FileLog auf DbLog umstellen]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22520</id>
		<title>DbLog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DbLog&amp;diff=22520"/>
		<updated>2017-09-08T11:23:40Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Befehl &amp;quot;Jetzt die Tabellenstruktur anlegen.&amp;quot; geändert von cp auf cd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Protokolliert Ereignisse in einer Datenbank&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=93_DbLog.pm&lt;br /&gt;
|ModOwner=tobiasfaust ({{Link2FU|118|Forum}}/[[Benutzer Diskussion:Tobias.faust|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Mit der Zeit entstehen im fhem recht umfangreiche Log-Daten für die verschiedensten konfigurierten Devices. Die übliche Einstiegs-[[Konfiguration]] sieht vor, dass die Logs als [http://fhem.de/commandref_DE.html#FileLog FileLog] gespeichert werden - je nach Einstellung in wenigen sehr großen oder vielen kleineren Dateien. Der Datei-basierte Zugriff ist allerdings nicht wirklick performant und kann schnell zum Flaschenhals werden (z.B. bei der Darstellung von Graphen über einen längeren Zeitraum).&lt;br /&gt;
&lt;br /&gt;
Alternativ kann Fhem die Log-Daten mittels [http://fhem.de/commandref_DE.html#DbLog DbLog] in einer Datenbank speichern. Diese kann lokal als einfache SQLite- oder als zentrale Server-Datenbank (s.u.) gestaltet sein. Schon eine lokale einfache SQLite-Datenbank ist in der Regel deutlich performanter als File-basierte Logs.&lt;br /&gt;
&lt;br /&gt;
Damit eine Datenbank-Nutzung möglich ist, müssen folgende Anpassungen gemacht werden:&lt;br /&gt;
# [[#Datenbank|Erstellen einer entsprechenden Datenbank]]&lt;br /&gt;
# [[#Datenbank-Anbindung mittels db.conf|Konfiguration der Datenbank-Anbindung in FHEM]]&lt;br /&gt;
# [[#Konfiguration als Device in fhem.cfg|Anpassen aller (oder einzelner) Konfigurationen von FileLog nach DbLog]]&lt;br /&gt;
# [[#Anpassen der gplot-Konfigurationen|Ggf. Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
=== Datenbank-Anbindung mittels db.conf ===&lt;br /&gt;
DbLog wird durch 2 verschiedene Einträge aktiviert/definiert. In einer Datei namens &#039;&#039;&#039;db.conf&#039;&#039;&#039; werden die Parameter für eine Verbindung zur Datenbank (host, username, password, etc.) hinterlegt. Diese Datei kann in einem beliebigen Verzeichnis angelegt werden. Für eine MySQL-Datenbank sieht die db.conf folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
 %dbconfig= (&lt;br /&gt;
     connection =&amp;gt; &amp;quot;mysql:database=fhem;host=db;port=3306&amp;quot;,&lt;br /&gt;
     user =&amp;gt; &amp;quot;fhemuser&amp;quot;,&lt;br /&gt;
     password =&amp;gt; &amp;quot;fhempassword&amp;quot;,&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation befindet sich eine Beispielkonfiguration mit der Syntax für jeden unterstützen Datenbanktyp.&lt;br /&gt;
Es wird empfohlen diese Datei zu kopieren und erst dann entsprechend zu bearbeiten. Am Besten kopiert man diese Datei in das FHEM Home Directory /opt/fhem/ und achtet auf die entsprechenden Rechte!&lt;br /&gt;
 chown fhem:dialout /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration als Device ===&lt;br /&gt;
Das DbLog Device wird dann definiert mit&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; DbLog &amp;lt;configfilename&amp;gt; &amp;lt;regexp&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
wobei &#039;&#039;&amp;lt;configfilename&amp;gt;&#039;&#039; dem Pfad zur zuvor angelegten db.conf entspricht.&lt;br /&gt;
Ein Beispiel hierfür wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;&lt;br /&gt;
Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit vielen teils irrelevanten Werten gefüllt wird. Man kann daher die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Dies ist in [[#Finetuning des Loggings]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Finetuning des Loggings ===&lt;br /&gt;
Bei der Konfiguration des Log-Devices werden die zu loggenden Daten definiert - in der einfachsten Form sieht das so aus: &amp;lt;code&amp;gt;define logdb DbLog ./db.conf .*:.* &amp;lt;/code&amp;gt;. Die Angabe von &amp;lt;code&amp;gt;.*:.*&amp;lt;/code&amp;gt; bedeutet, dass sämtliche DeviceMessages (Messwerte, Batteriestatus, KeepAlives, etc.) in die Datenbank geschrieben werden. Dies führt u.U. dazu, dass die Datenbank auch mit sehr vielen und teils nicht benötigten Werten gefüllt wird und schnell wächst. Die Datenbank ist zwar deutlich leistungsfähiger, was große Datenmengen angeht, Datensparsamkeit kann aber schnell sinnvoll werden...&lt;br /&gt;
&lt;br /&gt;
Um das Log-Aufkommen einzugrenzen gibt es 2 Ansätze:&lt;br /&gt;
* Einschränkung über den &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag&lt;br /&gt;
* Einschränkung über DbLogExclude-Einträge der jeweiligen Devices&lt;br /&gt;
* Einschränkung über DbLogInclude-Einträge des jeweiligen Devices&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über den zentralen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Eintrag ====&lt;br /&gt;
Man kann die zu loggenden Werte einschränken, indem man genau angibt welche Werte übertragen werden sollen. Die erste Wildcard, also das erste &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt;, entspricht dem in FHEM verwendeten Device-Namen. Die zweite Wildcard entspricht dem vom Device ausgegebenen zu loggenden Wert. Separiert werden beiden Angaben durch einen Doppelpunkt. &lt;br /&gt;
&lt;br /&gt;
Ein Beispiel, um zwar alle definierten Devices zu erfassen, aber nur die Werte Temperatur, Ventilposition und Luftfeuchte in die Datenbank zu schreiben wäre:&lt;br /&gt;
:&amp;lt;code&amp;gt;define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).* &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einschränkung über die jeweiligen Devices ====&lt;br /&gt;
Man kann die zu loggenden Werte für einzelne Devices separat einschränken, ohne dies im zentralen define-Eintrag machen zu müssen. Dies kann interessant sein, wenn beispielsweise ein Device Fehlerwerte meldet, die uninteressant sind, oder es meldet unnötig häufig Werte - beides ist z.B. bei 1-wire-Temperatursensoren gerne der Fall.&lt;br /&gt;
&lt;br /&gt;
Um das einzuschränken gibt es 2 Stellparameter, die als Attribute direkt zum jeweiligen Device konfiguriert werden:&lt;br /&gt;
* DbLogExclude - definiert Werte, die nicht geloggt werden sollen&lt;br /&gt;
* DbLogInclude - definiert Werte, die geloggt werden sollen ( siehe attr DbLogSelectionMode )&lt;br /&gt;
* event-min-interval, event-on-change-reading und event-on-update-reading beeinflussen, wie häufig Werte geloggt werden (vgl. [http://fhem.de/commandref_DE.html#event-on-update-reading commandref])&lt;br /&gt;
&lt;br /&gt;
Eine konkrete Konfiguration für einen sehr gesprächigen 1-wire-Temperatursensor könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define EG_Balkon GPIO4 BUSMASTER&lt;br /&gt;
attr EG_Balkon DbLogExclude failures,T,85     # logge keine &amp;quot;failures&amp;quot;, &amp;quot;T&amp;quot;-Werte und &amp;quot;85&amp;quot;-Werte (default-Werte, wenn keine Temperatur gelesen werden kann)&lt;br /&gt;
attr EG_Balkon event-on-change-reading state  # logge nur, wenn sich ein Wert ändert (wenn sich die Temperatur nicht ändert, logge das nicht)&lt;br /&gt;
attr EG_Balkon event-min-interval state:900   # logge spätestens alle 900sec = 15min&lt;br /&gt;
attr EG_Balkon event-on-update-reading .*     # logge alle Werte, die aktualisiert werden&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;1-Wire-Device vom Typ OWTHERM oder OWSWITCH&amp;gt; DbLogExclude data.*      # verhindert das Logging der state-Eintragungen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine in diesem {{Link2Forum|Topic=33697|Message=264127}} vorgestellte Strategie zur Vermeidung unnötigen Loggings ist, dass bei der Definition von Devices durch das nachfolgende &amp;lt;code&amp;gt;notify&amp;lt;/code&amp;gt; automatisch ein DbLogExclude für alle Werte (.*) des Devices zugewiesen wird und dies nur bei Interesse an geloggten Werten gelöscht bzw. angepasst wird:&lt;br /&gt;
&amp;lt;code&amp;gt;define nDbLogExclude notify global:DEFINED.* attr $EVTPART1 DbLogExclude .*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso ist es mittlerweile möglich, lediglich erwünschte Werte (Positiv-Liste) zu loggen und alle anderen zu verwerfen. Hierfür wird im LogDevice das attribut DbLogSelectionMode Include verwendet. Nun kann für jedes Device mit DbLogInclude &amp;lt;Reading1&amp;gt;,&amp;lt;Reading2&amp;gt;,... angegeben werden, welche Readings geloggt werden sollen. &lt;br /&gt;
Integriert ist ebenfalls ein &amp;quot;min-interval&amp;quot;, siehe commandref.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
Unterstützte Datenbanksysteme (Auswahl):&lt;br /&gt;
* Sqlite&lt;br /&gt;
* MySQL&lt;br /&gt;
* PostGreSql&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Die Datenbank ist relativ simpel gestaltet und besteht lediglich aus den folgenden beiden Tabellen:&lt;br /&gt;
* current&lt;br /&gt;
* history&lt;br /&gt;
&lt;br /&gt;
DbLog ist auf eine feste Tabellenstruktur angewiesen. Man muss daher in seiner Datenbank eine Tabelle mit folgenden Spalten anlegen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Spalte&lt;br /&gt;
! Beschreibung (en)&lt;br /&gt;
! Beschreibung (de)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TIMESTAMP&#039;&#039;&#039;&lt;br /&gt;
| timestamp of event&lt;br /&gt;
| Zeitstempel&lt;br /&gt;
| 2007-12-30 21:45:22 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEVICE&#039;&#039;&#039;&lt;br /&gt;
| device name&lt;br /&gt;
| Device-Name&lt;br /&gt;
| Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TYPE&#039;&#039;&#039;&lt;br /&gt;
| device type&lt;br /&gt;
| Device-Typ&lt;br /&gt;
| KS300&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;EVENT&#039;&#039;&#039;&lt;br /&gt;
| event specification as full string&lt;br /&gt;
| Eventspezifikation als Text&lt;br /&gt;
| humidity: 71 (%)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;READING&#039;&#039;&#039;&lt;br /&gt;
| name of reading extracted from event&lt;br /&gt;
| Bezeichnung des Readings&lt;br /&gt;
| humidity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VALUE&#039;&#039;&#039;&lt;br /&gt;
| actual reading extracted from event&lt;br /&gt;
| Wert des Readings&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UNIT&#039;&#039;&#039;&lt;br /&gt;
| unit extracted from event&lt;br /&gt;
| Einheit des Readings&lt;br /&gt;
| %&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Vorlagen zur Anlage von Tabellen und Indizes sind für jeden unterstützten Datenbanktyp im Verzeichnis &#039;&#039;&#039;contrib/dblog&#039;&#039;&#039; der FHEM-Installation, oder hier zu finden: [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/dblog/ Link]. Das MySQL-Skript (db_create_mysql.sql) legt eine neue Datenbank, das PostGres-Skript (db_create_postgresql.sql) ein neues Schema mit Namen &amp;quot;fhem&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
==== current ====&lt;br /&gt;
Die Tabelle current enthält für jedes zu loggende Device lediglich den letzten Wert. Falls noch kein Wert geloggt wurde, ist diese Tabelle leer. &lt;br /&gt;
Falls der Inhalt gelöscht wird, bauen sich die Daten automatisch wieder auf. Es gehen durch das löschen der Tabelle current keine Log-Informationen verloren.&lt;br /&gt;
Der Inhalt wird aber u.a. für die Dropdown-Felder beim Plot-Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
Um doppelte Einträge in der Tabelle zu vermeiden, wurden die Möglichkeit geschaffen Primary Keys zu definieren. Da in der Spalte &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; u.U. bei verschiedenen Geräten gleiche Namen vorkommen können, sollte der Primary Key um den Gerätenamen erweitert werden. Der Primary Key sollte also aus &amp;lt;code&amp;gt;DEVICE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;READING&amp;lt;/code&amp;gt; bestehen. Um in der Datenbank &#039;&#039;fhem&#039;&#039; diesen PK zu setzen, kann folgender SQL Code verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER TABLE `fhem`.`current` &lt;br /&gt;
CHANGE COLUMN `DEVICE` `DEVICE` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
CHANGE COLUMN `READING` `READING` VARCHAR(64) CHARACTER SET &#039;utf8&#039; COLLATE &#039;utf8_bin&#039; NOT NULL ,&lt;br /&gt;
ADD PRIMARY KEY (`DEVICE`, `READING`);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== history ====&lt;br /&gt;
Die Tabelle history enthält alle bisher geloggten Daten. Löschen in dieser Tabelle bedeutet automatisch Datenverlust (gewollt oder nicht ... )&lt;br /&gt;
Der Inhalt dieser Tabelle wird verwendet, um die Plots zu zeichnen.&lt;br /&gt;
&lt;br /&gt;
== Anpassen der gplot-Konfigurationen ==&lt;br /&gt;
Die meisten gplot-Konfigurationen sind bisher lediglich auf FileLog-Konfigurationen ausgelegt. Deshalb müssen sie für die Verwendung mit DbLog angepasst werden. Glücklicherweise beschränkt sich dies auf die reinen FileLog-Zeilen - es müssen die DbLog-Äquivalente hinzugefügt werden. Die FileLog-Einträge müssen zwar nicht gelöscht werden, wenn man aber FileLog und DbLog parallel betreibt, sollte man getrennte gplot-Dateien für beide Logging-Typen haben um Auswertungsprobleme erkennen zu können.&lt;br /&gt;
&lt;br /&gt;
Für die fht.gplot Konfiguration sähe die Anpassung wie folgt aus (lediglich die vier DbLog-Zeilen wurden hinzugefügt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2014-12-25 21:53:30&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 ytics nomirror&lt;br /&gt;
set y2tics &lt;br /&gt;
set grid y2tics&lt;br /&gt;
set ylabel &amp;quot;Actuator/Window (%)&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperature in C&amp;quot;&lt;br /&gt;
set yrange 0:100&lt;br /&gt;
set y2range 5:25&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:.measured-temp\x3a:0:&lt;br /&gt;
#FileLog 4:.actuator\x3a:0:int&lt;br /&gt;
#FileLog 4:.desired-temp::&lt;br /&gt;
#FileLog 4:.window\x3a::&lt;br /&gt;
&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.measured-temp:0:&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.actuator:0:int&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.desired-temp::&lt;br /&gt;
#DbLog &amp;lt;SPEC1&amp;gt;:.window::&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Measured temperature&#039; ls l0 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Actuator (%)&#039; ls l1 lw 1 with lines,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;Desired Temperature&#039; ls l2 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;Window&#039; ls l3 lw 1 with steps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten: &lt;br /&gt;
&lt;br /&gt;
On-Off-Plots&lt;br /&gt;
&lt;br /&gt;
 EG_Bad:window:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:0/eg&lt;br /&gt;
&lt;br /&gt;
unter Berücksichtigung von dim-Werten:&lt;br /&gt;
&lt;br /&gt;
 EG_WoZi_Licht:value:::$val=~s/(on|off)(\d*).*/$1eq&amp;quot;on&amp;quot;?1:($1eq&amp;quot;dim&amp;quot;?$2*0.01:0)/eg&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer SQLite-Datenbank ==&lt;br /&gt;
Im folgenden wird eine lokale SQLite-Datenbank auf einen Ubuntu-System angelegt (nach Quelle: [http://www.tatsch-it.de/fhem-dblog/ http://www.tatsch-it.de/fhem-dblog/])&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Installation von SQLite:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo aptitude install sqlite3 libdbi-perl libdbd-sqlite3-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anlegen der SQLite-Datenbank fhem.db&#039;&#039; (öffnet auch direkt eine SQL-Kommandozeile):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE &#039;history&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
CREATE TABLE &#039;current&#039; (TIMESTAMP TIMESTAMP, DEVICE varchar(64), TYPE varchar(64), EVENT varchar(512), READING varchar(64), VALUE varchar(128), UNIT varchar(32));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassen des Besitzers und der Rechte der Datenbank-Datei:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chown fhem /opt/fhem/fhem.db&lt;br /&gt;
sudo chmod 666 /opt/fhem/fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Datenbank-Anbindung des FHEM konfigurieren:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/db.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%dbconfig= (&lt;br /&gt;
  connection =&amp;gt; &amp;quot;SQLite:dbname=/opt/fhem/fhem.db&amp;quot;,&lt;br /&gt;
  user =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  password =&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Logging des FHEM auf die Datenbank konfigurieren:&#039;&#039; (hier sind nur die Anpassungen aufgeführt)&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano /opt/fhem/fhem.cfg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
attr global userattr DbLogExclude ...  # erlaubt es einzelne Einträge nicht zu loggen&lt;br /&gt;
...&lt;br /&gt;
define logdb DbLog ./db.conf .*:.*     # logt alle(!) auflaufenden Events aller Konfigurationen&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da durch diese &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Definition alle auflaufenden Events gelogt werden, müssen keine weiteren Anpassungen in der Konfiguration gemacht werden. Die FileLog-Einträge können bedenkenlos bestehen bleiben - dann wird in Datenbank und FileLog gelogt und man verliert keine Daten, falls etwas nicht klappt. Wenn alles wie geplant läuft, können die FileLog-Definitionen gelöscht werden (ebenso die Log-Dateien). Ebenso können die zu loggenden Daten später eingegrenzt werden (s. [[#Finetuning des Loggings]]).&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;FHEM neu starten:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service fhem stop&lt;br /&gt;
sudo service fhem start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Kontrollieren, ob Logs in die Datenbank geschrieben werden:&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 /opt/fhem/fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der geöffneten SQL-Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from history order by TIMESTAMP;       # dies gibt alle(!) Logs chronologisch aus (kann nach längerem Betrieb recht lange dauern)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Kommandozeile verlässt man mit &amp;lt;code&amp;gt;.exit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&#039;&#039;Anpassung der glot-Dateien:&#039;&#039; siehe [[#Anpassen der gplot-Konfigurationen]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Anlegen und Nutzung einer Mysql-Datenbank ==&lt;br /&gt;
Anstatt nano kann jeder andere kompatible Editor verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu/debian: &lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get install mysql-server mysql-client libdbd-mysql libdbd-mysql-perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei der Installation sollte man aus Sicherheitsgründen ein Passwort für den mysql-root vergeben, wenn man nicht sogar ganz den Login verbietet.&lt;br /&gt;
&lt;br /&gt;
Hinweis: im Folgenden ist &amp;quot;#&amp;quot; der normale Prompt und &amp;quot;mysql&amp;gt;&amp;quot; der prompt innerhalb mysql, dieser kann mit exit verlassen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Test mal mit mysql verbinden:&lt;br /&gt;
 # mysql -p -u root&lt;br /&gt;
 Enter password:&lt;br /&gt;
 mysql&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
Jetzt die Tabellenstruktur anlegen. &lt;br /&gt;
Hierfür kann die Datei /opt/fhem/contrib/dblog/db_create_mysql.sql als Vorlage verwendet und das Passwort und der Benutzername geändert werden. &lt;br /&gt;
 cd /opt/fhem/contrib/dblog/&lt;br /&gt;
 nano db_create_mysql.sql&lt;br /&gt;
Dann wird die Datei eingelesen (root Passwort wird abgefragt): &lt;br /&gt;
&lt;br /&gt;
 # mysql -u root -p &amp;lt; db_create_mysql.sql&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man den Zugang testen: &lt;br /&gt;
&lt;br /&gt;
 # mysql -p -u &amp;lt;fhemuser&amp;gt;&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; show databases;&lt;br /&gt;
&lt;br /&gt;
Nun müsste eine Datenbank &amp;quot;fhem&amp;quot; angezeigt werden, die die Tabellen current und history enthält.&lt;br /&gt;
&lt;br /&gt;
Nun in der Datei db.conf den mysql-Block auskommentieren und ebenfalls Benutzername, Passwort UND HOST anpassen. Leider ist hier nicht standardmäßig localhost eingestellt.&lt;br /&gt;
 nano /opt/fhem/db.conf&lt;br /&gt;
&lt;br /&gt;
Jetzt kann unter FHEM ein DbLog-Device angelegt werden (mit dem beispiel wird alles geloggt: &lt;br /&gt;
 define logdb DbLog ./db.conf .*:.*&lt;br /&gt;
Als State muss ein &amp;quot;connected&amp;quot; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Ein rereadcfg in Fhem stellt sicher, dass die neue Konfiguration übernommen wird - ein Neustart ist nicht erforderlich&lt;br /&gt;
&lt;br /&gt;
Nun kann die Funktion noch einmal überprüft werden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 # mysql -u &amp;lt;fhemuser&amp;gt; -p&lt;br /&gt;
 Enter password: &amp;lt;fhempassword&amp;gt;&lt;br /&gt;
 mysql&amp;gt; use fhem;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; show tables;&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | Tables_in_fhem |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 | current        |&lt;br /&gt;
 | history        |&lt;br /&gt;
 +----------------+&lt;br /&gt;
 2 rows in set (0,00 sec)&lt;br /&gt;
 mysql&amp;gt; select * from history; # Achtung, kann sehr groß werden .... #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integration von DBLog in eigene Module ==&lt;br /&gt;
=== Bereitstellung der UNITS ===&lt;br /&gt;
Mit der DbLog_splitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Dazu muss der Modulautor in der [[DevelopmentModuleIntro#X_Initialize|Initialize-Funktion]] eine &amp;lt;code&amp;gt;DbLog_splitFn&amp;lt;/code&amp;gt; bereitstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{DbLog_splitFn}      = &amp;quot;X_DbLog_splitFn&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genaue Aufrufsyntax und Funktionweise einer DbLog_split-Funktion findet man [[DevelopmentModuleIntro#X_DbLog_split|hier]].&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Beim Anlegen der Datenbank per script wird die Value-Spalte nur als Varchar(32) definiert. Dieses kann dazu führen, dass besonders lange Readings (z.b. vom Modul sysmon) abgeschnitten werden und nicht in der Datenbank landen. Dieses lässt sich leicht beheben, indem man die Spalte auf Varchar(64) ändert (siehe auch {{Link2Forum|Topic=25648|Message=252433|LinkText=diesen Forenbeitrag}}).&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE current MODIFY VALUE VARCHAR(64);&lt;br /&gt;
 mysql&amp;gt; ALTER TABLE history MODIFY VALUE VARCHAR(64);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Werte auslesen ==&lt;br /&gt;
Manchmal möchte man Daten aus den Logs abrufen ohne händisch in der Datenbank herumzuwühlen (s.u.). Dies ist insb. auch dann hilfreich, wenn man eigenen Funktionen, Notifys oder spezielle Plots entwirft, bei denen man auf Logdaten zugreifen möchte.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich beschrieben ist dies in der [http://fhem.de/commandref_DE.html#DbLog commandref#DbLog] und unterscheidet sich minimal (aber entscheidend) von der Struktur bei [[FileLog#Werte_auslesen|FileLogs]].&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, was man damit anstellen kann:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01 2016-10-03 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor vom 01.10.-03.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor&amp;lt;/code&amp;gt; alle Einträge des meinSensor von 8-16 Uhr am 01.10.2016&lt;br /&gt;
* &amp;lt;code&amp;gt;get meineDB - - 2016-10-01_08:00:00 2016-10-01_16:00:00 meinSensor:temperature&amp;lt;/code&amp;gt; nur die temperature Werte&lt;br /&gt;
* &amp;lt;code&amp;gt;{ ReadingsTimestamp(&amp;quot;meinSensor&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;0&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des aktuellen state des meinSensor&lt;br /&gt;
* &amp;lt;code&amp;gt;{ OldTimestamp(&amp;quot;meinSensor&amp;quot;) }&amp;lt;/code&amp;gt; Timestamp des letzten state des FHT_3a32&lt;br /&gt;
* &amp;lt;code&amp;gt;{ time_str2num(OldTimestamp(&amp;quot;meinSensor&amp;quot;)) }&amp;lt;/code&amp;gt; Timestamp in Sekunden des letzten state des meinSensor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Bearbeitung von Datenbank-Einträgen ==&lt;br /&gt;
{{Hinweis|Dieser Abschnitt soll lediglich eine kleine Einführung in die Datenbank-Bearbeitung liefern. Für vertiefende Informationen sollte man sich grundsätzlich mit SQL beschäftigen. Eine umfassende und gut verständliche Anleitung zu SQL bietet bspw. [http://www.w3schools.com/sql/default.asp w3schools].}}&lt;br /&gt;
Irgendwann wird der Fall eintreten, dass in der Datenbank Einträge drinstehen, die geändert oder gelöscht werden sollen (zB. fehlerhafte Sensor-Rückmeldungen, umbenannte Readings). In klassischen Log-Dateien würde man diese einfach bearbeiten und löschen/anpassen (wobei man aber tunlichst zuvor den fhem ausmacht um Datenfehler zu vermeiden). Eine Datenbank kann bearbeitet werden ohne den fhem abschalten zu müssen. &lt;br /&gt;
&lt;br /&gt;
Datenbanken kann man ohne weiter Hilfsmittel direkt von der Kommandozeile/Shell aus bearbeiten. Alternativ gibt es auch verschiedenste Tools (webbasiert oder als Applikation), die einen dabei unterstützen (Bsp. findet man u.a. [https://wiki.ubuntuusers.de/SQLite/#Grafische-Benutzeroberflaechen hier]). Für einfache Arbeiten reicht allerdings idR. Shell.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
&#039;&#039;&#039;Öffnen der DB unter Linux:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(Es werden Schreibrechte benötigt,ohne kann man die DB zwar öffnen, aber nichts machen)&lt;br /&gt;
 sudo sqlite3 fhem.db&lt;br /&gt;
Dadurch öffnet sich ein SQL-Konsole, auf der alle weiteren Befehle ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schliessen der DB:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hilfe anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Tabellen anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Schema der DB anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
(vgl. oben [[DbLog#Datenbanken]] und [[DbLog#Beispiel: Anlegen und Nutzung einer SQLite-Datenbank]])&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; .schema&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Eintäge anzeigen:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Die Einträge liegen alle in der Tabelle &amp;quot;History&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ganz wichtig&#039;&#039;&#039; ist immer das &amp;quot;;&amp;quot; am Ende Zeile (bei allen Kommandos, die nicht mit einem &amp;quot;.&amp;quot; anfangen). Wenn es vergessen wurde zeigt die Konsole solange neue Zeilen bis ein &amp;quot;;&amp;quot; eingegeben wird. So kann ein Befehl auch bequem über mehrere Zeilen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY;&lt;br /&gt;
&lt;br /&gt;
Dies kann sehr lange dauern und kann ggf. mit &amp;lt;code&amp;gt;STRG-C&amp;lt;/code&amp;gt; abgebrochen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-Statements werden Strings in einfache Anführungsstriche gesetzt, Zahlen nicht.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alle Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; select * from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LÖSCHEN aller Einträge eines bestimmten Wertes eines Readings eines Geräts anzeigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Löschen kann nicht rückgängig gemacht werden!! Also IMMER erst die entsprechenden SELECT-Statements solange verfeinern bis wirklich nur die gewünschten Einträge angezeigt werden. Dann das &amp;lt;code&amp;gt;select *&amp;lt;/code&amp;gt; durch &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ersetzen.&lt;br /&gt;
&lt;br /&gt;
 sqlite&amp;gt; delete from HISTORY where DEVICE=&#039;Pollenflug&#039; and READING=&#039;Graeser&#039; and VALUE&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenbank reparieren ==&lt;br /&gt;
Es kann immer wieder mal vorkommen, dass Datenbanken Fehler enthalten. Das muss im Alltag garnicht auffallen und auch nicht immer schlimm enden. Wenn man auf der SQL-Konsole aber bspw. eine Meldung &amp;lt;code&amp;gt;Error: database disk image is malformed&amp;lt;/code&amp;gt; erhält, sollte man ein Reparatur vornehmen.&lt;br /&gt;
&lt;br /&gt;
=== SQLite-Datenbanken ===&lt;br /&gt;
Die folgenden Schritte beschreiben, wie man eine SQLite-DB reparieren kann (Quelle: [http://techblog.dorogin.com/2011/05/sqliteexception-database-disk-image-is.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
DB öffnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Integritäts-Check durchführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sqlite&amp;gt; pragma integrity_check;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt hier ein &amp;quot;ok&amp;quot; ist die DB gesund. Ansonsten erscheint etwas wie&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** in database main ***&lt;br /&gt;
On tree page 118786 cell 1: Rowid 75 out of order (previous was 816660)&lt;br /&gt;
On tree page 118786 cell 4: Rowid 815704 out of order (previous was 816727)&lt;br /&gt;
Corruption detected in cell 0 on page 118786&lt;br /&gt;
Multiple uses for byte 132 of page 118786&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Datenbank-Dump erstellen (Export gesamten DB in die Datei &amp;quot;dump_all_20160516_1043.sql&amp;quot;) und DB verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .mode insert&lt;br /&gt;
sqlite&amp;gt; .output dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; .dump&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Neue Datenbank erstellen und den Dump einlesen, Integritäts-Check machen und verlassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo sqlite3 fhem-neu.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sqlite&amp;gt; .read dump_all_20160516_1043.sql&lt;br /&gt;
sqlite&amp;gt; pragma integrity_check;&lt;br /&gt;
ok&lt;br /&gt;
sqlite&amp;gt; .exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Spätestens jetzt fhem stoppen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem stop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Alte DB sichern und neue aktivieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mv fhem.db fhem.db.sv_20160516&lt;br /&gt;
sudo mv fhem-neu.db fhem.db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Kontrollieren, dass die neue DB die gleichen Rechte wie die alte DB hat (und ggf. korrigieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 root root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
~/fhem$ sudo chown fhem:root fhem.db&lt;br /&gt;
&lt;br /&gt;
~/fhem$ ls -lha&lt;br /&gt;
insgesamt 6,3G&lt;br /&gt;
drwxr-xr-x 12 fhem root    4,0K Mai 16 11:07 .&lt;br /&gt;
drwxr-xr-x  4 root root    4,0K Dez 25 17:50 ..&lt;br /&gt;
...&lt;br /&gt;
-rw-r--r--  1 fhem root    1,4G Mai 16 11:04 fhem.db&lt;br /&gt;
-rw-r--r--  1 fhem root    2,6G Mai 16 10:59 fhem.db.sv_20160516&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
fhem wieder starten (und natürlich kontrollieren):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo service fhem start&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nützliche Codeschnipsel ==&lt;br /&gt;
Anbei ein paar nützliche Codeschnipsel rund um DbLog&lt;br /&gt;
&lt;br /&gt;
=== Dateigrösse mitloggen ===&lt;br /&gt;
Da die Datenbank ins Unermessliche wachsen kann, empfiehlt es sich - je nach Speicherplatz - ab einer bestimmten Grösse tätig zu werden. Dazu muss diese Grösse allerdings ermittelt werden. Diese geschieht mittels des Userreadings, welches man vorteilshafterweise mit im DbLog-device anlegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;attr myDbLog userReadings DbFileSize:lastReduceLogResult.* { (split(&#039; &#039;,`du -m fhem.db`))[0] }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels dieses Attributs wird die Grösse der .db-Datei immer nach dem Ausführen des ReduceLog in das Reading &amp;quot;DbFileSize&amp;quot; in ganzzahligen MByte abgelegt.&lt;br /&gt;
&lt;br /&gt;
Basierend auf diesem Reading können dann weitere Aktionen, beispielsweise ein Plot, erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[Heizleistung_und_Gasverbrauch|Beispiel das DbLog-Daten für SVG-Plots verwendet]]&lt;br /&gt;
* [[SVG-Plots von FileLog auf DbLog umstellen]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:Anwesenheitserkennung&amp;diff=22511</id>
		<title>Diskussion:Anwesenheitserkennung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:Anwesenheitserkennung&amp;diff=22511"/>
		<updated>2017-09-07T17:44:48Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Vorschlag Veränderung des Artikel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vorschlag ==&lt;br /&gt;
Ich finde der gesamte Artikel ist inzwischen zu groß und unübersichtlich geworden. Ich schlage folgendes vor:&lt;br /&gt;
&lt;br /&gt;
Hauptartikel Anwesenheit nennt kurz die Möglichkeiten und verweist auf folgende weitere Artikel:&lt;br /&gt;
* Vorüberlegung&lt;br /&gt;
* Geofancy&lt;br /&gt;
* PRESENCE&lt;br /&gt;
* Beispiele der Anwesenheitserkennung&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Besonders bei PRESENCE würde ich dann auch nochmal eine neue Gliederung vornehmen:&lt;br /&gt;
PRESENCE:&lt;br /&gt;
* Übewachung LAN / WLAN&lt;br /&gt;
* FritzBox&lt;br /&gt;
* PerlCode DHCP&lt;br /&gt;
* Bluetooth&lt;br /&gt;
** Presenced&lt;br /&gt;
** LEPresenced&lt;br /&gt;
** Collectored&lt;br /&gt;
** Batterieüberwachung&lt;br /&gt;
--[[Benutzer:Amenophis86|Amenophis86]] ([[Benutzer Diskussion:Amenophis86|Diskussion]]) 19:44, 7. Sep. 2017 (CEST)&lt;br /&gt;
&lt;br /&gt;
== @Devender - Korrekturen und Klarstellungen ==&lt;br /&gt;
&lt;br /&gt;
@Devender: Du hast den Artikel überarbeitet und erweitert. Dabei sind folgende Fragen und Ungenauigkeiten entstanden:&lt;br /&gt;
* Randnotiz &amp;quot;Beide Wege können...&amp;quot; - hier wird (zumindest mir) nicht klar, welche Wege gemeint sind. &lt;br /&gt;
* Bitte vermeide Formulierungen wie &amp;quot;habe ich mich entschieden&amp;quot;, &amp;quot;mein kleines Tutorial&amp;quot;, &amp;quot;Ich werde im Folgenden&amp;quot;, ... - spätestens in ein paar Monaten ist nicht mehr ohne Weiteres ersichtlich, wer &amp;quot;ich&amp;quot; ist oder war. Zudem ist es für das Verständnis des Sachverhalts ohnehin unerheblich. Die Artikel hier sollten in einer (Personen-)neutralen sachlichen Ausdrucksweise geschrieben sein (das wird erleichtert, wenn &amp;quot;man&amp;quot;, &amp;quot;ich&amp;quot;, &amp;quot;wir&amp;quot; und ähnliche Begriffe vermieden werden).&lt;br /&gt;
* HTML-Konstrukte wie &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/nowiki&amp;gt; bitte vermeiden; einfach eine Leerzeile in den Text einfügen.&lt;br /&gt;
* Gliederungspunkte nicht unnötig umbenennen (&amp;quot;BT Dongel am PI installieren&amp;quot; -&amp;gt; &amp;quot;Schritt 1: BT Dongel am PI installieren&amp;quot;), weil die Gefahr besteht, dass Intra-Wiki Links dann nicht mehr funktionieren.&lt;br /&gt;
* Ich habe mir mal erlaubt, die Links auf die Ansprechpartner mit funktionierenden Querverweisen (Wiki/Forum) zu hinterlegen; vielleicht möchtest Du ja Deine Wiki-Benutzerseite auch noch so weit füllen, dass ein Verweis darauf (statt auf die Diskussionsseite) sinnvoll wird.&lt;br /&gt;
--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:34, 15. Jun. 2016 (CEST)&lt;br /&gt;
&lt;br /&gt;
Danke dir Peter. Ich hoffe ich komme in den nächsten Tagen dazu den Artikel noch mal zu überarbeiten!&lt;br /&gt;
Das mit den Ansprechpartner ist Klasse, hatte das nicht so hin bekommen wie es sollte.&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=22466</id>
		<title>Anwesenheitserkennung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=22466"/>
		<updated>2017-09-02T10:26:18Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Installationsbefehl korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Viele Benutzer führen bereits eine eigene &#039;&#039;&#039;Anwesenheitserkennung&#039;&#039;&#039; durch. Diese basiert in den meisten Fällen auf Ping Checks oder bei [[AVM Fritz!Box|FritzBoxen]] auf dem Befehl &#039;&#039;ctlmgr_ctl&#039;&#039;. Diese Lösungen können aber je nach Aufbau und Funktion FHEM massiv beeinträchtigen. Aufgrund des Aufbaus vom FHEM kann dieses dadurch für mehrere Sekunden zum völligen Stillstand gebracht werden.&lt;br /&gt;
&lt;br /&gt;
In FHEM gibt es mittlerweile mehrere Module, die eine zuverlässige Anwesenheitserkennung bieten, ohne dabei FHEM bei der Ausführung zu beeinträchtigen.&lt;br /&gt;
&lt;br /&gt;
Eine erweiterte Funktion der Anwesenheitserkennung ist die Standortverfolgung, die sich nicht nur auf ein oder sehr wenige mit (eigenem) WLAN versorgte Gebiete beschränkt.&lt;br /&gt;
&lt;br /&gt;
== Vorüberlegungen ==&lt;br /&gt;
Generell gibt es mehrere Ansätze um Anwesenheitserkennung mit Handys/Smartphones durchzuführen.&lt;br /&gt;
&lt;br /&gt;
* via PING Checks im gesamten WLAN&lt;br /&gt;
* Aktivitätsprüfung auf einer FritzBox&lt;br /&gt;
* Bluetooth Checks in der gesamten Wohnung&lt;br /&gt;
* eigene Perl-Funktion&lt;br /&gt;
* aktive Benachrichtigung des Smartphones, ausgelöst z.B. über Geo-Lokation/Geofence&lt;br /&gt;
&lt;br /&gt;
Dabei gilt bei der Auswahl der Art darauf zu achten wie sich das jeweilige Device verhält. Aufgrund der Vielfältigkeit kann man hier keine allgemeine Vorgehensweise empfehlen. Als einfacher Start (zumindest für Nicht-Apfel Telefone) eignet sich die Ping-Überprüfung und die FritzBox-Abfrage sehr gut.&lt;br /&gt;
&lt;br /&gt;
=== Randbedingungen ===&lt;br /&gt;
Es gibt Geräte, die ihr WLAN/Bluetooth auch im Standby ständig aktiv haben und auf Anfragen antworten können (fast alle Android-Geräte). Gerade bei Tests über WLAN kann sich das aber signifikant auf die Akku Leistung auswirken.&lt;br /&gt;
&lt;br /&gt;
Andere Geräte wiederum schalten WLAN im Standby Betrieb aus, um Akkukapazität zu sparen. Bluetooth hingegen bleibt weiterhin aktiviert und kann auf Anfragen reagieren. (iPhone)&lt;br /&gt;
&lt;br /&gt;
Wenn man bei einem iPhone die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert hat, so ist dies auch im Standby jederzeit pingbar, wenn der Recher auf dem iTunes zum synchroniseren läuft auch an ist. Ansonsten ist bei iPhone Geräten nur die Aktivitätsprüfung mit einer FritzBox oder das überwachen der DHCP Lease auf einer Airport Basestation wirklich zuverlässig.&lt;br /&gt;
&lt;br /&gt;
Auch wenn Bluetooth aktiviert ist, so bleiben einige Mobiltelefone erst dann empfangsbereit, wenn sie bereits zu irgend einem Bluetoothgerät gekoppelt wurden. Sind diese Geräte noch nie gekoppelt worden, deaktivieren diese ihren Bluetooth Empfänger beim verlassen des Bluetooth-Menüs im Gerät (iPhone).&lt;br /&gt;
&lt;br /&gt;
Hier gilt es vor allem auszuprobieren, wie stark der Akku durch eine Anwesenheitserkennung belastet wird. Entscheidend ist hier, in welchem Abstand man eine Anwesenheitserkennung durchführt. Viele Abfragen wirken sich stärker auf den Akku aus als wenige. Wenige Abfragen bieten aber keine zuverlässige und zeitnahe Erkennung.&lt;br /&gt;
&lt;br /&gt;
Als Alternative, unabhängig vom WLAN und der Erkennung, ob ein Gerät dort eingebucht ist oder nicht, bzw. unabhängig von Bluetooth kann zumindest bei einem iPhone die seit iOS 7 nochmals stark verbesserte Geo-Lokation (Geofencing) genutzt werden. Die iPhone Apps [http://geofency.com/ Geofency] oder [http://geofancy.com/ Geofancy] werden über das FHEM-Modul GEOFANCY angebunden und übertragen ihren Status immer dann, wenn ein definierter Standort betreten oder verlassen wird. Gekoppelt mit entsprechenden Notify und/oder Watchdog Kommandos ist so ebenfalls eine sehr zuverlässige Anwesenheitserkennung möglich (und das nicht nur für das eigene Zuhause).&lt;br /&gt;
&lt;br /&gt;
== Das PRESENCE Modul ==&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an. Diese sind aktuell folgende:&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;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äte, ü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;
=== Ping-Überwachung von Geräten 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;
=== 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;
=== Bluetooth-Überwachung von Geräten durch den FHEM Server ===&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;
=== Bluetooth-Überwachung von Geräten durch verteilte Agenten in der Wohnung (presenced/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 (Download-Link ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für den Raspberry zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beide Programme (presenced/collectord) 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. Nach Installation der *.deb Pakete sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-rc.d presenced defaults&lt;br /&gt;
sudo update-rc.d collectord defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von presenced ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] Beschreibung zum PRESENCE Modul enthalten.&lt;br /&gt;
&lt;br /&gt;
==== Jeden Raum einzeln ansprechen (presenced) ====&lt;br /&gt;
Nun kann zuallererst jeder Raum einzeln angesprochen werden. Dabei ist zu beachten, dass pro Definition in der Konfiguration nur ein Gerät in einem Raum spezifisch überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Eine Definition sieht dabei folgendermaßen aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy_Wohnzimmer PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.0.10:5111&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird nun das Gerät nur im Wohnzimmer (Raspberry mit IP 192.168.0.10) überwacht.&lt;br /&gt;
&lt;br /&gt;
==== Alle Räume gemeinsam ansprechen (collectord) ====&lt;br /&gt;
Um jedoch alle Räume gemeinsam zu verwenden, gibt es den Collector-Daemon. 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;
Um alle Räume zu kennen, müssen diese mit einem Config-File dem collectord mitgeteilt werden. Dieses sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Schlafzimmer]           # Name des Raumes (wird in FHEM als Reading angezeigt)&lt;br /&gt;
address=192.168.179.31   # IP-Adresse oder Hostname des presenced&lt;br /&gt;
port=5111                # TCP Port, der verwendet werden soll (standardmäßig Port 5111)&lt;br /&gt;
presence_timeout=120     # Prüfinterval, das verwendet werden soll, wenn ein Gerät anwesend ist&lt;br /&gt;
absence_timeout=20       # Prüfinterval, das verwendet werden soll, wenn ein Gerät abwesend ist&lt;br /&gt;
&lt;br /&gt;
[Wohnzimmer]&lt;br /&gt;
address=192.168.179.34&lt;br /&gt;
port=5111&lt;br /&gt;
presence_timeout=180&lt;br /&gt;
absence_timeout=20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist dieses Config-File unter /etc/collectord.conf zu finden. Mit dieser Konfiguration kann der Collectord gestartet werden. Es empfiehlt sich diesen mit auf dem FHEM Server zu betreiben. Die erforderliche Definition in der FHEM-Konfiguration:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald das Handy irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort an FHEM und teilt den Raum mit.&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von collectord findet man in der [http://fhem.de/commandref.html#PRESENCE Commandref zum PRESENCE Modul].&lt;br /&gt;
&lt;br /&gt;
=== Überwachung von Geräten mit 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;
=== Eventbasierte Anwesenheitserkennung am Beispiel mittels UniFi Controller ===&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;
== Das GEOFANCY Modul ==&lt;br /&gt;
Das Modul ermöglicht über einen sogenannten Webhook Mechanismus (umgangssprachlich oft auch als &amp;quot;Push&amp;quot; benannt) das aktive Melden des aktuellen Standortes. Die iPhone Apps  [http://geofency.com/ Geofency] und [http://geofancy.com/ Geofancy] können dann aktiv und quasi in dem Moment, wo man den Wohnbereich betritt oder verlässt, benachrichtigen. Android Nutzern können [https://play.google.com/store/apps/details?id=de.egi.geofence.geozone&amp;amp;hl=de EgiGeoZone Geofence] nutzen. Das geht nochmals um einiges schneller, als die Erkennung im WLAN, bei der die Anwesenheit nur in (engen) Zyklen aktiv geprüft werden muss. Gleichzeitig werden Ressourcen in FHEM geschont. Die aktuelle Implementierung im iPhone 5S mit dediziert für das Tracking zuständigem Chip ist so gut, dass der Akku ebenfalls sehr geschont wird.&lt;br /&gt;
&lt;br /&gt;
=== Modul in FHEM einrichten ===&lt;br /&gt;
Das Modul ist mit einer einfachen Definition sofort betriebsbereit:&lt;br /&gt;
:&amp;lt;code&amp;gt;define geofancy GEOFANCY geo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit nimmt FHEM unter &amp;lt;nowiki&amp;gt;http://192.168.178.1:8083/fhem/geo&amp;lt;/nowiki&amp;gt; entsprechende Meldungen des iPhones entgegen. Damit das nicht nur über das lokale WLAN funktioniert, bedarf es allerdings noch einiger zusätzlicher Maßnahmen. FHEM muss vom Internet erreichbar gemacht werden, dabei sollte unbedingt an die Absicherung des Zugriffs gedacht werden.&lt;br /&gt;
&lt;br /&gt;
Zunächst einmal habe ich bei mir eine eigene FHEMWEB Instanz dafür angelegt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define WEBhook FHEMWEB 8088 global&lt;br /&gt;
attr WEBhook column Alarms: Apartment: Living: Bedroom: Kitchen: Sonos: Residents: Weather: Bathroom: Logs: Statistics: DashboardRoom: System: hidden: all:&lt;br /&gt;
attr WEBhook hiddenroom input,detail,save,Unsorted,Everything,CUL_HM,FS20,Commandref,style,Edit files,Select style,Logfile,Floorplans,Remote doc,FileLogs,Apartment,Bathroom,Bedroom,Kitchen,Living,Residents,System,Weather,Event monitor,NEW&lt;br /&gt;
attr WEBhook room hidden&lt;br /&gt;
attr WEBhook webname webhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist unter der URL &amp;lt;nowiki&amp;gt;http://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; das GEOFANCY Modul erreichbar. Ich verstecke in dieser Ansicht noch alle Räume, die ich so habe. Wer die Raumnamen allerdings kennt, kann sie trotzdem aufrufen. Die Anzeige in den Räumen kann man mit dem Attribut column und entsprechend leeren Definitionen verstecken. Nun muss man explizit den Devicenamen kennen, um noch etwas über die Konfiguration in Erfahrung bringen zu können.&lt;br /&gt;
Auch wenn das Security-by-Obscurity ist - ich fühle mich wohler damit.&lt;br /&gt;
&lt;br /&gt;
=== Webhook weiter absichern ===&lt;br /&gt;
Mit Hilfe eines [http://fhem.de/commandref.html#allowed allowed]-Devices lässt sich die FHEMWEB Instanz noch weiter absichern indem nur die tatsächlich benötigten Kommandos erlaubt werden (in diesem Fall keine) und damit alle anderen nicht erlaubten (attr,define,get,set,...) automatisch nicht mehr zur Verfügung stehen: &lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
define allowedWEBhook allowed&lt;br /&gt;
attr allowedWEBhook allowedCommands ,&lt;br /&gt;
attr allowedWEBhook allowedDevices ,&lt;br /&gt;
attr allowedWEBhook validFor WEBhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem ist dringend zu empfehlen, den Zugriff über TLS/SSL und HTTP Basic-Authentication weiter abzusichern. Läuft FHEM auf einem Raspberry&amp;amp;nbsp;Pi, dann empfehle ich dazu die Konfiguration eines ReverseProxy (vorzugsweise HAproxy, Pound oder Varnish, notfalls auch Nginx oder Apache); damit ist man am flexibelsten und kann auch alle FHEMWEB Instanzen direkt über einen einzigen Port (meist 443, der HTTPS Standard Port) zusammenfassen. Ich möchte hier allerdings beschreiben, wie weit man mit FHEM Bordmitteln kommt und nehme das Beispiel einer Installation auf einer Fritzbox.&lt;br /&gt;
&lt;br /&gt;
Wie TLS aktiviert wird, steht in der Commandref für [[FHEMWEB]]. Um die Kommandos auf der Fritzbox ausführen zu können, muss zuerst Telnet aktiviert werden (bitte Google benutzen). Anschließend wechselt man auf der Fritzbox ins Verzeichnis /var/media/ftp/fhem und kann dann den Hinweisen aus der [http://fhem.de/commandref.html#FHEMWEB Commandref] unter dem Punkt HTTPS folgen. Letztlich fehlt noch das entsprechende Attribut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr WEBhook HTTPS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes aktivieren wir Benutzername+Passwort für den Zugriff. Die commandref für allowed gibt auch hier unter dem Punkt basicAuth entsprechende Hinweise. Wir fügen hier einfach mal einen Benutzer &amp;quot;webhook&amp;quot; mit dem Passwort &amp;quot;Geofancy&amp;quot; hinzu, das sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr allowedWEBhook basicAuth { &amp;quot;$user:$password&amp;quot; eq &amp;quot;webhook:Geofancy&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zur Absicherung gibt auch [[FritzBox Webzugriff absichern]].&lt;br /&gt;
&lt;br /&gt;
Um zu testen, ob unsere Absicherung erfolgreich war, kann man die URL &amp;lt;nowiki&amp;gt;https://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; aufrufen (wichtig ist, dass man jetzt https und nicht mehr http eingibt; ansonsten bekommt man keine Antwort). Eine Zertifikatswarnung kann getrost ignoriert werden, verschlüsselt wird trotzdem. Es sollte auch eine Passwort Abfrage kommen und die Eingabe der entsprechenden Daten sollte dann zu einer entsprechenden Meldung vom GEOFANCY Modul führen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NOK No data received, see API information on http://wiki.geofancy.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist ok, schließlich sind wir keine App, sondern der Mensch, der nur mal eben prüfen will :-)&lt;br /&gt;
&lt;br /&gt;
=== Zugriff vom Internet ermöglichen ===&lt;br /&gt;
Das ist je nach Fritzbox und Software Version unterschiedlich. Grundsätzlich gilt: Eine Weiterleitung des ports 8088 vom Internet auf das laufende FHEM auf Port 8088 intern ist von AVM so nicht vorgesehen.&lt;br /&gt;
Bei mir führte folgendes zum Erfolg:&lt;br /&gt;
&lt;br /&gt;
* Einloggen per Telnet auf der Fritzbox (ich habe FritzOS 6 installiert)&lt;br /&gt;
* Konfiguration editieren mittels &amp;quot;nvi /var/flash/ar7.cfg&amp;quot;&lt;br /&gt;
* Suchen nach richtiger Zeile durch Eingabe von &amp;quot;/internet_forwardrules&amp;quot; und Enter&lt;br /&gt;
* Hinzufügen einer weiteren Zeile (Vorsicht, die bestehende Zeile endet mit ; und das muss in , umgeändert werden, so dass das ; schließlich am Ende der Zeile steht.&lt;br /&gt;
&lt;br /&gt;
So sieht es bei mir vorher aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
Hinterher:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;, &amp;quot;tcp 0.0.0.0:8088 0.0.0.0:8088 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach mittels &amp;quot;:x&amp;quot; abspeichern und sofort per &amp;quot;reboot&amp;quot; die Box neu starten, um diese Änderungen zu aktivieren. Das ist wichtig; ansonsten zeigt die Erfahrung, dass die Änderung nicht dauerhaft erhalten bleibt und die gerade gemachten Änderungen verloren gehen.&lt;br /&gt;
&lt;br /&gt;
Wer die Einstellungen zu &amp;quot;internet_forwardrules&amp;quot; bei sich nicht finden kann, hat womöglich eine andere Version als ich oder ein leicht anderes Gerät und bemüht am besten Google, was er tun kann, um das Gleiche zu erreichen. Möglicherweise tauchen die Einträge auch erst auf, wenn man mal über das Webinterface ein Forwarding eingerichtet hatte.&lt;br /&gt;
&lt;br /&gt;
Hat man einen DynDNS Dienst oder myFritz auf der Fritzbox aktiviert, so kann man jetzt auch von draußen auf den Webhook zugreifen. Das kann man prüfen, indem man das iPhone aus dem WLAN ausbucht und einmal die externe Adresse eingibt, also z.B. https://meindyndns.org:8088/webhook/geo.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Alternativen für den Zugriff aus dem Internet ===&lt;br /&gt;
Als Alternative zum Port Forwarding kann man sich auch per VPN in das lokale Netzwerk einwählen. iOS bietet dazu auch eine automatische Aktivierung des VPN (VPN on Demand), wie z.B. [http://forum.loxone.com/dede/netzwerk-firewall-and-security/8121-vpn-demand-ios-8-1-1-fritz-box-kleine-how.html hier] beschrieben wird.&lt;br /&gt;
&lt;br /&gt;
Auch eine Alternative ist, das Portforwarding nicht direkt an FHEM einzurichten, sondern an einem im Netzwerk laufenden Reverse-Proxy, der dann seinerseits die Anfragen an FHEM weiterleitet. Dies kann z.B. Apache, Nginx oder am besten HAproxy sein.&lt;br /&gt;
Letzterer ist dabei sehr flexibel, allerdings nicht unbedingt einfach zu konfigurieren. Ein paar Inspirationen diesbezüglich gibt es z.B. [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/stat/etc/haproxy hier] und [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/dyn/etc/haproxy hier]. Wer pfSense nutzt, findet [http://loredo.me/post/116633549315/geeking-out-with-haproxy-on-pfsense-the-ultimate diesen Artikel] womöglich auch interessant. Er zeigt auch, dass mit HAproxy noch weit mehr möglich ist.&lt;br /&gt;
Der Reverse-Proxy sollte dabei auch unbedingt der TLS Termination Point sein (TLS Offloading). Nicht nur spart man sich dann die Aktivierung von TLS in FHEM, sondern man hat auch mehr Einfluss darauf, wie TLS arbeitet (z.B. Deaktivierung von SSLv3, forcieren von TLSv1.2, nur als sicher eingestufte Cipher Suite... siehe auch Infos auf der [https://wiki.mozilla.org/Security/Server_Side_TLS Mozilla Website]).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten in der Geof[e|a]ncy.app ===&lt;br /&gt;
Hat das alles soweit geklappt, können endlich in der Geofency.app bzw. Geofancy.app am iPhone die gewünschten Bereiche definiert werden. Am Besten zuvor in den Global Settings die folgenden Einstellungen hinterlegen:&lt;br /&gt;
&lt;br /&gt;
* URL: https://meindyndns.org:8088/webhook/geo&lt;br /&gt;
* POST (oder GET, ist egal - das FHEM Modul kann beides)&lt;br /&gt;
* HTTP Basic Authentication: EIN (entsprechend Username und Password eintragen)&lt;br /&gt;
&lt;br /&gt;
Anfänglich ist es empfehlenswert noch &amp;quot;Notification on success&amp;quot; und &amp;quot;Notification on Failure&amp;quot; einzuschalten. Ersteres kann man ausmachen wenn man weiß, dass es soweit funktioniert. Über &amp;quot;Send Test-Request&amp;quot; kann man einmal einen Test schicken und erhält das Ergebnis entsprechend dargestellt. Es sollte sowas kommen wie&lt;br /&gt;
:&amp;lt;code&amp;gt;POST Success: test OK&amp;lt;/code&amp;gt;. In Geofancy.app gibt es keine Rückmeldung über den Erfolg des Testrequests. In FHEM sollten sich durch den Testrequest jedoch die Readings sofort aktualisieren (Ggf. ist ein Reload der FHEMWEB-Seite nötig da zusätzliche Tabellenzeilen nicht via Longpoll ergänzt werden). &lt;br /&gt;
&lt;br /&gt;
Funktioniert das soweit, kann man eine neue Lokation als sein Zuhause anlegen. Es empfiehlt sich einen ID-Namen zu setzen; dieser ist dann in FHEM als Name für die Lokation sichtbar. Für die eigene Wohnung empfiehlt sich hier &amp;quot;home&amp;quot; (da dies auch direkt vom RESIDENTS Modul so verwendet werden kann). Man kann auch Trigger für andere Standorte anlegen. FHEM weiß dann sogar, wenn ihr im Büro seid und könnte sich dabei auch unterschiedlich verhalten, als wenn ihr &amp;quot;auf Achse&amp;quot; seid. Bei letzterem ist der Status im GEOFANCY Modul &amp;quot;underway&amp;quot;, was so viel heißt wie &amp;quot;unbekannter Aufenthaltsort&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Zumindest für Geofancy.app liefert ein Testrequest wohl zufällige Locations zurück. Die eigenen Location-IDs werden also nicht übergeben, selbst wenn man sich in einem Geofence befindet. Um zu testen muss man sich wohl oder übel selbst bewegen ;-).&lt;br /&gt;
&lt;br /&gt;
=== GEOFANCY Modul individualisieren ===&lt;br /&gt;
Die im GEOFANCY Modul dargestellten Readings sind nun in etwa so, wenn ihr euch bewegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      -&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:51F23894-AAAA-BBBB-CCCC-0123456789AB trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer genauer hinschaut sieht: Mein iPhone heißt wohl 51F23894-AAAA-BBBB-CCCC-0123456789AB.&lt;br /&gt;
Damit nun die Readings für mein iPhone richtig angelegt werden, muss ein Device Alias gesetzt werden. Sinnvoll erscheint mir der Vorname des Besitzers:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr geofancy devAlias 51F23894-AAAA-BBBB-CCCC-0123456789AB:Julian&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Alias-Namen können mit Leerzeichen einfach angehängt werden.&lt;br /&gt;
Jetzt werden weitere Readings angelegt, sobald GEOFANCY entsprechende Daten vom Mobilgerät empfängt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   Julian          arrived home&lt;br /&gt;
     2014-01-18 14:37:42   currLocLat_Julian 48.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocLong_Julian 11.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocTime_Julian 2014-01-18 14:37:42&lt;br /&gt;
     2014-01-18 14:37:42   currLoc_Julian  home&lt;br /&gt;
     2014-01-17 19:18:23   lastArr         Julian home&lt;br /&gt;
     2014-01-17 18:41:46   lastDep         Julian Office&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      Julian&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-17 18:41:46   lastLocArr_Julian 2014-01-17 08:58:37&lt;br /&gt;
     2014-01-17 18:41:46   lastLocDep_Julian 2014-01-17 18:41:46&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLat_Julian 48.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLong_Julian 11.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLoc_Julian  Office&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:Julian trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man nun etwas bestimmtes tun, wenn man nach Hause kommt oder das Heim verlässt, kann man am Besten ein entsprechendes Notify auf das Reading currLoc_Name setzen. Ich aktualisiere lediglich zwei Dummies, durch die dann alle weiteren Notifies ausgelöst werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define n_Julian.Presence notify geofancy:currLoc_Julian:.home set Julian.homestatus:FILTER=STATE!=home home&lt;br /&gt;
attr n_Julian.Presence room Residents&lt;br /&gt;
define n_Julian.absence notify geofancy:currLoc_Julian:.underway {\&lt;br /&gt;
if (Value(&amp;quot;Julian.homestatus&amp;quot;) ne &amp;quot;gone&amp;quot;) {\&lt;br /&gt;
  fhem(&amp;quot;set Julian.homestatus:FILTER=STATE!=absent absent&amp;quot;);;\&lt;br /&gt;
}\&lt;br /&gt;
}&lt;br /&gt;
define n_Julian.whereabout notify geofancy:currLoc_Julian:.* set Julian.whereabout:FILTER=STATE!=$EVTPART1 $EVTPART1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer es noch einfacher möchte (bzw. auch noch mehr Features) schaut sich einmal die neue Modulfamilie aus RESIDENTS[http://fhem.de/commandref_DE.html#RESIDENTS], ROOMMATE[http://fhem.de/commandref_DE.html#ROOMMATE] und GUEST[http://fhem.de/commandref_DE.html#GUEST] an. Diese sind direkt auf GEOFANCY abgestimmt. Dabei kann das devAlias Attribut entfallen und man hinterlegt die UUID stattdessen direkt im ROOMMATE oder GUEST Device (Attribut r*_geofenceUUIDs). Das erspart es für jeden Bewohner und jedes Device zig unterschiedliche Devices der Typen Notify, DOIF oder Watchdog anlegen und pflegen zu müssen.&lt;br /&gt;
&lt;br /&gt;
Wer mehr Kontrolle möchte kann natürlich bei notify, DOIF und Co. bleiben: &amp;lt;code&amp;gt;define n_rr_Julian.location notify geofancy:currLoc_Julian:.* set rr_Julian:FILTER=location!=$EVTPART1 location $EVTPART1&amp;lt;/code&amp;gt;. Wobei &amp;quot;Julian&amp;quot; dabei als devAlias in GEOFANCY eingtragen wurde, rr_Julian der Name des ROOMMATE aus RESIDENTS ist. Außerdem wurden die Location-IDs in der Geofency.app bzw. Geofancy.app so gewählt, dass diese direkt einem ROOMMATE-Status entsprechen (also z.B. home, wayhome...).&lt;br /&gt;
&lt;br /&gt;
== Beispiele für die Nutzung der Anwesenheitserkennung ==&lt;br /&gt;
Hier sollen Beispiele für den Nutzen von Anwesenheitserkennung aufgezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Abschalten aller Verbraucher (Licht, Musikanlage) beim Verlassen der Wohnung ===&lt;br /&gt;
Typisches Szenario: Man geht ausser Haus, aber hat vergessen im Bad das Licht aus zu machen. Allerdings geht man heutzutage fast garnicht mehr ohne Handy aus dem Haus.&lt;br /&gt;
&lt;br /&gt;
Nun soll FHEM in der gesamten Wohnung das Licht, sowie sonstige Verbraucher ausschalten, wenn ich länger als 15 Minuten ausser Haus bin. Dazu benötigt man zuerst eine structure, die alle Verbraucher und sonstigen Devices, die das betrifft, zusammenfasst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Gesamte_Wohnung structure Gesamtes_Licht Licht_Wohnzimmer Licht_Kueche LED_Kueche Licht_Bad Licht_Schlafzimmer AV_Receiver TV_Steckdose&lt;br /&gt;
attr Gesamte_Wohnung room Wohnung&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mittels eines watchdogs eine Überwachung für sein Handy anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Überwachen der gesamten Wohnung mittels collectord sowie presenced in jedem Raum&lt;br /&gt;
define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&lt;br /&gt;
attr Handy event-on-change-reading state  # Ein Event soll nur bei der Änderung des Anwesenheitsstatus (Reading: status) erfolgen. Wichtig für den watchdog!!!&lt;br /&gt;
&lt;br /&gt;
# Nach 15 Minuten Abwesenheit (Handy im Status &amp;quot;absent&amp;quot;) soll die gesamte Wohnung ausgeschaltet werden.&lt;br /&gt;
define watchdog_Anwesenheit watchdog Handy:absent 00:15 Handy:present set Gesamte_Wohnung off ; trigger watchdog_Anwesenheit .&lt;br /&gt;
attr watchdog_Anwesenheit regexp1WontReactivate 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigung bei Batteriewechsel ===&lt;br /&gt;
Mit Hilfe des PRESENCE-Moduls kann man auch bei batteriebetriebenen Geräten eine Meldung ausgeben, sobald ein Batteriewechsel ansteht. Hier im Beispiel wird der Eve-Room-Sensor von Elgato eingebunden und anschließend mit einer DOIF-Nachricht ausgestattet.&lt;br /&gt;
Die Bluetooth-Adresse des Sensors kann mittels eines BLE-Scanners ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# PRESENCE-Modul für Elgato Eve Room Sensor mit Aktualisierung aller 6 Minuten&lt;br /&gt;
define Eve_Room_BLE lan-bluetooth &amp;lt;Bluetooth-Adresse&amp;gt; 127.0.0.1:5333 360&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend wird eine DOIF-Regel definiert, die eine Nachricht an die installiere [[FHEM_APP|FHEM App]] absendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Eve_Room_BLE_Battery_Msg DOIF ([Eve_Room_BLE] eq &amp;quot;absent&amp;quot;) (set Msg_iPhone message &#039;Batteriewechsel beim Eve Room Sensor im Wohnzimmer.&#039;)&lt;br /&gt;
attr Eve_Room_BLE_Battery_Msg wait 600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung des PRESENCE-Eintrages sollte nicht größer sein als das WAIT-Attribut der DOIF-Regel. Ansonsten könnte eine kurze Systemstörung zum Fehlalarm führen.&lt;br /&gt;
&lt;br /&gt;
== Anwesenheitserkennung Bluetooth PebbleBee mit PRESENCE Modul ==&lt;br /&gt;
Im Forum gibt es einen {{Link2Forum|Topic=28753|LinkText=langen Beitrag}} über die Einrichtung eines BT-Tag an einem RaspberryPI mit FHEM. Dabei werden Skripte wie blescan.pl und lepresenced genannt.&lt;br /&gt;
Da mittlerweile viele neue Informationen zusammen gekommen sind wurde der Wiki Eintrag erstellt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Konfiguration für &#039;&#039;&#039;LE Deviced (z.B. Gtags,Pebbles etc.)&#039;&#039;&#039; und &#039;&#039;&#039;NICHT LE Device (z.B. IPhone)&#039;&#039;&#039; beschreiben.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Beide hier beschriebenen Wege (presenced/lepresenced) können parallel auf dem selben BT-Dongle laufen, da sich die Ports unterscheiden! }} &lt;br /&gt;
&#039;&#039;&#039;Wo finde ich denn lepresenced?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
lepresenced kann über Github heruntergeladen werden (Link weiter unten)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Was ist der Vorteil gegenüber blescan.pl?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
blescan.pl hat u. a. das Problem, dass dank der wundervollen Bluetooth-Implementierung unter Linux ab und zu der Scan fehlschlägt und das Interface resettet werden muss. Das tut blescan.pl auch mit aller Gewalt. Dazu kommt, dass bei längeren Scanzeiten und vielen Tags sich die Prozesse anstauen, weil immer nur auf einen Tag &amp;quot;gewartet&amp;quot; wird. Außerdem wurden mit der Einführung von lepresenced sämtliche Supportverträge gekündigt lepresenced läuft dauerhaft und merkt sich bei allen sendenden Tags den Zeitstempel des letzten Empfangs. &lt;br /&gt;
&lt;br /&gt;
=== Getestete Hardware/Software===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie&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 Dongel am PI installieren ===&lt;br /&gt;
&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain 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 Raspberry 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;
=== Anleitung für ein  LE Device (z.B. Gtags,Pebbles etc.) ===&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ändigkeithalber 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-0.82-1.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.82-1.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&lt;br /&gt;
 https://svn.fhem.de/trac/export/13992/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.82-1.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, kann nun 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.82-1.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;
Ab hier kann, wenn alles problemlos funktioniert hat mit der [[Einrichtung der G-Tags über FHEM]] weitergemacht werden.&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 der G-Tags über FHEM====&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration der BT-Tags in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der 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;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für ein NICHT LE Device (z.B. IPhone) ===&lt;br /&gt;
Die Installation kann (wie in der commanref beschrieben) über Debian Pakete erfolgen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.deb package for Debian (noarch): presenced-1.4.deb https://svn.fhem.de/fhem/trunk/fhem/contrib/PRESENCE/deb/presenced-1.4.deb&lt;br /&gt;
&lt;br /&gt;
.deb package for Raspberry Pi (raspbian): presenced-rpi-1.4.deb https://svn.fhem.de/fhem/trunk/fhem/contrib/PRESENCE/deb/presenced-rpi-1.4.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i presenced-rpi-1.4.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installation perl script file (Auszug commanref)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
direct perl script file: presenced https://svn.fhem.de/fhem/trunk/fhem/contrib/PRESENCE/presenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration der BT-Tags in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der Tag dem FHEM-Server bekannt gemacht werden.&lt;br /&gt;
{{Randnotiz|RNText=Wenn man mit collectord arbeitet muß man die Erkennung bei allen Devices auf port 5222 setzen.&lt;br /&gt;
:&amp;lt;code&amp;gt;lan-bluetooth xx:xx:80:xx:xx:AC 127.0.0.1:5222 20 120&amp;lt;/code&amp;gt;}}&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;
=== Automatischer Start ===&lt;br /&gt;
&lt;br /&gt;
Wurde leprecend mit der oben genannten Variante 1 oder 2 installiert worden sein, wird per systemctl der automatische Start direkt eingerichtet. Es ist somit keine extra Konfiguration per Cron oder init.d notwendig.&lt;br /&gt;
&lt;br /&gt;
Wurde die Variante 3 - die manuelle Installation - durchgeführt; bitte folgende Schritte für den automatischen Start befolgen:&lt;br /&gt;
 &lt;br /&gt;
Damit das leprecend Skript beim Systemstart mitgestartet wird, sollte eine Crontab Eintrag gesetzt werden. Alternativ die rc.local anpassen.&lt;br /&gt;
Ersteres würde so aussehen:&lt;br /&gt;
&lt;br /&gt;
Ein sh-Skript mit dem Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo start-stop-daemon -d /opt/fhem/script -S -x /opt/fhem/script/lepresenced &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
unter dem Verzeichnis /home/pi ablegen, welches sich init_start.sh nennt.&lt;br /&gt;
&lt;br /&gt;
Das Skript dann unter: sudo crontab -e einhängen mit folgender Folge:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@reboot        /home/pi/init_start.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zweiteres so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei rc.local, freie Stelle suchen, vor &amp;quot;exit 0&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Start lepresenced&lt;br /&gt;
/opt/fhem/script/lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;
===  Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags ===&lt;br /&gt;
&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;
=== Verwendung von Collectord bei mehreren PRESENCE Installationen mit LE-Devices ===&lt;br /&gt;
&lt;br /&gt;
Um zwei presence Installation zu verbinden wird der collectored Daemon von Markus Bloch benötigt.&lt;br /&gt;
Hierfür gibt es im Wiki auch eine kurze Erläuterung sowie die Commandref.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufbau:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
RPi1 (Hautpinstanz): fhem nebst presence Installation sowie collectord&lt;br /&gt;
RPi2 (Zweitsystem): fhem nebst presence Installation&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Installation:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auf RPi1 wird wie in der Commandref und im Wiki beschriebendas Presence Paket (https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/) heruntergeladen, installiert und konfiguriert.&lt;br /&gt;
Alle BT-Tags werden dann wie im Wiki beschrieben konfiguriert.&lt;br /&gt;
&lt;br /&gt;
auf RPi2 wird wie in der Commandref und im Wiki beschriebendas Presence Paket (https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/) heruntergeladen, installiert und konfiguriert.&lt;br /&gt;
Alle BT-Tags werden dann wie im Wiki beschrieben konfiguriert.&lt;br /&gt;
&lt;br /&gt;
Somit sollte auf beiden Systemen eine identische Konfiguration vorliegen.&lt;br /&gt;
&lt;br /&gt;
Jetzt wird das collectord heruntergeladen und installiert:&lt;br /&gt;
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.7.deb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i collectord-1.7.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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfiguration Shell:&#039;&#039;&#039;&amp;lt;br&amp;gt;&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: Es dürfen keine [Namen] mit Leerzeichen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfiguration FHEM:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
RPi1&lt;br /&gt;
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5333 60&lt;br /&gt;
Hinweis: Der Port ist der, des Collectord!! Also hier, Standard 5333&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
RPi2&lt;br /&gt;
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.27:533360&lt;br /&gt;
Hinweis: Der Port ist der, des Collectord!! Also hier, Standard 5333 die IP-Adresse von RPi1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration kann der Daemon gestartet werden. Um eine visuelle Log-Ausgabe mit dem Aufruf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /usr/bin/perl /usr/sbin/collectord -vv -c /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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:55 - forked with PID 15556&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5333&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;Automatischer Start:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn das Collectord per .deb Paket installiert wurde, startet es automatisch bei einem Reboot mit.&lt;br /&gt;
Manuell Starten als Daemon mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /usr/bin/perl /usr/sbin/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;
=== 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 [[https://forum.fhem.de/index.php/topic,28753.msg499184/topicseen.html#msg499184]] diskutiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Versionsänderungen===&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ansprechpartner ===&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:Code Snippets]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=IPCAM&amp;diff=22063</id>
		<title>IPCAM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=IPCAM&amp;diff=22063"/>
		<updated>2017-08-04T20:53:58Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Foscam FI9831P hinzugefügt bei unterstütze Modelle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung von Netzwerkkameras&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=49_IPCAM.pm&lt;br /&gt;
|ModOwner=mfr69bs ({{Link2FU|6|Martin Fischer}})}}&lt;br /&gt;
&lt;br /&gt;
[[IPCAM]] ermöglicht die ereignis- oder zeitgesteuerte Erzeugung von Mitschnitten bei Netzwerkkameras. Außerdem ist es möglich, die Kamera im PTZ-Modus oder über eigene Befehle zu steuern.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Die Kamera(bilder) müssen über eine URL erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Das IPCAM Objekt wird angelegt mit&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;define &amp;lt;name&amp;gt; IPCAM &amp;lt;ip[:port]&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zum obigen Define muss zwingend noch das &#039;&#039;path&#039;&#039; Attribut gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Die wichtigsten Attribute von &#039;&#039;IPCAM&#039;&#039; werden im Folgenden aufgeführt, die komplette Liste findet sich in der commandref (siehe Infobox).&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung ===&lt;br /&gt;
;basicauth&lt;br /&gt;
:Hinterlegung von Benutzernamen und Passwort &lt;br /&gt;
&lt;br /&gt;
=== Eigene Befehle ===&lt;br /&gt;
;cmd01, cmd02, ... cmd15&lt;br /&gt;
:Festlegung von Befehlen, die nicht zu den vordefinierten gehören, z.B. &amp;lt;code&amp;gt;attr ipcam cmd01 led_mode=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vordefinierte Befehle ===&lt;br /&gt;
;cmdPanLeft, cmdPanRight, cmdTiltUp, cmdTiltDown, cmdStep &lt;br /&gt;
:Diesen Befehlen können die Kameraspezifischen Werte zugeordnet werden, z.B. &amp;lt;code&amp;gt;attr ipcam cmdTiltUp command=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfade ===&lt;br /&gt;
;path&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Netzwerkkameras ==&lt;br /&gt;
{{Randnotiz|RNText=Die Aufzählungen der unterstützten und der problematischen Netzwerkkameras sollten ergänzt werden, sobald neue Erkenntnisse vorliegen; beide Listen sind nicht vollständig.}}&lt;br /&gt;
Bei den folgenden Netzwerkkameras ist gesichert, dass sie durch das &#039;&#039;IPCAM&#039;&#039; Modul unterstützt sind:&lt;br /&gt;
* {{Link2Forum|Topic=33347|Message=257115|LinkText=Foscam 9805W}}&lt;br /&gt;
* Foscam FI9831P&lt;br /&gt;
* {{Link2Forum|Topic=13826|LinkText=Instar 2905}}&lt;br /&gt;
* {{Link2Forum|Topic=36201|LinkText=IN-6001HD}}&lt;br /&gt;
* {{Link2Forum|Topic=11664|LinkText=Instar 6011, 6012, 2905}}&lt;br /&gt;
* {{Link2Forum|Topic=58676|LinkText=Instar IN-5905HD, IN-5907HD, IN-6014HD, IN-6012HD-PoE}}&lt;br /&gt;
* {{Link2Forum|Topic=15217|LinkText=WansView (Modell nicht näher spezifiziert)}}&lt;br /&gt;
* {{Link2Forum|Topic=11664|Message=158052|LinkText=Wansview 620, 625, 6012}}&lt;br /&gt;
* Axis 205&lt;br /&gt;
* D-Link DCS-933&lt;br /&gt;
&lt;br /&gt;
Nicht gesichert, ob die Kamera unterstützt wird bzw. ob alle Funktionen nutzbar sind:&lt;br /&gt;
* {{Link2Forum|Topic=33347|LinkText=Foscam FI9831W}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für Axis 205 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Cam1 path /jpg/image.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für D-Link DCS-933 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Cam1 path image.jpg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameter für Hikvision DS-2CD2032-I ===&lt;br /&gt;
Mit folgenden Parameter wurde (lt. diesem {{Link2Forum|Topic=39932|Message=322269|LinkText=Forenbeitrag}}) die Hikvision DS-2CD2032-I erfolgreich betrieben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Cam1 IPCAM 192.168.xxx.xxx&lt;br /&gt;
attr Cam1 basicauth &amp;lt;username&amp;gt;:&amp;lt;passwort&amp;gt;&lt;br /&gt;
attr Cam1 delay 0&lt;br /&gt;
attr Cam1 group Kamera&lt;br /&gt;
attr Cam1 icon it_camera&lt;br /&gt;
attr Cam1 path Streaming/channels/1/picture?snapShotImageType=JPEG&lt;br /&gt;
attr Cam1 snapshots 1&lt;br /&gt;
attr Cam1 storage /opt/fhem/www/snapshots/cam1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für Foscam FI9831P ===&lt;br /&gt;
Die Version ist ohne basicauth und hat Nutzer und Passwort direkt in der URL. Kann natürlich geändert werden.&lt;br /&gt;
Sämtliche Befehle für die Foscam HD Kameras findet man [https://www.manualslib.com/manual/728928/Foscam-Ip-Camera.html hier]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define IPKamera IPCAM &amp;lt;ip&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
attr IPKamera cmd01 cmd=ptzStopRun&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdPanLeft cmd=ptzMoveLeft&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdPanRight cmd=ptzMoveRight&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdPos01 cmd=ptzGotoPresetPoint&amp;amp;name=&amp;lt;Nameposition&amp;gt;&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdTiltDown cmd=ptzMoveDown&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdTiltUp cmd=ptzMoveUp&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera path cgi-bin/CGIProxy.fcgi?usr=xxx&amp;amp;pwd=xxx&amp;amp;cmd=snapPicture2&lt;br /&gt;
attr IPKamera pathCmd cgi-bin/CGIProxy.fcgi&lt;br /&gt;
attr IPKamera pathPanTilt cgi-bin/CGIProxy.fcgi?usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera storage ./www/images/webcam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nicht unterstützte Netzwerkkameras ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die hier aufgeführten Netzwerkkameras sind definitiv nicht unterstützt oder es gibt gravierende, hier beschriebene Einschränkungen.}}&lt;br /&gt;
;TRENDnet TV-IP320PI &lt;br /&gt;
:Aufruf der Funktion &amp;lt;code&amp;gt;get &#039;&#039;myCam&#039;&#039; image&amp;lt;/code&amp;gt; führt zur Fehlermeldung &#039;&#039;...invalid Format&#039;&#039;; auf Kamerabild oder Stream kann jedoch über die URL camHostnameOrIP/Streaming/channels/1/Picture (Bild) bzw. camHostnameOrIP/Streaming/channels/1/httpPreview (Stream) zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
== Generierte Ereignisse ==&lt;br /&gt;
Das Modul &#039;&#039;IPCAM&#039;&#039; generiert die Ereignisse &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;last: &amp;lt;name_of_device&amp;gt;_snapshot.&amp;lt;image_extension&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;snapshots: &amp;lt;total_number_of_taken_snapshots_at_end&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Derzeit (08/2015) ist das Logging aus dem Modul zumindest lückenhaft und verbesserungsfähig. So sollten z.B. einige weitere Meldungen zur Fehlereingrenzung bei der Einrichtung eines IPCAM Objekts eingefügt werden:&lt;br /&gt;
* Ausgabe des kompletten Pfads / der URL, die bei der Erzeugung eines Snapshots aus einzelnen Bestandteilen zusammengesetzt wird&lt;br /&gt;
* Die Zuordnung von Meldungen zu &#039;&#039;verbose&#039;&#039;-Leveln sollte kontrolliert und ggf. umgestellt werden&lt;br /&gt;
* siehe auch diesen {{Link2Forum|Topic=39932|LinkText=Forenthread}}, der Beschreibung von Problemen, eine Hikvision IPCam in Betrieb zu nehmen&lt;br /&gt;
&lt;br /&gt;
Außerdem müsste das Modul dringend auf die aktuelle Form des Logging, [[verbose|verbose/Log3]], umgestellt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung für das Problem &amp;quot;Wrong or not supported image format: unknown&amp;quot; habe ich hier beschrieben: {{Link2Forum|Topic=10772|Message=425265|LinkText=Forenbeitrag}}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Forenthread zur {{Link2Forum|Topic=10772|LinkText=Erweiterung des IPCAM Moduls}}&lt;br /&gt;
* Forenthread zum Thema {{Link2Forum|Topic=21005|LinkText=Bewegungserkennung}}&lt;br /&gt;
* Forenthread zum Thema {{Link2Forum|Topic=30723|LinkText=Bewegungsmelder der Kamera &amp;quot;anzapfen&amp;quot;}}&lt;br /&gt;
* Webseite des Modulautors zum Thema [http://www.fischer-net.de/hausautomation/videoueberwachung.html Videoüberwachung]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Telnet&amp;diff=21857</id>
		<title>Telnet</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Telnet&amp;diff=21857"/>
		<updated>2017-07-25T18:40:31Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Kategorie hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mittels [[Telnet]] kann man eine Verbindung zu FHEM herstellen und alles eingeben, was man auch über die Weboberfläche eingeben kann. Um mittels eines Debian-Systems eine Telnet-Verbindung aufzubauen muss man wie folgt vorgehen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verbindung herstellen =&lt;br /&gt;
#Telnet muss installiert sein. Sollte dies nicht der Fall sein, kann es mit folgendem Befehl installiert werden &amp;lt;source&amp;gt;sudo apt-get install telnet&amp;lt;/source&amp;gt;&lt;br /&gt;
#Die Verbindung wird dann mit dem Befehl &#039;&#039;Telnet&#039;&#039; hergestellt. Dazu muss noch die &#039;&#039;Zieladresse&#039;&#039;, &#039;&#039;Port&#039;&#039; und gegebenenfalls &#039;&#039;User&#039;&#039; mitangeben werden:&amp;lt;source&amp;gt;Telnet 127.0.0.1 7072 &amp;lt;-l user&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der User ist hier in &amp;lt;&amp;gt; gesetzt, da er optional ist bzw. davon abhängig, ob im Telnet Device von FHEM ein User und Passwort vergeben wurden. Gleiches gilt für den Port. Der Standardport ist 7072. Die hier gewählte IP Adresse 127.0.0.1 ist die IP des Geräts von welchem wir die Verbindung aufbauen. Sollte man zB mittels Putty auf einem PI verbunden sein und auf diesem Telnet laufen, so gibt man dies IP an. Befindet sich FHEM auf einem anderen Gerät, so muss die IP dieses Geräts angegeben werden. &lt;br /&gt;
&lt;br /&gt;
= Befehle absetzen =&lt;br /&gt;
Nun sind wir mit FHEM verbunden und können die Befehle eingeben wie z.B. &#039;&#039;set Test on&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
= Verbindung beenden =&lt;br /&gt;
Verlassen können wir die Verbindung wieder, in dem wir &#039;&#039;exit&#039;&#039; eingeben. Mittels &#039;&#039;help&#039;&#039; werden uns die Möglichen Befehle angezeigt.&lt;br /&gt;
&lt;br /&gt;
= Weitere Informationen =&lt;br /&gt;
Interessant ist auch die Ausgabe des [[Event monitor]] mittels der Console. Mehr dazu im Artikel des Monitors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Telnet&amp;diff=21856</id>
		<title>Telnet</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Telnet&amp;diff=21856"/>
		<updated>2017-07-25T18:39:35Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Erstellung des Artikels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mittels [[Telnet]] kann man eine Verbindung zu FHEM herstellen und alles eingeben, was man auch über die Weboberfläche eingeben kann. Um mittels eines Debian-Systems eine Telnet-Verbindung aufzubauen muss man wie folgt vorgehen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verbindung herstellen =&lt;br /&gt;
#Telnet muss installiert sein. Sollte dies nicht der Fall sein, kann es mit folgendem Befehl installiert werden &amp;lt;source&amp;gt;sudo apt-get install telnet&amp;lt;/source&amp;gt;&lt;br /&gt;
#Die Verbindung wird dann mit dem Befehl &#039;&#039;Telnet&#039;&#039; hergestellt. Dazu muss noch die &#039;&#039;Zieladresse&#039;&#039;, &#039;&#039;Port&#039;&#039; und gegebenenfalls &#039;&#039;User&#039;&#039; mitangeben werden:&amp;lt;source&amp;gt;Telnet 127.0.0.1 7072 &amp;lt;-l user&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der User ist hier in &amp;lt;&amp;gt; gesetzt, da er optional ist bzw. davon abhängig, ob im Telnet Device von FHEM ein User und Passwort vergeben wurden. Gleiches gilt für den Port. Der Standardport ist 7072. Die hier gewählte IP Adresse 127.0.0.1 ist die IP des Geräts von welchem wir die Verbindung aufbauen. Sollte man zB mittels Putty auf einem PI verbunden sein und auf diesem Telnet laufen, so gibt man dies IP an. Befindet sich FHEM auf einem anderen Gerät, so muss die IP dieses Geräts angegeben werden. &lt;br /&gt;
&lt;br /&gt;
= Befehle absetzen =&lt;br /&gt;
Nun sind wir mit FHEM verbunden und können die Befehle eingeben wie z.B. &#039;&#039;set Test on&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
= Verbindung beenden =&lt;br /&gt;
Verlassen können wir die Verbindung wieder, in dem wir &#039;&#039;exit&#039;&#039; eingeben. Mittels &#039;&#039;help&#039;&#039; werden uns die Möglichen Befehle angezeigt.&lt;br /&gt;
&lt;br /&gt;
= Weitere Informationen =&lt;br /&gt;
Interessant ist auch die Ausgabe des [[Event monitor]] mittels der Console. Mehr dazu im Artikel des Monitors.&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=21841</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=21841"/>
		<updated>2017-07-22T21:30:32Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Den Entpacken Befehl hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Alexa-Fhem&#039;&#039;&#039; ist eine in JavaScript geschriebene und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im {{Link2Forum|Topic=60244|LinkText=Forum}} veröffentlicht.&lt;br /&gt;
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModTechName=&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModOwner=justme1968&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
===Glossar===&lt;br /&gt;
*Echo bzw. Echo Dot (im Folgenden maskulin bezeichnet) sind die derzeit verfügbaren Geräte des Alexa-Systems &#039;&#039;&#039;BILDER EINSTELLEN - Achtung Urheberrecht&#039;&#039;&#039;&lt;br /&gt;
*AVS ist der Amazon Voice Service, d.h. die Spracherkennungskomponente des Systems.{{Randnotiz|RNTyp=r|RNText=Für die Nutzung der Amazon AWS-Dienste müssen zwingend die Daten einer Kreditkarte angegeben werden. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen. Die Autoren dieser Anleitung und der darin beschriebenen Module übernehmen keine Haftung für eventuelle Kosten, die aus der Nutzung der AWS entstehen. }}&lt;br /&gt;
*AWS sind die Amazon Web Services, also per URL erreichbare Dienste zur Ausführung von Berechnungen etc. Im Rahmen von Alexa-Fhem wird bei AWS eine eigene JavaScript-Funktion hinterlegt, die zur Kommunikation mit dem FHEM-Server dient. Im Jargon von Amazon ist dies eine so genannte Lambda-Funktion &#039;&#039;&#039;WARUM ? Nachlesen bei Amazon&#039;&#039;&#039;.&lt;br /&gt;
*Card bezeichnet einen Eintrag in der Alexa-App, der die erkannte Sprachnachricht sowie weiter gehenden Informationen über die Reaktion von Alexa enzthält und Rückmeldung an Amazon erlaubt.&lt;br /&gt;
*Skill (engl. für Fähigkeit) ist die Bezeichnung für eine per Spracherkennung bediente Funktionalität des Alexa-Systems, z.B. zur Nachrichtenansage, zur Wettervorhersage oder zur Steuerung von FHEM&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
[[Datei:2gpXyLN.jpg|200px|thumb|right|Grafische Darstellung der beteiligten Komponenten]]&lt;br /&gt;
Echo -&amp;gt; AVS -&amp;gt; AWS Lambda -&amp;gt; alexa-fhem -&amp;gt; AWS Lambda -&amp;gt; AVS -&amp;gt; Echo&lt;br /&gt;
 &lt;br /&gt;
*Der Echo (oder ein anderes Alexa/AVS fähiges Gerät)  nimmt Audiodaten auf und schickt diese an AVS  (Amazon Voice Service) zur Erkennung&lt;br /&gt;
*AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den erkannten Daten&lt;br /&gt;
:*Beim Alexa SmartHome Skill sind die möglichen Sätze für die Spracherkennung relativ fest vorgegeben &lt;br /&gt;
:*Beim Alexa Custom Skill kommen die dazu nötigen Informationen aus dem &#039;&#039;Interaction Model&#039;&#039; der Alexa Skills Configuration&lt;br /&gt;
*Das Event wird an den unter &#039;&#039;Configuration&#039;&#039; in der Alexa Skills Configuration hinterlegten Endpoint geschickt&lt;br /&gt;
:*Beim Alexa SmartHome Skill ist das zwingend eine AWS Lambda Routine&lt;br /&gt;
:*Beim Alexa Custom Skill kann das im Prinzip auch ein eigener Web Service sein&lt;br /&gt;
*Das Event wird vom &amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; code an alexa-fhem weitergeleitet&lt;br /&gt;
*alexa-fhem steuert FHEM und sendet ein Antwort-Event zurück&lt;br /&gt;
*&amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; nimmt diese Antwort entgegen und gibt sie an AVS zurück&lt;br /&gt;
*AVS sogt dafür das der Echo &#039;antwortet&#039; und dass die Card in der Alexa App erscheint&lt;br /&gt;
&lt;br /&gt;
===Anmerkungen===&lt;br /&gt;
*Ein Skill hat keinen Zugriff auf die Audiodaten&lt;br /&gt;
*Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und &#039;einfach&#039; Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.&lt;br /&gt;
*Wenn man berücksichtigt welchen Weg die Daten insgesamt gehen, ist es erstaunlich, wie schnell die Reaktion auf einen gesprochenen Satz erfolgt.&lt;br /&gt;
&lt;br /&gt;
=== Abgrenzung des &#039;&#039;&#039;Alexa Smart Home Skills&#039;&#039;&#039; und des &#039;&#039;&#039;Alexa Custom Skills&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Smart_Home|Alexa Smart Home Skill]] ist ein Amazon-Alexa-Standard-Skill, der wesentliche Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein &amp;quot;Alexa, schalte die Wohnzimmerlampe an&amp;quot; um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik &amp;quot;Smart Home&amp;quot; als Skill angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Custom|Alexa Custom Skill]] ist kein Standard-Smart-Home-Skill, sondern ein individuell entwickelter Skill, so wie alle anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik &amp;quot;Smart Home&amp;quot; angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. &amp;quot;Alexa, starte [Name des Skills]&amp;quot;) oder direkt angesprochen wird (z.B. &amp;quot;Alexa, frage [Name des Skills] wie ist der Status von [Device] &amp;quot;). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch werden anspruchsvollere Steuerungsmöglichkeiten nur mit diesem realisiert werden können.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Da die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Während der Konfiguration sollten alle nachfolgenden Abschnitte parallel in gleichzeitig geöffneten Browserfenstern durchgeführt werden, die jeweils bis zum Abschluss geöffnet bleiben müssen. }}&lt;br /&gt;
Grundvoraussetzung für alle folgenden Schritte ist das Vorhandensein eines Amazon-Accounts. Es wird davon ausgegangen, dass die Konten für alle im Folgenden genutzten Amazon-Dienste eingerichtet wurden.&lt;br /&gt;
&lt;br /&gt;
===node.js installieren===&lt;br /&gt;
Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get install build-essential libssl-dev&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss NodeJS installiert werden. Leider ist die Version im Debian Repository deutlich zu alt, daher wird mit den folgenden Befehlen das Node Repository hinzugefügt und NodeJS (in der LTS Version) entsprechend installiert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem installieren ===&lt;br /&gt;
&#039;&#039;&#039;Aus gegebenem Anlass: Dies ist weder eine Einführung in Linux, noch eine Anfängerdokumentation für FHEM.&#039;&#039;&#039; Also erst die Grundlagen lernen, und dann mit Alexa beginnen !&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Version ist jeweils  {{Link2Forum|Topic=60244|Message=540117|LinkText=hier}} zu finden.&lt;br /&gt;
&lt;br /&gt;
====Erstinstallation====&lt;br /&gt;
Hier wird die Erstinstallation von Alexa-Fhem beschrieben.&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Die tgz-Datei unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;tar -xvzf dateiname.tgz&amp;lt;/source&amp;gt;&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;mv package alexa-fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
# Durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/source&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/source&amp;gt; (kein sudo!). Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Home-Verzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; Insbesondere ist zu beachten, dass dieser Nutzer u.U. im Startskript explizit gesetzt wird. Mit dem untenstehenden Skript ist das &#039;&#039;nicht&#039;&#039; der User fhem, sondern der User &#039;&#039;pi&#039;&#039;. Das Symbol &#039;&#039;~/&#039;&#039; verweist auf das Home-Verzeichnis des Benutzers, der gerade die Installation vornimmt.&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;.alexa/config.json&#039;&#039; kopieren. Achtung: Installiert man alexa-fhem als root-user, zeigt das Symbol &#039;&#039;~/&#039;&#039; auf &#039;&#039;/root&#039;&#039; - und die Konfigurationsdatei wird ggf. bei einem manuellen Start von Alexa-Fhem nicht gefunden.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis kopiert werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
&#039;&#039;Vor&#039;&#039; der Installation von Alexa-Fhem muss man folgende Anwendungen installieren:&lt;br /&gt;
* Node.js (die aktuelle Version findet man unter https://nodejs.org/en/download/)&lt;br /&gt;
* OpenSSL (http://slproweb.com/products/Win32OpenSSL.html oder https://www.heise.de/download/product/win32-openssl-47316/download)&lt;br /&gt;
Erst dann fängt man mit Alexa-Fhem an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Die tgz-Datei im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/source&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren.&amp;lt;br/&amp;gt; Bei der Felermedlung wie &amp;quot;Der Befehl &amp;quot;npm&amp;quot; ist entweder falsch geschrieben oder konnte nicht gefunden werden.&amp;quot; ist die Installation von Node.js zu überprüfen.&lt;br /&gt;
# SSL Zertifikat erzeugen. Dafür muss man alle Befehle aus dem Skript &#039;&#039;createKey.sh&#039;&#039; nacheinander manuell ausführen. Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken. Der Windows-Welt unbekannter Befehl &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt; ist durch &amp;lt;code&amp;gt;move /y&amp;lt;/code&amp;gt; zu ersetzen:&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365&amp;lt;/source&amp;gt;&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;openssl rsa -in key.pem -out newkey.pem&amp;lt;/source&amp;gt;&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;move /y newkey.pem key.pem&amp;lt;/source&amp;gt; Eventuelle Fehlermeldung &amp;quot;can&#039;t open config file: /usr/local/ssl/openssl.cnf&amp;quot; o.Ä. lässt sich durch Befehl &amp;lt;code&amp;gt;set OPENSSL_CONF=&amp;lt;OpenSSL-Verzeichnis&amp;gt;\bin\openssl.cfg&amp;lt;/code&amp;gt; beheben, wobei &amp;lt;OpenSSL-Verzeichnis&amp;gt; durch den entsprechenden Installationspfad (typischerweise &amp;lt;code&amp;gt;c:\OpenSSL-Win32&amp;lt;/code&amp;gt;) zu ersetzen ist.&lt;br /&gt;
# Das Verzeichnis &#039;&#039;.alexa&#039;&#039; anlegen, &#039;&#039;und zwar im Benutzerverzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.&#039;&#039; In aktuellen Versionen von Windows (ab Windows 7 bzw. ab Windows Server 2008 R2) liegt das Verzeichnis unter &amp;lt;code&amp;gt;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;lt;/code&amp;gt;, also z.B. für Benutzer &amp;quot;Administrator&amp;quot; - unter &amp;lt;code&amp;gt;C:\Users\Administrator&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;Falls Windows sich weigert das Verzichniss mit dem Punkt am Anfang zu erstellen, kann man das aus der Kommandozeile machen:&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;C:\Users\&amp;lt;Benutzername&amp;gt;&amp;quot;&amp;lt;/source&amp;gt;&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
mkdir &amp;quot;.alexa&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;C:\Users\&amp;lt;Benutzername&amp;gt;\.alexa\config.json&#039;&#039; kopieren.&lt;br /&gt;
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;lt;/code&amp;gt;) kopiert werden.&lt;br /&gt;
&lt;br /&gt;
====Update====&lt;br /&gt;
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben&lt;br /&gt;
===== Linux =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt;) entpacken (&#039;&#039;nicht&#039;&#039; unter Windows, das zerstört die Rechteeinstellungen).&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen, in das Verzeichnis wechseln&lt;br /&gt;
# Mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren (kein sudo!).&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
===== Windows =====&lt;br /&gt;
# Das Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; im Hauptverzeichnis von FHEM (z.B. &amp;lt;code&amp;gt;С:\Program Files (x86)\fhem&amp;lt;/code&amp;gt;) umbenennen in &#039;&#039;alexa-fhem.old&#039;&#039;.&lt;br /&gt;
# Die tgz-Datei der neuen Alexa-Fhem-Version im Hauptverzeichnis von FHEM entpacken.&lt;br /&gt;
# Das dabei entstandene Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. &amp;quot;Start&amp;quot; -&amp;gt; &amp;quot;Ausführen&amp;quot; (oder [Windows-Taste]+[R]) -&amp;gt; cmd -&amp;gt; Ok. Durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem&amp;quot;&amp;lt;/source&amp;gt; in das Verzeichnis wechseln. &amp;lt;br/&amp;gt;Dabei ist natürlich das &amp;lt;FHEM-Hauptverzeichis&amp;gt; durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es &amp;lt;code&amp;gt;cd &amp;quot;С:\Program Files (x86)\fhem\alexa-fhem&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren.&lt;br /&gt;
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; ins neue Verzeichnis &#039;&#039;alexa-fhem&#039;&#039; kopieren.&lt;br /&gt;
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis &#039;&#039;alexa-fhem.old&#039;&#039; gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem konfigurieren ====&lt;br /&gt;
Der Inhalt der Datei &#039;&#039;~/.alexa/config.json&#039;&#039; muss an die eigene Umgebung angepasst werden. &lt;br /&gt;
# &#039;&#039;nat-pmp&#039;&#039; -&amp;gt; wenn nat-pmp verwendet werden soll: die ip des eigenen routers,&lt;br /&gt;
# &#039;&#039;nat-upnp&#039;&#039; -&amp;gt; wenn nat-upnp verwendet werden soll: &#039;&#039;true&#039;&#039;,&lt;br /&gt;
# &#039;&#039;applicationId&#039;&#039; &lt;br /&gt;
#:* Wenn man nur den SmartHome-Skill verwenden möchte, kann dieser Eintrag leer bleiben.&lt;br /&gt;
#:* Ansonsten ist er mit der SkillID des Alexa Custom Skills zu belegen, siehe Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]]&lt;br /&gt;
# &#039;&#039;oauthClientID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; dem Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
# &#039;&#039;server&#039;&#039; -&amp;gt; IP-Adresse des eigenen FHEM-Servers&lt;br /&gt;
# &#039;&#039;port&#039;&#039; -&amp;gt; Portnummer des eigenen FHEM-Servers&lt;br /&gt;
Beispiel:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;alexa&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Alexa TEST&amp;quot;,&lt;br /&gt;
        &amp;quot;keyFile&amp;quot;: &amp;quot;./key.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;certFile&amp;quot;: &amp;quot;./cert.pem&amp;quot;,&lt;br /&gt;
        &amp;quot;applicationId&amp;quot;: &amp;quot;amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;,&lt;br /&gt;
        &amp;quot;oauthClientID&amp;quot;: &amp;quot;amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;connections&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;server&amp;quot;: &amp;quot;192.168.0.xxx.xxx&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: &amp;quot;8083&amp;quot;,&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;room=AlexaRoom&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Mehrere Custom Skills lassen sich mit der folgenden Syntax eintragen&lt;br /&gt;
         &amp;quot;applicationId&amp;quot;: [ &amp;quot;amzn1.ask.skill.1&amp;quot; , &amp;quot;amzn1.ask.skill.2&amp;quot; ],&lt;br /&gt;
         &amp;quot;oauthClientID&amp;quot;: [ &amp;quot;amzn1.application-oa2-client.1&amp;quot; , &amp;quot;amzn1.application-oa2-client.1&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
Danach durch Aufruf von &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/source&amp;gt; den Dienst starten (kein sudo!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unter Windows startet man Alexa-Dienst durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node alexa&amp;lt;/source&amp;gt; aus der &amp;lt;code&amp;gt;alex-fhem/bin&amp;lt;/code&amp;gt; (also erst z.B. durch &amp;lt;code&amp;gt;cd &amp;quot;&amp;lt;FHEM-Hauptverzeichis&amp;gt;\alexa-fhem\bin&amp;quot;&amp;lt;/code&amp;gt; ins richtige Verzeichnis kommen)&lt;br /&gt;
&lt;br /&gt;
Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem aus FHEM heraus starten ====&lt;br /&gt;
Zunächst das Start-up-Skript aus diesem Post herunterladen {{Link2Forum|Topic=60244|Message=517271|LinkText=https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271}} und unter /etc/init.d/alexa speichern.&lt;br /&gt;
&lt;br /&gt;
Das Script geht davon aus, das der alexa-fhem script unter /opt/fhem/alexa-fhem liegt, und die logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Nun folgende Kommandos ausführen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo chmod 755 /etc/init.d/alexa&lt;br /&gt;
sudo update-rc.d alexa defaults&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; den User fhem für die Nutzung von sudo zulassen (&amp;lt;code&amp;gt;sudo nano /etc/sudoers&amp;lt;/code&amp;gt;), z.B. durch Anfügen der nachfolgenden Zeile:&lt;br /&gt;
&amp;lt;code&amp;gt;fhem ALL=(ALL) NOPASSWD: ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.Status dummy&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa dummy&lt;br /&gt;
attr FHEM.Alexa event-on-change-reading state&lt;br /&gt;
attr FHEM.Alexa webCmd status:start:stop:restart&lt;br /&gt;
&lt;br /&gt;
define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq &amp;quot;start&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa start &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;stop&amp;quot;)&lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa stop &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;restart&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa restart &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;status&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa status &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)})&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem als Service (systemd) installieren ====&lt;br /&gt;
Auf neueren Installationen (z.B. RPi Jessie) wird init.d durch systemd ersetzt. Folgend die Anleitung um alexa-fhem als Service zu installieren auf einem Raspberry Pi mit Jessie.&lt;br /&gt;
&lt;br /&gt;
Zunächst einen neuen Benutzer anlegen unter dem alexa-fhem laufen soll, falls man nicht möchtet dass alexa-fhem z.B. mit dem fhem User ausgeführt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd -M --system alexa&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht der Benutzer keine Gruppen, aber man kann den Benutzer auch der Gruppe &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt; hinzufügen (&amp;lt;code&amp;gt;sudo usermod -a -G dialout alexa&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Datei &amp;quot;alexa&amp;quot; unter &amp;lt;code&amp;gt;/etc/default&amp;lt;/code&amp;gt; anlegen&lt;br /&gt;
&lt;br /&gt;
 # Defaults / Konfigurations Optionen für alexa-fhem&lt;br /&gt;
 # Wo findet alexa-fhem die config.json Datei?&lt;br /&gt;
 ALEXA_OPTS=-U /opt/fhem/.alexa&lt;br /&gt;
&lt;br /&gt;
Den Pfad &amp;lt;code&amp;gt;/opt/fhem/.alexa&amp;lt;/code&amp;gt; an die Systemgegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo. Achtung: Natürlich muss der Benutzer auch Zugriff auf das Verzeichnis mit der config als auch das alexa-fhem Verzeichnis haben.&lt;br /&gt;
&lt;br /&gt;
Datei &amp;quot;alexa.service&amp;quot; unter &amp;lt;code&amp;gt;/etc/systemd/system&amp;lt;/code&amp;gt; anlegen:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Node.js Alexa Server &lt;br /&gt;
 After=syslog.target network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=alexa #oder ein anderer Benutzer wie fhem&lt;br /&gt;
 EnvironmentFile=/etc/default/alexa&lt;br /&gt;
 # oder wo auch immer eure alexa-fhem liegt&lt;br /&gt;
 ExecStart=/opt/fhem/alexa-fhem/bin/alexa $ALEXA_OPTS&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=10&lt;br /&gt;
 KillMode=process&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target &lt;br /&gt;
&lt;br /&gt;
Um den Service zu aktiveren und zu starten helfen folgende Befehle:&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable alexa&lt;br /&gt;
 sudo systemctl start alexa&lt;br /&gt;
&lt;br /&gt;
Status abfragen mit&lt;br /&gt;
 sudo systemctl status alexa&lt;br /&gt;
&lt;br /&gt;
Log einsehen?&lt;br /&gt;
 sudo journalctl -u alexa&lt;br /&gt;
&lt;br /&gt;
(mit &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; kann man den follow Modus aktivieren, wie &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;).&lt;br /&gt;
Bei einen reboot startet alexa-fhem jetzt automatisch.&lt;br /&gt;
&lt;br /&gt;
==== Alexa-Fhem testen ====&lt;br /&gt;
Node.Js stellt einen Web-Server am Port 3000 bereit, das oben erzeugte Zertifikat sichert diesen Zugang per SSL ab. Durch Aufruf der Adresse&lt;br /&gt;
&amp;lt;code&amp;gt;https://&amp;lt;IP-Adresse des Servers&amp;gt;:3000&amp;lt;/code&amp;gt; kann man testen, ob der Alexa-Fhem Service läuft - der Seitenaufruf liefert eine Zeile JSON-Code, beginnend mit&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;header&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;UnsupportedOperationError&amp;quot;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Device anlegen ===&lt;br /&gt;
&lt;br /&gt;
Das Modul 39_alexa.pm stellt innerhalb von FHEM verschiedene Attribute z.B. alexaName oder alexaRoom zur Verfügung. Manche dieser Attribute (wie z.b. alexaName) werden in beiden Skills verwendet, andere werden ausschließlich bei einer Nutzung des Alexa Custom Skill verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Alexa Device geschieht durch die nachfolgende Definition:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skills ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Security Profile anlegen ====&lt;br /&gt;
Die Erzeugung eines Sicherheitsprofils muss nur einmal erfolgen, es wird dann für alle weiteren Skills verwendet.&lt;br /&gt;
# Nach der Anmeldung Auswahl von &#039;&#039;APPS &amp;amp; SERVICES&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend auswählen &#039;&#039;Security Profiles&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-05-apps_and_services_-_security_profiles.png|200px]]&lt;br /&gt;
# Auswählen &#039;&#039;Create a New Security Profile&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-06-apps_and_services_-_create_a_new_security_profile.png|200px]]&lt;br /&gt;
# Dann einen Namen und eine Beschreibung für das Profil eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-07-apps_and_services_-_security_profile_management.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Login with Amazon =====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo &#039;&#039;Client Id&#039;&#039; und &#039;&#039;Client Secret&#039;&#039; zu finden sind}}&lt;br /&gt;
# Oben rechts auf &#039;&#039;Login with Amazon&#039;&#039; klicken.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-08-login_with_amazon.png|200px]]&lt;br /&gt;
# Auf der neu geladenen Seite auswählen &#039;&#039;Sign up&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-09-login_with_amazon_-_sign_up.png|200px]]&lt;br /&gt;
# Anschließend im Dropdown Menü das vorher angelegte Profil auswählen und mit &#039;&#039;Confirm&#039;&#039; bestätigen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-10-login_with_amazon_-_create_new_profile.png|200px]] [[Datei:Developer.amazon.com-11-login_with_amazon_-_create_new_profile2.png|200px]]&lt;br /&gt;
# Im folgenden Fenster die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496] eingeben und mit &#039;&#039;Save&#039;&#039; bestätigen. &#039;&#039;&#039;Todo Erklärungsbedarf: WARUM diese Adresse&#039;&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]&lt;br /&gt;
# Anschließend bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad klicken und &#039;&#039;Web Settings&#039;&#039; auswählen&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]&lt;br /&gt;
# Im neu geladenen Fenster anklicken von &#039;&#039;Edit&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-14-login_with_amazon_-_edit.png|200px]]&lt;br /&gt;
# Anschließend bei &#039;&#039;Allowed Return URLs&#039;&#039; die folgenden drei Adressen eingeben. &#039;&#039;xxx&#039;&#039; muss hierbei durch den Wert ersetzt werden, der in den beiden Abschnitten [[#SmartHome_Skill_anlegen | SmartHome Skill anlegen]] bzw. [[#Custom_Skill_anlegen | Custom Skill anlegen]] jeweils unter Punkt 4 (Seite &#039;&#039;Configuration&#039;&#039;) bei &#039;&#039;Redirect Urls&#039;&#039; am Ende der URLs angezeigt wird&lt;br /&gt;
## [https://layla.amazon.co.uk/api/skill/link/xxx https://layla.amazon.co.uk/api/skill/link/xxx]&lt;br /&gt;
## [https://pitangui.amazon.com/api/skill/link/xxx https://pitangui.amazon.com/api/skill/link/xxx]&lt;br /&gt;
## [https://layla.amazon.com/api/skill/link/xxx https://layla.amazon.com/api/skill/link/xxx]&lt;br /&gt;
.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-15-login_with_amazon_-_allowed_return_urls.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Skills bearbeiten ====&lt;br /&gt;
# Im Menü den Punkt &#039;&#039;ALEXA&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Anschließend im Feld &#039;&#039;Alexa Skills Kit&#039;&#039; auf &#039;&#039;Get started&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== SmartHome Skill anlegen =====&lt;br /&gt;
# Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&lt;br /&gt;
# Auf der folgenden Seite eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
#:* &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;SmartHome Skill API&#039;&#039; &lt;br /&gt;
#:* &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Basic&amp;quot;)&lt;br /&gt;
#:* &#039;&#039;Payload Version&#039;&#039; -&amp;gt; &#039;&#039;v2 (other devices)&#039;&#039; &amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-19-alexa_-_alex_skills_kit_-_skill_information.png|200px]]&lt;br /&gt;
# Die folgende Seite einfach mit &#039;&#039;Next&#039;&#039; überspringen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-20-alexa_-_alex_skills_kit_-_interaction_model.png|200px]]&lt;br /&gt;
# Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben:&lt;br /&gt;
#:* &#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; ist vorausgewählt und kann nicht geändert werden.&lt;br /&gt;
#:* &#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld die ARN aus Abschnitt [[#ARN_der_AWS_Lambda_Funktion_bestimmen | AWS Lambda Funktion]] eintragen. &lt;br /&gt;
#:* &#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt;    (wörtlich 1:1 eintragen)&lt;br /&gt;
#:* &#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&lt;br /&gt;
#:* &#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&lt;br /&gt;
#:* &#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&lt;br /&gt;
#:* &#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&lt;br /&gt;
#:* &#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&lt;br /&gt;
#:* &#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-21-alexa_-_alex_skills_kit_-_configuration.png|200px]] [[Datei:Developer.amazon.com-22-alexa_-_alex_skills_kit_-_test.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Custom Skill anlegen =====&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Oben rechts &#039;&#039;Add a New Skill&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Auf der folgenden Seite (&#039;&#039;Skill Information&#039;&#039;) die nachstehenden Daten eingeben und dann mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Skill Type&#039;&#039; -&amp;gt; &#039;&#039;Custom Interaction Model&#039;&#039; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Language&#039;&#039; -&amp;gt; &#039;&#039;German&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Name&#039;&#039; -&amp;gt; beliebiger Name, z.B. &amp;quot;MySmartHome Advanced&amp;quot;. Dieser wird in der Alexa App unter &amp;quot;Meine Skills&amp;quot; angezeigt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;Invocation Name&#039;&#039; -&amp;gt; Aufruf des Skills, unter dem dieser später gestartet wird. Z.B. &amp;quot;Alexa, starte James&amp;quot;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_2.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Interaction Model&#039;&#039; folgende Eingaben tätigen und mit &#039;&#039;Next&#039;&#039; abschließen&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In einem separaten Browserfenster FHEM aufrufen, und für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen. Es erscheint ein Popup-Fenster mit ziemlich vielen Zeilen.&lt;br /&gt;
&amp;lt;li&amp;gt;In die Box &#039;&#039;Intent Schema&#039;&#039; kopiert man den ersten Teil dieser FHEM-Ausgabe hinein, also:&amp;lt;br/&amp;gt;&amp;lt;blockquote&amp;gt;&lt;br /&gt;
 { &lt;br /&gt;
   &amp;quot;intents&amp;quot; : [ &lt;br /&gt;
    &amp;lt;hier ziemlich viele Zeilen&amp;gt;  &lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Nun die &#039;&#039;Custom Slot Types&#039;&#039; einrichten. Dazu muss aus dem zweiten Teil der FHEM-Ausgabe jeweils der Slot-Type (z.B. &amp;lt;code&amp;gt;FHEM_article&amp;lt;/code&amp;gt;) in das Feld &#039;&#039;TYPE&#039;&#039; eingetragen werden, das nach dem Anklicken von &#039;&#039;Add Slot Type&#039;&#039; erscheint. In das darunter liegende größere Textfeld kommen die möglichen Werte für diesen Slot, so wie sie aus der FHEM-Ausgabe abzulesen sind. Dann mit &#039;&#039;Save&#039;&#039; sichern. Als Custom Slot Type erscheint dann für diesen Beispiel-Slot&lt;br /&gt;
 FHEM_article 	der | die | das | den&lt;br /&gt;
d.h., die Zeilenumbrüche bei den möglichen Werten werden als &amp;quot;|&amp;quot; dargestellt.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hier muss nun ein Bruch im Arbeitsfluss durchgeführt werden, denn bei der Erstellung des Custom Skills kommt es auf die Reihenfolge der Einträge an. Deshalb zunächst diese FHEM-Ausgabe schließen, und für dasselbe FHEM-Device &amp;lt;code&amp;gt;get MyAlexa customSlotTypes&amp;lt;/code&amp;gt; ausführen. Auch diese Ausgabe wird, wie oben beschriebeen, in Custom Slot Types eingetragen (erst der TYPE, dann die möglichen Werte)&lt;br /&gt;
&amp;lt;li&amp;gt;Anschließend erneut die FHEM-Ausgabe schließen und erneut  für das bereits definierte Alexa-Gerät das Kommando &amp;lt;code&amp;gt;get MyAlexa interactionModel&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
&amp;lt;li&amp;gt;Unter &#039;&#039;Sample Utterances&#039;&#039; nun den Text aus dem dritten Teil dieser FHEM-Ausgabe hineinkopieren&amp;lt;br /&amp;gt;[[Datei:CustomSkill_5.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Auf der Seite &#039;&#039;Configuration&#039;&#039; Folgendes eingeben und mit &#039;&#039;Next&#039;&#039; bestätigen:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; &#039;&#039;AWS Lambda&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Geographical Region&#039;&#039; -&amp;gt; &#039;&#039;Europe&#039;&#039; auswählen und im Textfeld den Wert aus Abschnitt [[#AWS_Lambda_Funktion_anlegen | AWS Lambda Funktion anlegen]] (Punkt 12) eintragen. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Do you allow users to create an account or link to an existing account with you?&#039;&#039; -&amp;gt; &#039;&#039;Yes&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client ID&#039;&#039; -&amp;gt; &#039;&#039;Client ID&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Scope&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;profile:user_id&amp;lt;/code&amp;gt; (wörtlich 1:1 eintragen)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Redirect URLs&#039;&#039; - sollten vorbelegt sein&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Authorization Grant Type&#039;&#039; -&amp;gt; &#039;&#039;Auth Code Grant&#039;&#039; auswählen&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Access Token URI&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Client Authentication Scheme&#039;&#039; -&amp;gt; &#039;&#039;HTTP Basic&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;Privacy Policy URL&#039;&#039; -&amp;gt; &amp;lt;code&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Beim Sichern dieser Seite mit &#039;&#039;Next&#039;&#039; kann es zu einer Fehlermeldung kommen, wenn man seine Skill-Definitionen mit dem einfachen SmartHome-Skill begonnen hat. Deshalb muss noch der entsprechende Trigger für die [[#AWS_Lambda-Funktion | AWS Lambda Funktion]] nachgetragen werden, dies wird in Abschnitt [[#Trigger_f.C3.BCr_Custom_Skill_hinzuf.C3.BCgen | Trigger für Custom Skill hinzufügen]] beschrieben.&lt;br /&gt;
&amp;lt;br /&amp;gt;[[Datei:CustomSkill_6.PNG|400px]] [[Datei:CustomSkill_7.PNG|400px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Testen ====&lt;br /&gt;
Hat man den Custom Skill angelegt, bietet dieser auch eine komfortable Testmöglichkeit. Dazu wählt man in der Übersichtsseite &#039;&#039;All Skills&#039;&#039; den Button &#039;&#039;Edit&#039;&#039; des Alexa Custom Skill aus. Auf der nachfolgenden Seite dann links &#039;&#039;Test&#039;&#039;. &lt;br /&gt;
Die Testseite enthält &lt;br /&gt;
* ein Feld &#039;&#039;Voice Simulator&#039;&#039;, mit dem man die Sprachsausgabe testen kann, &lt;br /&gt;
* ein Feld &#039;&#039;Service Simulator&#039;&#039;, mit dem die Verarbeitung von Alexa-Kommandois getestet werden kann. Hier kann man z.B. eintragen&lt;br /&gt;
 &amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Siebenundzwanzig Uhr&amp;quot;&lt;br /&gt;
 &amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
==== Skill Id bestimmen ====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die &#039;&#039;Alexa Skill Id&#039;&#039; zu finden ist}}&lt;br /&gt;
Für das [[#AWS_Lamba_Funktion_anlegen | Anlegen einer &#039;&#039;AWS Lambda Funktion&#039;&#039;]] bzw für die [[#Alexa-Fhem_konfigurieren | Konfiguration von Alexa-Fhem]] wird die &#039;&#039;Alexa Skill Id&#039;&#039; benötigt. An diese kommt man wie folgt:&lt;br /&gt;
# Anmelden wie unter [[#Alexa_Skills | Alexa Skills]] beschrieben.&lt;br /&gt;
# Menüpunkt &#039;&#039;ALEXA&#039;&#039; auswählen, wie [[#Skills_bearbeiten | Skills bearbeiten]] erklärt.&lt;br /&gt;
# Beim gewünschten Eintrag auf &#039;&#039;Edit&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]&lt;br /&gt;
# Die Id, die nun oben angezeigt wird, ist die gesuchte. Sie hat typischerweise das Format &amp;lt;code&amp;gt;amzn1.ask.skill.[Zahlen und Bindestriche]&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AWS Lambda Funktion ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-01-site.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-02-login.png|200px]]&lt;br /&gt;
# Den Punkt &#039;&#039;Lambda&#039;&#039; links auf der Startseite auswählen, bzw. im Menü &#039;&#039;Services&#039;&#039; unter &#039;&#039;Compute&#039;&#039; den Menüpunkt &#039;&#039;Lambda&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-03-lambda.png|200px]]&lt;br /&gt;
==== AWS Lambda Funktion anlegen ====&lt;br /&gt;
# Für eine erste Lambda-Funktion den Punkt &#039;&#039;Get Started Now&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]&lt;br /&gt;
# Den Blueprint &#039;&#039;Blank function&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]&lt;br /&gt;
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Smart Home&#039;&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]&lt;br /&gt;
## Achtung, es ist möglich, dass dabei &#039;&#039;Alexa Smart Home&#039;&#039; überhaupt nicht angeboten wird. Dann bitte ganz rechts oben in der Ecke nachsehen, welche Region bzw. welches Land ausgewählt ist. Empfohlen wird, &#039;&#039;Ireland&#039;&#039; auszuwählen. Dann erscheint bei den Funktionen auch &#039;&#039;Alexa Smart Home&#039;&#039;.&lt;br /&gt;
# Bei &#039;&#039;Application Id&#039;&#039; den Wert eintragen, dessen Ermittlung im Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]] beschrieben wird, den Haken bei &#039;&#039;Enable trigger&#039;&#039; setzen und mit &#039;&#039;Next&#039;&#039; bestätigen &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]&lt;br /&gt;
# Auf der Konfigurationsseite eingeben:&lt;br /&gt;
## &#039;&#039;Name&#039;&#039; -&amp;gt; &#039;&#039;FHEM&#039;&#039;&lt;br /&gt;
## &#039;&#039;Runtime&#039;&#039; -&amp;gt; Node.js 4.3. &lt;br /&gt;
## &#039;&#039;Role&#039;&#039; -&amp;gt; &#039;&#039;Choose an existing role&#039;&#039; &lt;br /&gt;
### Achtung: wenn es noch keine existing role gibt, zuerst &#039;&#039;Create a custom role&#039;&#039; -&amp;gt; in dem Popup dann &#039;&#039;lambda_basic_execution&#039;&#039; auswählen und auf &#039;&#039;Allow&#039;&#039; klicken sowie bei &#039;&#039;Existing role&#039;&#039; dann &#039;&#039;x&#039;&#039; wählen.&lt;br /&gt;
# Auf der Code-Seite wird bzw. im großen Textfeld ist dann der Code aus der Datei &#039;&#039;lambda.js&#039;&#039; im Paket [[#Alexa-Fhem_installieren | Alexa-Fhem]] vollständig einzufügen. Dabei muss noch der Hostname im Quellcode an den eigenen Hostnamen angepasst werden. &lt;br /&gt;
# Anschließend alles mit &#039;&#039;Next&#039;&#039; bestätigen.&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-07-configure_function.png|200px]]&lt;br /&gt;
# Auf der Übersichtsseite dann &#039;&#039;Create function&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-08-review.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Trigger für Custom Skill hinzufügen ====&lt;br /&gt;
Editiert man eine Lambda-Funktion, werden auf der Seite &#039;&#039;Triggers&#039;&#039; diejenigen Dienste angezeigt, die diese Funktion aufrufen.&lt;br /&gt;
* Hier taucht der Trigger &#039;&#039;Alexa Smart Home&#039;&#039; zusammen mit der &#039;&#039;Application Id&#039;&#039; auf, der bei der Einrichtung des SmartHome-Skills eingetragen wurde.&lt;br /&gt;
* Zur Verbindung mit dem Custom Skill ist es nötig, einen zweiten Trigger hinzuzufügen. Durch Anklicken von &#039;&#039;Add Trigger&#039;&#039; wird eine Auswahlseite eingeblendet. Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Skills Kit&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&lt;br /&gt;
&lt;br /&gt;
==== ARN der AWS Lambda Funktion bestimmen ====&lt;br /&gt;
# Auf der Übersichtsseite oben links den Menüpunkt &#039;&#039;Functions&#039;&#039; aúswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-09-go_overview.png|200px]]&lt;br /&gt;
# Anschließend den Radiobutton der angelegten Funktion &#039;&#039;FHEM&#039;&#039; markieren und im Menü &#039;&#039;Action&#039;&#039; den Punkt &#039;&#039;Show ARN&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]&lt;br /&gt;
# Es wird nun eine ARN Adresse angezeigt, die für den Abschnitt [[#SmartHome_Skill_anlegen| SmartHome Skill anlegen]] benötigt wird&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-2-arn.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Absichern des Zugriffs ===&lt;br /&gt;
Natürlich muss der Zugriff auf den von Alexa-Fhem verwendeten Port (default: 3000, Bestandteil des Codes in der AWS Lambda-Funktion) durch die Firewall freigeschaltet werden (auf einer FritzBox unter &amp;quot;Portfreigaben&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== Absicherung direkt in Alexa-FHEM ====&lt;br /&gt;
Die Kommunikation zwischen Amazon AWS und Alexa-FHEM ist auf die folgenden Arten gesichert:&lt;br /&gt;
* Die Verbindung erfolgt per HTTPS&lt;br /&gt;
* Es werden nur Verbindung angenommen auf denen ein gültiges Alexa-Event gesendet wird. &lt;br /&gt;
* Es werden nur Verbindungen angenommen die ein gültiges und noch nicht abgelaufenes OAuth-Token enthalten. Jedes neue Token wird live bei Amazon auf Gültigkeit geprüft.    &lt;br /&gt;
* Es werden nur Verbindungen mit lokal konfigurierter Skill-ID angenommen.&lt;br /&gt;
* Es ist nicht möglich von außen beliebige FHEM Kommandos zu senden. Die FHEM Kommandos werden nur lokal erzeugt.&lt;br /&gt;
&lt;br /&gt;
Wer möchte kann Alexa-FHEM natürlich noch weiter absichern. Es gilt aber, dass nicht jedes zusätzliche Glied in der Kette die Sicherheit sondern unter Umständen nur die Angriffsfläche erhöht. Ein falsch konfigurierter und nach aussen offener Apache (oder anderer ReverseProxy) ist unter Umständen ein größeres Risiko als Alexa-FHEM alleine.&lt;br /&gt;
&lt;br /&gt;
==== Absicherung per ReverseProxy ====&lt;br /&gt;
&amp;lt;s&amp;gt;Die Kommunikation zwischen Amazon und FHEM ist wegen der Verwendung von SSL schon verschlüsselt - prinzipiell kann aber jeder von außen mit Alexa-Fhem kommunizieren. Man sollte sich deshalb im Klaren darüber sein, dass dies eine Sicherheitslücke darstellt:&amp;lt;/s&amp;gt; Jeder offene Port verleitet zu Angriffen, und mit zunehmender Verbreitung von Alexa steigt auch das Risiko. Es wird deshalb empfohlen, vor den eigentlichen Alexa-Server zur Absicherung einen Apache-Webserver als ReverseProxy zu setzen. Nicht nur ist der Apache eine hervorragend stabile und seit Jahrzehnten getestete Software, sondern die Konfiguration als ReverseProxy erlaubt auch, den Zugriff auf den Alexa-Fhem-Rechner auf die Amazon-Maschinen zu beschränken.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung: Dies ist keine allgemeine Anleitung in Sachen Computersicherheit.&#039;&#039;&#039; Im Folgenden gehen wir davon aus, dass &lt;br /&gt;
* Grundbegriffe wie Firewall, IP-Ports, SSL und Dynamic DNS vertraut sind&lt;br /&gt;
* Ein Apache Webserver (idealerweise auf einer zweiten Maschine) bereits installiert ist und die Konfiguration verstanden wurde (wenn nicht: Es gibt im Netz &#039;&#039;tausende&#039;&#039; von Anleitungen dafür...)&lt;br /&gt;
* Ein Servername von einem DynDNS-Anbieter - sagen wir &#039;&#039;myhome.is-my-castle.com&#039;&#039; - bereits von &#039;&#039;außen&#039;&#039; auf unser SmartHome zeigt.&lt;br /&gt;
* Alexa-Fhem in einer der oben beschriebenen Basiskonfigurationen läuft, d.h. der Zugriff auf &amp;lt;code&amp;gt;https://myhome.is-my-castle.com:3000&amp;lt;/code&amp;gt; ergibt, wie im Punkt [[#Alexa-Fhem_testen|Alexa-Fhem testen]] beschrieben, eine Antwort des Node.js Servers.&lt;br /&gt;
&lt;br /&gt;
Als erster Schritt zur Absicherung muss das ReverseProxy Modul für den Apache installiert und mit &amp;lt;code&amp;gt;a2enmod&amp;lt;/code&amp;gt; aktiviert werden, hierzu sei auf [https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension diese Anleitung] verwiesen. Der zweite Schritt besteht darin, den SSL-Zugriff durch ein Passwort abzusichern. Dazu wird auf dem Apache-Rechner das Programm &lt;br /&gt;
 htpasswd &amp;lt;passwdfile&amp;gt; &amp;lt;username&amp;gt;&lt;br /&gt;
ausgeführt, das Programm fragt dann nach dem gewünschten Passwort. Wir nehmen im Folgenden an, dass das Passwortfile &#039;&#039;/etc/apache2/htpasswd&#039;&#039; ist, der gesetzte Username &#039;&#039;alexa&#039;&#039; lautet und das Passwort &#039;&#039;my_smarthome&#039;&#039; ist.&lt;br /&gt;
&lt;br /&gt;
Im dritten Schritt wird nun in das Apache-Konfigurationsfile die Weiterleitung auf den eigentlichen Alexa-Fhem-Rechner eingetragen. Dazu wählen wir, dass von außen der Standard-SSL-Port 443 benutzt werden soll, sowie als Verzeichnisname &#039;&#039;/alexa&#039;&#039;. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; Dieser Code soll &#039;&#039;&#039;nicht&#039;&#039;&#039; in die Default-Konfiguration des Apache-Webservers. Sondern in eine separate Datei (Dateiname z.B. &amp;quot;fhem&amp;quot;), die ins Unterverzeichnis /etc/apache2/conf.d gestellt wird.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
  ServerName myhome.is-my-castle.com&lt;br /&gt;
  SSLEngine on&lt;br /&gt;
  SSLProxyEngine on&lt;br /&gt;
  SSLProxyCheckPeerCN off&lt;br /&gt;
  SSLProxyCheckPeerName off&lt;br /&gt;
  SSLCertificateKeyFile /etc/apache2/mycert/server.key&lt;br /&gt;
  SSLCertificateFile /etc/apache2/mycert/server.crt&lt;br /&gt;
 &amp;lt;Location /alexa&amp;gt;&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthName &amp;quot;Authentication Required&amp;quot;&lt;br /&gt;
  AuthUserFile &amp;quot;/etc/apache2/htpasswd&amp;quot;&lt;br /&gt;
  Require valid-user&lt;br /&gt;
  ProxyPass https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  ProxyPassReverse https://&amp;lt;hier IP-Adresse des Alexa-Fhem-Rechners&amp;gt;:3000/&lt;br /&gt;
  Order deny,allow&lt;br /&gt;
  Allow from All&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 (... Hier eventuell weitere Umleitungen)&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
Nach einem Neustart des Apache-Servers, dem Schließen des Ports 3000 in der Firewall sowie dem Öffnen des Ports 443 ist der Alexa-Fhem-Rechner von außen nur noch erreichbar durch den Aufruf von &amp;lt;code&amp;gt;https://myhome.is-my-castle.com/alexa&amp;lt;/code&amp;gt; und verlangt unmittelbar die Eingabe von Username und Passwort.&lt;br /&gt;
&lt;br /&gt;
Der vierte Schritt ist nun, den Code der AWS Lambda-Funktion an fünf Stellen zu verändern&lt;br /&gt;
 &#039;&#039;&#039;const PORT=443;&#039;&#039;&#039;&lt;br /&gt;
 const HOST=&#039;myhome.is-my-castle.com&#039;;&lt;br /&gt;
 &#039;&#039;&#039;const PATH=&#039;/alexa&#039;;&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;const AUTH=&#039;alexa:my_smarthome&#039;;&#039;&#039;&#039;&lt;br /&gt;
 // entry&lt;br /&gt;
 exports.handler = function(event, context, callback) {&lt;br /&gt;
  console.log(`EVENT: ${event}`);&lt;br /&gt;
  console.log(`CONTEXT: ${context}`);  &lt;br /&gt;
  var post_data = JSON.stringify(event);&lt;br /&gt;
  var options = {&lt;br /&gt;
    hostname: HOST,&lt;br /&gt;
    port: PORT,&lt;br /&gt;
    //family: 6,&lt;br /&gt;
    &#039;&#039;&#039;path: PATH,&#039;&#039;&#039;&lt;br /&gt;
    method: &#039;POST&#039;,&lt;br /&gt;
    &#039;&#039;&#039;auth: AUTH,&#039;&#039;&#039;&lt;br /&gt;
    rejectUnauthorized: false, // accept self-signed&lt;br /&gt;
 (etc., Rest des Codes wie gehabt)&lt;br /&gt;
Natürlich muss der Zugriff getestet werden. Bei Beachtung aller dieser Schritte werden alle un-autorisierten Zugriffe von außen abgewehrt. Eine noch weiter gehende Sicherung ist möglich, dazu kann in der Serverkonfiguration der Zugriff auf die Amazon-Domains beschränkt werden. Das ganze Alexa-System ist aber noch in konstanter Weiterentwicklung, diese Domain-Namen können sich also noch ändern.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung in der Alexa App==&lt;br /&gt;
Nachdem die Alexa Skills angelegt wurden, müssen diese noch in der Alexa App eingerichtet werden.&lt;br /&gt;
Dafür jeweils per Desktop-Browser auf [http://alexa.amazon.de alexa.amazon.de] anmelden, nicht die App unter iOS oder Android verwenden. Diese hat Probleme mit der OAuth Verknüpfung.&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skill ===&lt;br /&gt;
# Auf &#039;&#039;Skills&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Oben rechts &#039;&#039;Meine Skills&#039;&#039;  bzw. &#039;&#039;Ihre Skills&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]&lt;br /&gt;
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]&lt;br /&gt;
# Oben Rechts in den Details des Skills auf &#039;&#039;Skill aktivieren&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]&lt;br /&gt;
# In dem neu geöffneten Fenster die Autorisierung bestätigen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]&lt;br /&gt;
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein &amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-06-success.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Geräte ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden&lt;br /&gt;
# Auf &#039;&#039;Smart Home&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Geräte suchen&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-07-Gerätesuche.png|200px]]&lt;br /&gt;
# Wurde soweit alles korrekt eingerichtet, werden nun die gefundenen Geräte angezeigt.&lt;br /&gt;
&lt;br /&gt;
Tip: Es macht Sinn, unter &#039;&#039;Meine Gruppen&#039;&#039; Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. &amp;quot;Licht&amp;quot;) haben.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung unter FHEM ==&lt;br /&gt;
Im Folgenden werden exemplarisch ein paar Geräte beschrieben, die man nutzbringend mit FHEM einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Custom Skills übersetzt die Kombination der Attribute &#039;&#039;alexaMapping&#039;&#039; und &#039;&#039;homebridgeMapping&#039;&#039; Sprachbefehle (&amp;quot;Intents&amp;quot;) in gerätespezifische Kommandos. &lt;br /&gt;
* Das Attribut alexaMapping wird am Alexa-Device gesetzt und dient dazu, erkannte Sprachkommandos in abstrakte Characteristiken zu überführen. Für den einfacheren SmartHome Skill hat darum das Attribut &#039;&#039;alexaMapping&#039;&#039; keine Bedeutung, sondern nur der &#039;&#039;genericDeviceType&#039;&#039; des zu steuernden Gerätes.&lt;br /&gt;
* Das Attribut homebridgeMapping wird für beide Skills am zu steuernden Gerät gesetzt und übersetzt diese Charakteristiken in die konkreten Befehle, die das Gerät versteht. Der inhalt des Attributs wird von links nach rechts ausgewertet und ist wie folgt aufgebaut:&lt;br /&gt;
** Das Attribut enthält eine durch Leerzeichen getrennte Liste aus Konfigurationen für jeweils eine Characteristik&lt;br /&gt;
** Jede einzelne der Characteristik-Konfigurationen besteht aus dem Namen der Characteristik, gefolgt von &amp;quot;=&amp;quot; und einer kommaseparierten Liste von Parametern.&lt;br /&gt;
  attr &amp;lt;device&amp;gt; homebridgeMapping &amp;lt;Characteristic1&amp;gt;=&amp;lt;param1.1&amp;gt;,&amp;lt;param1.2&amp;gt;,... &amp;lt;Characteristic2&amp;gt;=&amp;lt;param2.1&amp;gt;,&amp;lt;param2.2&amp;gt;,...&lt;br /&gt;
** Jeder Parameter besteht entweder aus&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;cmd&amp;gt;:&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&amp;lt;/code&amp;gt;, hier können nicht verwendete Elemente von links nach rechts weg gelassen werden.&lt;br /&gt;
*** &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;=&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;, hier kann &amp;lt;code&amp;gt;&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt; entweder ein Wert oder semikolonseparierte Liste sein.&lt;br /&gt;
*** Oder dem schlüsselwort &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;, welches alle vorhandenen (default) Parameter dieser Characteristik löscht. &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt; kann auch an Stelle einer ganzen Characteristik-Konfiguration stehen&lt;br /&gt;
Weiter führende Dokumentation zum homebridgeMapping findet sich unter https://forum.fhem.de/index.php/topic,48558.0.html&lt;br /&gt;
&lt;br /&gt;
=== Einfacher Schalter ===&lt;br /&gt;
* Ein einfacher Schalter, der die set-Kommandos &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039; kennt, kann direkt mit Alexa-Fhem gekoppelt werden &lt;br /&gt;
* Für kompliziertere Aktionen, etwa das Übermitteln eines spezifischen Schaltbefehls an FHEM, ist die Einrichtung eines Dummies zu empfehlen. &lt;br /&gt;
Ob Dummy oder nicht, wichtig sind die drei fett gedruckten Zeilen&lt;br /&gt;
 define Alexa.Party dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaName party&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Party group AlexaGeräte&lt;br /&gt;
 attr Alexa.Party room AlexaRoom&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Party setList on off&#039;&#039;&#039;&lt;br /&gt;
Selbstverständlich kann man diesen Dummy mit einem notify oder DOIF abfangen, um die gewünschte Schaltaktion auszuführen. &lt;br /&gt;
&lt;br /&gt;
Ein Alternative zum Dummy ist das Anlegen eines readingsProxy, dem die entsprechenden Attribute gegeben werden.&lt;br /&gt;
&lt;br /&gt;
Weil es sich hierbei um eines der einfachen Geräte handelt, die Alexa selbst im SmartHome Skill bearbeiten kann, ist auch der zweite Schritt bei der Einrichtung in der Alexa App sinnvoll: Der Schalter wird dann im Bereich Smart Home der Alexa App erkannt. Wer ihn auch mit dem Custon Skill bedienen möchte, muss natürlich Sorge tragen, dass der Alexa-Name &#039;&#039;party&#039;&#039; bei den FHEM_Devices auftaucht und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sind (siehe Abschnitt [[##Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
=== Wecker ===&lt;br /&gt;
Dieses Gerät kann man nur mit dem Custom Skill bedienen, es wird also &#039;&#039;&#039;nicht&#039;&#039;&#039; im Bereich Smart Home der Alexa App auftauchen. Wir richten einen Dummy ein, wichtig sind wieder die fett gedruckten Zeilen:&lt;br /&gt;
 define Alexa.Weckzeit dummy&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaName weckzeit&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit genericDeviceType clock&lt;br /&gt;
 attr Alexa.Weckzeit group AlexaGeräte&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+&#039;&#039;&#039;&lt;br /&gt;
 attr Alexa.Weckzeit room AlexaRoom&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Weckzeit setList Weckzeit:time&#039;&#039;&#039;&lt;br /&gt;
Das Attribut &#039;&#039;genericDeviceTye&#039;&#039; ist nicht wichtig, weil es ein generisches Device dieser Art gar nicht gibt. Wichtig hingegen ist das Attribut &#039;&#039;homebridgeMapping&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Für das Gerät &#039;&#039;MyAlexa&#039;&#039;, das in Abschnitt definiert wurde, muss im Attribut &#039;&#039;alexaMapping&#039;&#039; auftauchen&lt;br /&gt;
 Weckzeit=verb=stelle,valuePrefix=für;auf,values=AMAZON.TIME,valueSuffix=uhr&lt;br /&gt;
Darüber hinaus muss der Alexa-Name &#039;&#039;weckzeit&#039;&#039; bei den FHEM_Devices auftauchen und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sein (siehe Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]]).&lt;br /&gt;
&lt;br /&gt;
Der Aufruf dieses Gerätes mit Alexa erfolgt dann z.B. mit den Sätzen&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: Stelle Weckzeit auf Neunzehn Uhr Siebenundzwanzig&amp;quot;&lt;br /&gt;
&amp;quot;Alexa, frage &amp;lt;Custom Skill Invocation Name&amp;gt; nach dem Status von Weckzeit&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dabei ist natürlich der &#039;&#039;Custom Skill Invocation Name&#039;&#039; durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
Zur weiteren Bearbeitung kann man jetzt mit einem DOIF Statusänderungen des Dummies abfangen und durch eine kleine Helperfunktion ins &amp;quot;echte&amp;quot; FHEM weiterleiten.&lt;br /&gt;
  define Alexa.Weckzeit.N DOIF ([&amp;quot;Alexa.Weckzeit:.*&amp;quot;])({AlexaHelper(&amp;quot;Alexa.Weckzeit&amp;quot;,&amp;quot;$EVENT&amp;quot;)}) &lt;br /&gt;
Die Helperfunktion (z.B. in 99_myUtils.pm) stellt aus der übergebenen Zeit (immer im Format dd:mm) eine sprachkompatible Nachricht $nc und einen mit den FHEM-Zeitangaben kompatiblen String $nt zusammen und reicht beide an eine Routine &#039;&#039;changeWakeTime&#039;&#039; weiter (dokumentiert in den [https://www.dpunkt.de/buecher/12387/9783960090120-smarthome-hacks.html Smart Home Hacks]).&lt;br /&gt;
 sub AlexaHelper($$){&lt;br /&gt;
  my ($name,$event)=@_;&lt;br /&gt;
  if( $name eq &amp;quot;Alexa.Weckzeit&amp;quot; ){ &lt;br /&gt;
    my ($nc,$nt);&lt;br /&gt;
    #-- volle Stunde----------------------------------------&lt;br /&gt;
    if( $event =~ /(\d+):00/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr&amp;quot;,$1);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:00:00&amp;quot;,$1);&lt;br /&gt;
    #-- nicht volle Stunde---------------------------------&lt;br /&gt;
    }elsif( $event =~ /(\d+):(\d+)/ ){&lt;br /&gt;
      $nc=sprintf(&amp;quot;%d Uhr %d&amp;quot;,$1,$2);&lt;br /&gt;
      $nt=sprintf(&amp;quot;%02d:%02d:00&amp;quot;,$1,$2);&lt;br /&gt;
    }&lt;br /&gt;
    changeWakeTime(\&#039;GalaxyTab.EG\&#039;,\&#039;$nc\&#039;,\&#039;$nt\&#039;);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lichtszene ===&lt;br /&gt;
Eine Lichtszene wird mit dem Modul LightScene angelegt. Wir gehen davon aus, dass in der Lichtszene die beiden Szenen Alle_An und Alle_Aus, sowie mindestens eine weitere Szene (hier: Sitzgruppe) definiert wurde.&lt;br /&gt;
* Nachfolgend wird ein Beispiel beschrieben, wie man eine Lichtszene mit dem einfachen SmartHome Skill steuern kann. Die verwendeten Kommandos sind dann&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtungsitzgruppe an&amp;quot; -&amp;gt; LightScene Sitzgruppe wird ausgewählt&lt;br /&gt;
...&lt;br /&gt;
&amp;quot;Alexa, schalte (die) Beleuchtung aus&amp;quot; -&amp;gt; LightScene Alle_Aus wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Künftig wird man LightScene mit dem Custom Skill eventuell direkt steuern können - allerdings hat das einen geringeren WAF, als die Steuerung über den SmartHome Skill: Der Einschaltsatz muss dann mindestens lauten&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Alexa, sage &amp;lt;Custom Skill Invocation Name&amp;gt;: schalte (die) Beleuchtung an&amp;quot; -&amp;gt; LightScene Alle_An wird ausgewählt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dafür wird es aber auch möglich sein direkt die SzenenNamen im gesprochenen Kommando zu verwenden und so auf die Umwege über dummys und ähnliches zu verzichten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im ersten Schritt wird ein Dummy für die Gesamtbeleuchtung eingerichtet:&lt;br /&gt;
 define Alexa.Beleuchtung dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaName beleuchtung&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung genericDeviceType switch&#039;&#039;&#039;&lt;br /&gt;
Anschließend wird für jede vorhandene Lichtszene (außer Alle_An und Alle_Aus) ein weiterer Dummy angelegt:&lt;br /&gt;
 define Alexa.Beleuchtung.Sitzgruppe dummy &lt;br /&gt;
 attr Beleuchtung setList on off&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaName beleuchtungsitzgruppe&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe alexaRoom alexaroom&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;attr Alexa.Beleuchtung.Sitzgruppe genericDeviceType switch&#039;&#039;&#039; &lt;br /&gt;
Die eigentliche Steuerung übernimmt dann ein DOIF&lt;br /&gt;
 define Alexa.Beleuchtung.N DOIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung.Sitzgruppe:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Sitzgruppe,&lt;br /&gt;
  set Alexa.Beleuchtung off,&lt;br /&gt;
   ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSIF&lt;br /&gt;
 ... &amp;lt;weitere on-Events der anderen Szenen werden abgefangen&amp;gt;&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:on&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_An,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
 DOELSEIF&lt;br /&gt;
 ([&amp;quot;Alexa.Beleuchtung:off&amp;quot;])&lt;br /&gt;
 (set &amp;lt;devicename der Lichtszene&amp;gt; scene Alle_Aus,&lt;br /&gt;
  set Alexa.Beleuchtung.Sitzgruppe off,&lt;br /&gt;
  ...&amp;lt;weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet&amp;gt;&lt;br /&gt;
 )&lt;br /&gt;
Mit diesem DOIF wird ein Radiobutton simuliert, d.h. wie bei den Stationstasten vor Uralt-Radios sorgt die Auswahl einer Szene immer dafür, dass alle anderen Dummies ausgeschaltet werden.&lt;br /&gt;
Natürlich kann man das auch mit einem kleinen Perl-Programm erreichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zwei andere Ansätze Lichtszenen zu schalten die ohne DOIF auskommen sind im Folgenden beschrieben:&lt;br /&gt;
&lt;br /&gt;
* Wenn es von Interesse ist die Steuerung mit einer Darstellung in FTUI zu verbinden: Statt der oben beschriebenen dummy Devices kann man readingsProxy Devices mit passenden setFn und valueFn analog zum  [[Harmony#Button_f.C3.BCr_eine_bestimmte_Activity_im_Frontend_und_Homekit_.C3.BCber_readingsProxy|diesem Beispiel für harmony aktivitäten]] verwenden.&lt;br /&gt;
&lt;br /&gt;
* Für jede zu schaltende Szene wird ein dummy angelegt dessen homebridgeMapping direkt auf das LightScene Device zeigt:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;dummy&amp;gt; dummy&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; setList on off&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;dummy&amp;gt; homebridgeMapping On=&amp;lt;light scene&amp;gt;::state,valueOn=&amp;lt;szene&amp;gt;,cmdOn=scene+&amp;lt;szene&amp;gt;,cmdOff=scene+&amp;lt;szene aus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der zweiten Variante wird davon ausgegangen das der aktuelle status nicht abgefragt oder angezeigt werden soll. Deshalb gibt es keine direkte RadioButton Funktionalität.&lt;br /&gt;
&lt;br /&gt;
== Nutzung ==&lt;br /&gt;
Um den Namen zu bestimmen, unter dem ein Gerät mit Alexa angesprochen wird, verwendet Alexa-Fhem mit absteigender Priorität:&lt;br /&gt;
* das alexaName Attribut&lt;br /&gt;
* das alias Attribut&lt;br /&gt;
* das NAME Internal&lt;br /&gt;
Damit Alexa ein Gerät eindeutig identifizieren kann, sollten eindeutige Gerätenamen verwendet werden, bestehed möglichst aus einem Wort und ohne Ziffern. Wenn Alexa einen Namen nicht versteht, kann man unter [http://alexa.amazon.de/spa/index.html] nachsehen was tatsächlich verstanden wurde und den Gerätenamen ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
=== SmartHome Skill ===&lt;br /&gt;
Gruppen (Räume) müssen in der Alexa App konfiguriert werden. Über das API lassen sich nur der Name und die Schalteigenschaften übergeben.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Einrichtung des SmartHome Skills sollte Alexa mit den folgenden Befehlen nutzbar sein:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; ein”&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; aus”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;wert&amp;gt; prozent”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Skill ===&lt;br /&gt;
Der Custom Skill erlaubt im Gegensatz zum SmartHome Skill eine weitreichende Konfiguration der möglichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=im Forum}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions)&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
====Allgemeiner Hinweis====&lt;br /&gt;
Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein &#039;&#039;http://&#039;&#039; davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
const PORT=3000;&lt;br /&gt;
const HOST=&#039;mein.host.name&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Freigabe von Port 3000====&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von &amp;lt;b&amp;gt;UnityMedia&amp;lt;/b&amp;gt; z.B. funktionieren derzeit leider nicht. Eine möglicher &amp;quot;Workaround&amp;quot; wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276}}&lt;br /&gt;
&lt;br /&gt;
Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können.&lt;br /&gt;
Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.&lt;br /&gt;
&lt;br /&gt;
Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde. &lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter &#039;&#039;Internet -&amp;gt; Freigaben -&amp;gt; Portfreigaben&#039;&#039; statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: &#039;&#039;https://mein.hostname:3000&#039;&#039;. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.&lt;br /&gt;
&lt;br /&gt;
Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.&lt;br /&gt;
&lt;br /&gt;
====Probleme mit node.js - npm install====&lt;br /&gt;
&lt;br /&gt;
Falls eine Fehlermeldung auftritt, dass &amp;quot;npm&amp;quot; nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: [[Homebridge_einrichten#NodeJS_installieren|NodeJS installieren]] sowie [[Homebridge_einrichten#Python.2C_g.2B.2B.2C_MDNS_installieren|Python, g++, MDNS installieren]], siehe auch folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
====Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich====&lt;br /&gt;
Wenn man auf der Konsole angemeldet ist, den Befehl&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/source&amp;gt;eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter [[Homebridge_einrichten#NodeJS_installieren]] nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter [[Alexa-Fhem#Voraussetzungen]] erfüllt sind! Keine Experimente mit Versionen die darunter liegen.&lt;br /&gt;
&lt;br /&gt;
====Fehlermeldung &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039; Fehler angezeigt beim Start von alexa-fhem====&lt;br /&gt;
Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039;, lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
====Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder====&lt;br /&gt;
Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder. &lt;br /&gt;
&lt;br /&gt;
Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; die folgenden Zeilen rauslöschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;nat-pmp&amp;quot;: &amp;quot;10.0.1.1&amp;quot;,&lt;br /&gt;
        &amp;quot;nat-upnp&amp;quot;: true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn alexa-fhem keine Geräte findet?====&lt;br /&gt;
Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut &#039;&#039;genericDeviceType switch&#039;&#039; hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut &#039;&#039;alias&#039;&#039; eine besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann.&lt;br /&gt;
Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?====&lt;br /&gt;
Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:&lt;br /&gt;
* wenn nichts bei alexa-fhem ankommt: port forwarding prüfen&lt;br /&gt;
* wenn lambda.js nichts los wird: im cloudwatch log nachsehen&lt;br /&gt;
* wenn bei lambda.js nichts ankommt: den trigger prüfen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst sollte man sich unter &#039;&#039;http://aws.amazon.com&#039;&#039; das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger.&lt;br /&gt;
Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf &#039;&#039;Triggers&#039;&#039; klicken und mit &#039;&#039;Add trigger&#039;&#039; erneut einen anlegen. Hier muss, wie in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 7, die &#039;&#039;Application Id&#039;&#039; stehen und der Haken bei &#039;&#039;Enable trigger&#039;&#039; gesetzt sein. Dann alexa-fhem neu starten.&lt;br /&gt;
Wenn ihr Änderugen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&lt;br /&gt;
Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei &#039;&#039;alexa&#039;&#039; muss ausführbar sein. Also z.B. so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
die Datei ausführbar machen. Sofern der User &amp;quot;pi&amp;quot; Eigentümer ist, ist kein sudo erforderlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Wie kann ich via Alexa-FHEM auf FHEM zugreifen, wenn der Port mit Benutzername/Kennwort geschützt ist?====&lt;br /&gt;
&lt;br /&gt;
Hierzu muss die Datei &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; geöffnet werden und der Abschnitt &amp;quot;connections&amp;quot; um folgende Zeile ergänzt werden:&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;auth&amp;quot;: {&amp;quot;user&amp;quot;: &amp;quot;fhem&amp;quot;, &amp;quot;pass&amp;quot;: &amp;quot;fhempassword&amp;quot;},&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei Verwendung von SSL bei FHEM muss auch noch &amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;ssl&amp;quot;: true,&amp;lt;/pre&amp;gt; hinzugefügt werden&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonoff&amp;diff=21839</id>
		<title>Sonoff</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonoff&amp;diff=21839"/>
		<updated>2017-07-22T14:00:07Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Befehl für Ein/Ausschalten korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ankopplung der Sonoff Module an Fhem&lt;br /&gt;
|ModType=&lt;br /&gt;
|ModForumArea=ESP8266&lt;br /&gt;
|ModTechName=Sonoff&lt;br /&gt;
|ModOwner=Reinhart &lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;SONOFF, dieser Artikel beschreibt die Ankopplung der kostengünstigen Sonoff Module an FHEM mit ESPEasy oder Arends MQTT.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seit einiger Zeit werden von der [https://www.itead.cc/sonoff-wifi-wireless-switch.html Fa. Itead] kostengünstige &amp;quot;sonoff&amp;quot; Produkte angeboten die glücklicherweise den [http://dl.itead.cc/IM151116002/0A-ESP8266_Specifications_v4.1.pdf ESP8266 Chip] On Board haben und somit die ideale Grundlage für [http://www.esp8266.nu/index.php/Main_Page ESPEasy] und für [https://forum.fhem.de/index.php/board,46.0.html FHEM] darstellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nützliche Links zum Hersteller:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.itead.cc/blog/user-guide-for-sonoff-slampher User Manual von Itead]&lt;br /&gt;
&lt;br /&gt;
[https://www.itead.cc/wiki/images/6/6b/Sonoff_schmatic.pdf Sonoff Schaltplan]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
&#039;&#039;&#039;Bitte unbedingt die elektrotechnischen Sicherheitsrichtlinien beachten und einhalten!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_sw_15.jpg|thumb|left|alt=Warnung Netzspannung]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung: An dem Modul liegt Netzspannung an die lebensgefährlich ist. Es dürfen nur entsprechend ausgebildete Personen dieses Modul in Betrieb nehmen. Zum Umbau und zur Softwareaktualisierung darf keine Netzspannung angeschlossen sein&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wie gefährlich das hantieren mit Netzspannung sein kann, wird hier am Beispiel eines [http://mysku.ru/blog/china-stores/45762.html russischen Anwenders] gezeigt, der hat beim Flashen die Netzspannung am Modul gelassen und somit über die Verbindung mit dem Netzteil des Laptop lebensgefährliche Spannung auf die FTDI Schnittstelle gebracht. Das Modul ist dabei abgeraucht!&lt;br /&gt;
&lt;br /&gt;
==Modelle==&lt;br /&gt;
&lt;br /&gt;
===Produktübersichtsliste sonoff===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
! Produkt Name !! Beschreibung !! Spannungsversorgung !!  Imax !! Pmax !! Frequenz !! Schaltplan !! Link&lt;br /&gt;
|-&lt;br /&gt;
| Sonoff || Wireless control switch || 90~250V AC || 10A || 2200W || 2.4Ghz || [http://wiki.iteadstudio.com/Sonoff Plan] || [https://www.itead.cc/smart-home/sonoff-wifi-wireless-switch.html Link] &lt;br /&gt;
|-&lt;br /&gt;
| Sonoff RF || 433 RF remote || 90~250V AC || 10A || 2200W || 2.4Ghz || [http://wiki.iteadstudio.com/Sonoff_RF Plan] || [https://www.itead.cc/smart-home/im151116003.html Link] &lt;br /&gt;
|-&lt;br /&gt;
| Sonoff SV || Low voltage Input || 5~24V DC || 10A || 240W DC || 2.4Ghz || [http://wiki.iteadstudio.com/Sonoff_SV Plan] || [https://www.itead.cc/smart-home/sonoff-sv.html Link] &lt;br /&gt;
|-&lt;br /&gt;
| Sonoff TH10/TH16 || Monitor and set Temp.&amp;amp;Hum. ||  90~250V AC || 10A/16A || 2200W(10A)/3500W(16A)	 || 2.4Ghz || [http://wiki.iteadstudio.com/Sonoff_TH_10/16 Plan] || [https://www.itead.cc/smart-home/sonoff-th.html Link] &lt;br /&gt;
|-&lt;br /&gt;
|  Sonoff Dual || Remote control 2 devices ||  90~250V AC || 16A || 3500W || 2.4Ghz || [https://www.itead.cc/wiki/Sonoff_Dual Plan] || [https://www.itead.cc/sonoff-dual.html Link] &lt;br /&gt;
|-&lt;br /&gt;
|  Sonoff Pow || Report power &amp;amp;power usage ||  90~250V AC || 16A || 3500W || 2.4Ghz || [https://www.itead.cc/wiki/Sonoff_Pow Plan] || [https://www.itead.cc/sonoff-pow.html Link] &lt;br /&gt;
|-&lt;br /&gt;
|  Sonoff LED || WiFi Control Dimming LED ||  180~265V AC || 0.3-0.6A || 42W || 2.4Ghz ||  kein || [https://www.itead.cc/sonoff-led.html Link] &lt;br /&gt;
|-&lt;br /&gt;
|  Sonoff Touch || WiFi wall touch switch ||  90~250V AC || 2A || 400W || 2.4Ghz || kein || [https://www.itead.cc/sonoff-touch.html Link] &lt;br /&gt;
|-&lt;br /&gt;
|  Slampher || Wireless control light holder ||  90~250V AC || 2A || 200W || 2.4Ghz || [http://wiki.iteadstudio.com/Slampher Plan] || [https://www.itead.cc/smart-home/slampher-wifi-wireless-light-holder.html Link] &lt;br /&gt;
|-&lt;br /&gt;
|  S20 Smart Socket || Smart socket || 	90~250V AC || 10A || 2000W || 2.4Ghz || kein || [https://www.itead.cc/smart-home/smart-socket-eu.html EU-Stecker] &lt;br /&gt;
|-&lt;br /&gt;
|  iFan || Smart fan ||  185~264V AC ||﹤1A || 60W || 2.4Ghz || kein || [https://www.itead.cc/smart-home/smart-socket-eu.html EU-Stecker] &lt;br /&gt;
|-&lt;br /&gt;
| Motor/Pump Control Switch || clockwise/anticlockwise running ||  5V/7~32V DC || 10A || 50~320W || 2.4Ghz || kein || [https://www.itead.cc/smart-home/motor-reversing-wifi-wireless-switch.html Link] &lt;br /&gt;
|-&lt;br /&gt;
| 1 Chnl Inching/self-locking Switch || Access control ||  	5V/12V DC || 10A || 50/120W || 2.4Ghz || kein || [https://www.itead.cc/smart-home/inching-self-locking-wifi-wireless-switch.html Link] &lt;br /&gt;
|-&lt;br /&gt;
|  4 Chnl Inching/self-locking/inter-locking Switch || Access control, rolling door control ||  5V/5~32V DC/90~250V AC || 10A || 50~320W/2500W || 2.4Ghz || kein || [https://www.itead.cc/ifan.html Link] &lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine Übersichtliste der verschiedenen Produkte mit technischen Kurzangaben.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Model: IM151116002: Erstes Modell===&lt;br /&gt;
[https://www.itead.cc/sonoff-wifi-wireless-switch.html Sonoff WiFi Wireless Smart Switch for MQTT COAP Smart Home]&lt;br /&gt;
[[Datei:sonoff_sw_0.jpg|thumb|left|alt=sonoff Switch]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Das sonoff Modul ist in einem zweckmäßigen und gefälligem Gehäuse verbaut!&lt;br /&gt;
&lt;br /&gt;
====Platine====&lt;br /&gt;
[[Datei:sonoff_sw_1.jpg|thumb|left|alt=sonoff Switch von vorne]]&lt;br /&gt;
&lt;br /&gt;
Die Platine ist sehr übersichtlich aufgebaut und der Hersteller hat auch alle Vorbereitungen zum Flashen einer alternativen Software vorgesehen (über serielle Schnittstelle via FTDI-Modul). Mit einer alternativen Software wie ESPEasy ist eine direkte Ankopplung des &#039;&#039;&#039;sonoff&#039;&#039;&#039; an FHEM somit ein leicht durchführbarer Vorgang.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sw_3.jpg|thumb|left|alt=sonoff Switch von hinten]]&lt;br /&gt;
Die stromführenden Leitungen wurden mit Lötzinn vom Hersteller verstärkt um die angegebenen Stromstärken mit geringer Hitzeentwicklung zu transportieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung: Bitte vor den Arbeiten kontrollieren, das an der Platine keine Netzspannung angeschlossen ist, LEBENSGEFAHR!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Model: IM160712005: TH 10A/16A ===&lt;br /&gt;
[https://www.itead.cc/sonoff-th.html Sonoff TH 10A/16A WiFi Smart Switch]&lt;br /&gt;
&lt;br /&gt;
====TH10 / TH16 weitere GPIO zugänglich machen====&lt;br /&gt;
[[Datei:Sonoff_TH_10A-16A_kleiner.jpg|thumb|left|alt=TH10 / TH16 weitere GPIO zugänglich machen]]&lt;br /&gt;
Der Hersteller hat zwar schon Platine für eine weitere Stiftleiste vorbereitet, jedoch muss diese noch bestückt werden. Die nicht beschalteten Stifte können dann genutzt werden um die &amp;quot;verdeckten&amp;quot; GPIO zugänglich zu machen. Die Verdrahtung kann dem Bild entnommen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung: Bitte vor den Arbeiten kontrollieren, das an der Platine keine Netzspannung angeschlossen ist, LEBENSGEFAHR!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Model: IM160811001: Sonoff Dual ===&lt;br /&gt;
[https://www.itead.cc/sonoff-dual.html Sonoff Dual WiFi Wireless Smart Swtich]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Model: IM160810001: Sonoff Pow ===&lt;br /&gt;
[https://www.itead.cc/sonoff-pow.html Sonoff POW WiFi Switch with Power Consumption Measurement]&lt;br /&gt;
[[Datei:sonoff_sw_30.jpg|thumb|left|alt=SONOFF POW]]Ein sehr interessantes und kostengünstiges Modul zur Messung der aktuellen Leistung. Das Modul kann via MQTT in FHEM angebunden werden.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel zur Einbindung ist [http://www.fhemwiki.de/wiki/Sonoff#Sonoff_POW_einrichten hier unten] im Wiki beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Model: weitere Modelle===&lt;br /&gt;
[https://www.itead.cc/search/result/?cat=&amp;amp;q=sonoff Sonoff Weitere Modelle finden sich auf der Homepage des Hersstellers]&lt;br /&gt;
&lt;br /&gt;
==Vorbereitungen zum Flashen==&lt;br /&gt;
[[Datei:sonoff_sw_2.jpg|thumb|left|alt=serielle Schnittstelle]]&lt;br /&gt;
&lt;br /&gt;
Hier auf der Platine sind die benötigten Signale für ein FTDI Modul schon vorhanden. Der quadratische Pin gleich über dem Taster ist die Spannungsversorgung zum Flashen vom FDTI von 3.3V Es muss daher unbedingt ein FTDI Modul genommen werden, dass nicht nur einen Jumper für 3.3V besitzt sondern auch die Spannung auf 3.3V herab setzt. Ist dies nicht der Fall, läuft man Gefahr das Modul unbrauchbar zu machen. Es ist daher zu empfehlen einen Spannungsteiler mit 2 Widerständen oder einen Pegelwandler zwischenschalten.&lt;br /&gt;
&lt;br /&gt;
Achtung! Es kann sein, dass der Flashvorgang ohne Fehler läuft, der Flash aber anschließend korrupt ist und das Modul unklares Verhalten zeigt. In dem Fall die Spannungsversorgung 3,3 Volt prüfen! Auch das USB Kabel kann eine Fehlerursache sein.&lt;br /&gt;
&lt;br /&gt;
Es ist generell besser, das SonOff Modul separat mit 3,3 Volt und ausreichend Strom (ca. 300 mA) zu versorgen. &lt;br /&gt;
&lt;br /&gt;
Der FTDI Chip darf laut Datenblatt 50 mA liefern, das ESP Modul kann bis zu 300 mA Spitzenstrom ziehen und verbraucht schon im normalen Modus ca. 50-70 mA. Die einfachen FTDI Adapter ohne separaten Spannungsregler sind damit ohne externe 3,3 Volt Versorgung sicher ungeeignet.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Signale der Schnittstelle==&lt;br /&gt;
von oben nach unten auf der Steckerleiste des sonoff U4 (Model: IM151116002).&lt;br /&gt;
&lt;br /&gt;
 Pin5 = vorbereitet für GPIO&lt;br /&gt;
 Pin4 = Masse&lt;br /&gt;
 Pin3 = TxD&lt;br /&gt;
 Pin2 = RxD&lt;br /&gt;
 Pin1 = 3.3V&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den {{Link2Forum|Topic=55036|LinkText=Link aus dem Forum}}:&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Platine mit Stiftleiste bestücken==&lt;br /&gt;
[[Datei:sonoff_sw_4.jpg|thumb|left|alt=Platine mit Stiftleiste bestücken]]&lt;br /&gt;
Der Hersteller hat zwar schon die Platine vorbereitet, jedoch muss sie noch mit einer Stiftleiste bestückt werden um das FTDI Modul bequem verbinden zu können. Nachdem einmal ESPEasy geflasht worden ist, kann es in Zukunft via WEB (OTA) geflasht werden und die Stiftleiste ist dann nicht mehr erforderlich. Aufgrund der geringen Kosten fällt dies jedoch nicht ins Gewicht.&amp;lt;br&amp;gt;&lt;br /&gt;
Für die Module TH10/TH16 sind die Lötpunkte für die Stiftleiste schon beschriftet. Die Stiftleiste selber muss allerdings auch nachgerüstet werden.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Bitte vor den Arbeiten kontrollieren, das an der Platine keine Netzspannung angeschlossen ist, LEBENSGEFAHR!&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
==MQTT und TASMOTA==&lt;br /&gt;
Der Autor Arends hat die Version Sonoff-MQTT-OTA-Arduino nun eingestellt und die Version 3.2.13 (Ende Jänner 2017)dürfte wohl die letzte dieser Generation gewesen sein. Mit der Einstellung dieser Version wurde zwar der Nachfolger &#039;&#039;&#039;TASMOTA&#039;&#039;&#039; erschaffen, aber leider nun auf das &#039;&#039;&#039;Messageformat LEGACY&#039;&#039;&#039; gänzlich verzichtet was bei der Auswertung der Messdaten in Fhem doch einige Probleme mit sich bringt, da der verwendete JSON String nun zusätzlich gefiltert werden muss.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Es gibt aber bereits sehr gute Lösungswege um dieses Problem zu beheben und somit spricht dem neuen Ausgabeformat nichts dagegen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Link2Forum|Topic=66761|LinkText=in diesem Thread}} wurde ein &#039;&#039;&#039;JSON to Reading Modul&#039;&#039;&#039; vorgestellt, dass den JSON String analysiert und alle darin enthaltenen Daten in Readings kopiert. Die Readings werden dabei in FHEM automatisch angelegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Link: [https://github.com/arendst/Sonoff-Tasmota Tasmota]&lt;br /&gt;
&lt;br /&gt;
Link alte Software: [https://github.com/arendst/Sonoff-MQTT-OTA-Arduino Sonoff-MQTT-OTA-Arduino]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alle hier im Wiki verwendeten Beispiele und deren Beschreibung sind nun für die neue Tasmota Version ausgelegt. Da in Tasmota fast alles im WEBIF konfiguriert werden kann, entfallen daher sinngemäß einige hier im Wiki erklärten Definitionen, speziell in der &amp;quot;user_config.h&amp;quot;.&lt;br /&gt;
Trotz diesem Komfort müssen die Einstellungen aber nun im WEBIF vorgenommen werden, die wohl wichtigste ist die Auswahl der verwendeten Hardware (Sonoff POW etc.).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ESPEasy flashen==&lt;br /&gt;
[[Datei:sonoff_sw_6.jpg|thumb|left|alt=sonoff mit angestecktem FDTI Adapter]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier geht es ausschließlich um die Software ESPEasy an den sonoff Modulen! }}&lt;br /&gt;
Die Spannungsversorgung des Sonoff Moduls wird hier vom FTDI Konverter mit 3.3V über die Verbindungskabel zum Pfostenstecker durchgeführt. Siehe obigen Hinweis: [[Sonoff#internal|Vorbereitungen zum Flashen]]&lt;br /&gt;
&lt;br /&gt;
Der FTDI Adapter wird dann mit der USB Schnittstelle mit dem Computer verbunden.&lt;br /&gt;
&lt;br /&gt;
Zum compilieren wird in der Arduino Umgebung auch die ArduinoJson Library 5.6.4+ benötigt. Eine genaue Anleitung kann {{Link2Forum|Topic=55728|Message=473220|LinkText=hier}} nachgelesen werden. Es sollte stest die aktuelle Version der Arduino Umgebung verwendet werden, bzw. die Librarys auf Letztstand gehalten werden. &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mit Arduino compilieren===&lt;br /&gt;
[[Datei:sonoff_sw_10.jpg|thumb|left|alt=Einstellung Arduino IDE]]&lt;br /&gt;
Wer selber mit der Arduino IDE compilieren will bitte folgende Einstellungen beachten. Die anschließenden Arbeiten sind dann gleich wie bei Abschnitt &#039;&#039;&#039;fertige Binary&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Unbedingt die neueste [https://github.com/bblanchon/ArduinoJson Arduino Json Library] benutzen (siehe oben)! Es gibt zwar keine Compilerfehler, aber es kommt anschließend zu Fehlfunktionen in der ESP Bridge!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 Generic ESP8266 Module&lt;br /&gt;
 Flash Mode: QIO&lt;br /&gt;
 Flash Frequency: 40 MHz&lt;br /&gt;
 CPU Frequency: 80 MHz&lt;br /&gt;
 Flash Size: 1M (64K SPIFFS)&lt;br /&gt;
 Debug Port: disabled&lt;br /&gt;
 Debug Level: none&lt;br /&gt;
 Reset Mode: ck&lt;br /&gt;
 Upload Speed: 115200&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===fertige Binary flashen===&lt;br /&gt;
[[Datei:sonoff_sw_7.jpg|thumb|left|alt=NodeMCU Firmware Flasher]]&lt;br /&gt;
Es empfiehlt sich eine fertige Binary von ESPEasy aufzuspielen. In diesem Wiki wurde R140 verwendet.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den [http://www.esp8266.nu/index.php/Main_Page Link von ESPEasy] und das [https://learn.adafruit.com/building-and-running-micropython-on-the-esp8266/flash-firmware Handbuch] für den Flasher.&lt;br /&gt;
&lt;br /&gt;
In manchen Versionen von ESPEasy (zB.R120) ist auch ein Flasher beigelegt, welcher zwar keine grafische Oberfläche hat aber hervorragend funktioniert. Wenn andere versagen, geht es mit diesem Flasher immer noch, einfach probieren!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 Netzspannung darf &#039;NICHT&#039; angeschlossen sein!!!&lt;br /&gt;
 Taster am Sonoff gedrückt halten&lt;br /&gt;
 FTDI Adapter verbinden&lt;br /&gt;
 Taster am Sonoff los lassen&lt;br /&gt;
 Sketch übertragen&lt;br /&gt;
 Sonoff vom FTDI trennen&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Wenn einmal die Firmware auf das sonoff Modul geflasht worden ist, kann in Zukunft ESPEasy direkt unter Tools via HTTP dies durchführen. Es muss dazu kein FTDI Konverter mehr verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==ESPEasy==&lt;br /&gt;
[[Datei:sonoff_sw_11.jpg|thumb|left|alt=ESPEasy Devices]]&lt;br /&gt;
Wenn das Modul fertig geflasht ist und die Verbindung zum Modul hergestellt ist, können die Einstellungen in ESPEasy durchgeführt werden.&lt;br /&gt;
Dazu am Webinterface anmelden und zunächst die zwei Devices definieren.&lt;br /&gt;
&lt;br /&gt;
Der Hersteller hat für das &#039;&#039;&#039;Relaise GPIO 12&#039;&#039;&#039; und für die &#039;&#039;&#039;grüne Led GPIO 13&#039;&#039;&#039; vorgesehen. Der &#039;&#039;&#039;Taster ist an GPIO 0&#039;&#039;&#039; angeschlossen.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Device Schalter===&lt;br /&gt;
[[Datei:sonoff_sw_12.jpg|thumb|left|alt=Device Relais]]&lt;br /&gt;
Bei den Devices sollten die hier dargestellte Einstellungen beachtet werden. Der Switch (PUMP) sollte auf Input gestellt werden, sodass die anschließenden und benötigten Rules aktiviert werden können.&lt;br /&gt;
&lt;br /&gt;
Da beide Devicenamen gleich benannt wurden (PUMP) wird in FHEM nur ein Device angelegt! Die dazugehörenden Valuenames sind unterschiedlich (Relay, Key).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Device Taster===&lt;br /&gt;
[[Datei:sonoff_sw_13.jpg|thumb|left|alt=Device Key]]&lt;br /&gt;
Der Taste muss natürlich nur konfiguriert werden, wenn auch händisch am Modul geschaltet werden soll. Wird dies nicht benötigt, können auch die Rules geändert bzw. angepasst werden. Doch alleine zu Testzwecken ist es eine nützliche Sache.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Rules===&lt;br /&gt;
[[Datei:sonoff_sw_14.jpg|thumb|left|alt=Rules]]&lt;br /&gt;
Da das sonoff Modul auch einen eingebauten Taster hat und somit auch lokal bedient werden kann, sollte man zunächst unter &#039;&#039;&#039;Tools / Advanced das Häckchen Rules&#039;&#039;&#039; aktivieren, erst dann wird der Tab sichtbar und es können Rules erstellt werden.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 on PUMP#Key do&lt;br /&gt;
  if [PUMP#Relay]=1&lt;br /&gt;
    gpio,12,0&lt;br /&gt;
  else&lt;br /&gt;
    gpio,12,1&lt;br /&gt;
  endif&lt;br /&gt;
 endon&lt;br /&gt;
 on PUMP#Relay do&lt;br /&gt;
  if [PUMP#Relay]=1 &lt;br /&gt;
    gpio,13,0&lt;br /&gt;
  else&lt;br /&gt;
    gpio,13,1&lt;br /&gt;
  endif&lt;br /&gt;
 endon&lt;br /&gt;
Diese Rules ermöglichen, das bei lokaler Bedienung durch den Taster auch die &#039;&#039;&#039;Led&#039;&#039;&#039; richtig geschaltet wird.&lt;br /&gt;
Mit &#039;on PUMP#Key do&#039; wird geprüft ob die Taste gedrückt ist und schaltet dann entsprechend die Led. Mit den Rules können auch Timer oder sonstige Spielereien realisiert werden. Siehe dazu das [http://www.esp8266.nu/index.php/Tutorial_Rules Tutorial] von ESPeasy.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ESPEasy in FHEM einrichten==&lt;br /&gt;
[[Datei:sonoff_sw_9.jpg|thumb|left|alt=FHEM Konfiguration]]&lt;br /&gt;
Dies ist eine einfache Darstellung wie FHEM automatisch den Device erstellt.&lt;br /&gt;
&lt;br /&gt;
Damit FHEM mit ESPEasy und dem sonoff Modul kommunizieren kann, muss in der fhem.cfg vorerst nur die espBridge mit dem hier dargestellten Eintrag aktiviert werden.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 define espBridge ESPEasy bridge 8383&lt;br /&gt;
Dies ist eigentlich die einzige Zeile die in fhem.cfg angelegt werden muss. Die restliche Konfiguration wird von FHEM automatisch generiert. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ##########################################&lt;br /&gt;
 ###             ESPEASY               ####&lt;br /&gt;
 ##########################################&lt;br /&gt;
 &lt;br /&gt;
 define ESPEasy_sonoff_1_PUMP ESPEasy 10.0.0.37 80 espBridge sonoff_1_PUMP&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP IODev espBridge&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP devStateIcon on:rc_GREEN:off off:rc_RED:on absent:rc_BLUE:off gpio:rc_YELLOW:off&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP eventMap /gpio 12 on:on/gpio 12 off:off/gpio 12 gpio:off/gpio 12 output:off/&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP group ESPEasy Device&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP icon hue_filled_outlet&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP room ESPEasy&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP setState 0&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP stateFormat {ReadingsVal($name,&amp;quot;presence&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;absent&amp;quot; ? &amp;quot;absent&amp;quot; : ReadingsVal($name,&amp;quot;Relay&amp;quot;,&amp;quot;&amp;quot;)}&lt;br /&gt;
 attr ESPEasy_sonoff_1_PUMP webCmd :&lt;br /&gt;
&lt;br /&gt;
hier ein Beispiel wie es auch manuell leicht modifiziert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sw_8.jpg|thumb|left|alt=sonoff Readings]]&lt;br /&gt;
&lt;br /&gt;
Die Readings werden durch die Bridge (Modul ESPEasy) automatisch angelegt.&lt;br /&gt;
&lt;br /&gt;
Es besteht hier noch genug Spielraum um zB. auch noch Temperatursensoren an das Modul anzuschließen und ebenfalls in FHEM darzustellen.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MQTT Server einrichten==&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier geht es ausschließlich um den Sketch von Arends und MQTT an den sonoff Modulen! }}&lt;br /&gt;
Es bleibt jedem Anwender die freie Wahl ob die Kommunikation über die ESPEasy-Bridge oder MQTT erfolgen soll. MQTT ist bei der Einrichtung etwas komplexer, da hier auch auf dem Server der Broker installiert werden muss.&lt;br /&gt;
&lt;br /&gt;
Im wesentlichen beschränkt sich die Installation eines MQTT Servers aber auf wenige Arbeitsschritte und ist wie folgt beschrieben durchzuführen. Wer schon einen &#039;&#039;&#039;mosquitto&#039;&#039;&#039; auf dem Server installiert hat, kann diesen Schritt überspringen.&lt;br /&gt;
&lt;br /&gt;
Dieses Kapitel ist insofern interessant, da mit dem Sketch von Theo Arends auch die Einbindung der neuen sonoff Pow Module bereits möglich ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # aus dem mosquitto Repo installieren:&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-wheezy.list&lt;br /&gt;
 # oder für jessie&lt;br /&gt;
 sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 # mosquitto installieren, sowie client Befehl mosquito_sub (gehört nicht zum Server, wird aber weiter unten benötigt)&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;
&lt;br /&gt;
&lt;br /&gt;
===Software Arends Sketch===&lt;br /&gt;
[[Datei:sonoff_sw_22.jpg|thumb|left|alt=Arends Menü]]&lt;br /&gt;
&lt;br /&gt;
Ebenso bietet sich die Möglichkeit eine andere alternative Software auf den unterschiedlichen Sonoff Modellen aufzuspielen.&lt;br /&gt;
Speziell für diese Module zugeschnittene Software stammt vom Autor Theo Arends. Alle hier gezeigten Bildschirmfotos und Beispiele beziehen sich auf Basis der Version Tasmota (Stand 22.02.2017).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links zu Theo Arend Github&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/arendst/Sonoff-Tasmota.git Donwload Tasmota]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/arendst/Sonoff-Tasmota Arends Tasmota Github]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; sollten Probleme mit dem ersten Login im Webinterface auftreten, hat der Autor vorgesorgt und mit speziellem wiederholten Tastendruck können verschiedene Modi aufgerufen werden: zB: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 x Taste kurz drücken&#039;&#039;&#039; und eine Smartconfig wird gestartet und die &#039;&#039;&#039;SSID&#039;&#039;&#039; und das &#039;&#039;&#039;Passwort&#039;&#039;&#039; kann über diese [https://play.google.com/store/apps/details?id=com.cmmakerclub.iot.esptouch Android App] eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 x Taste kurz drücken&#039;&#039;&#039; und man bringt den Device in den &#039;&#039;&#039;Access Point Mode&#039;&#039;&#039; mit der IP-Adresse &#039;&#039;&#039;192.168.4.1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bis zu 7 verschiedene Modi sind möglich, mehr dazu in Arends Wiki.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/arendst/Sonoff-MQTT-OTA-Arduino/wiki/Button-usage Link zum Wiki Arends, Button]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_bv_01.jpg|thumb|left|alt=Arduino Boardverwalter]]&lt;br /&gt;
In der Arduino IDE unter Datei / Voreinstellungen im Feld &amp;quot;Zusätzliche Boardverwalter-URLs:&amp;quot; den Link: http://arduino.esp8266.com/stable/package_esp8266com_index.json einfügen. &lt;br /&gt;
&lt;br /&gt;
Dann unter &#039;&#039;&#039;Werkzeuge / Board / Boardverwalter&#039;&#039;&#039; ganz am Ende der Liste die Librarys für &amp;quot;esp8266 by ESP8266 Community&amp;quot; die letzte Version zu installieren. {{Link2Forum|Topic=46205|Message=534707|LinkText=Link zum Board}}.&lt;br /&gt;
Im Tasmota Verzeichnis \lib werden auch die zum kompilieren benötigten Librarys zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Das gesamte Sonoff Verzeichnis aus [https://github.com/arendst/Sonoff-Tasmota/archive/master.zip Arendts Sketch] entpacken (ist wie hier verlinkt ein Zipfile) und dann aus diesem Verzeichnis die sonoff.ino öffnen. Es können dann alle zu dem Sketch zugehörigen Dateien angesehen/editiert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Anschließend sollte noch die Datei &#039;&#039;&#039;user_config.h&#039;&#039;&#039; (im Unterverzeichnis &amp;quot;sonoff&amp;quot;) editiert werden. Die Abschnitte          &lt;br /&gt;
&lt;br /&gt;
 // Wifi&lt;br /&gt;
 // Syslog&lt;br /&gt;
 // Ota&lt;br /&gt;
 // MQTT&lt;br /&gt;
&lt;br /&gt;
müssen mit der eigenen &amp;quot;&#039;&#039;&#039;Ip-Adresse-Server&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;SSID&#039;&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;&#039;password&#039;&#039;&#039;&amp;quot; angepasst werden, das erleichtert den ersten Connect mit dem Modul. Seit der Version 2.1.2 können die WIFI Einstellungen 2-fach angegeben werden, somit wechselt das Device automatisch auf den 2. Wifi Hotspot wenn der erste nicht erreicht wird.&lt;br /&gt;
&lt;br /&gt;
 #define STA_SSID               &amp;quot;SSID&amp;quot;      // Wifi SSID&lt;br /&gt;
 #define STA_PASS               &amp;quot;password&amp;quot;  // Wifi password&lt;br /&gt;
 #define WIFI_HOSTNAME          &amp;quot;%s-%04d&amp;quot;         // Expands to &amp;lt;MQTT_TOPIC&amp;gt;-&amp;lt;last 4 decimal chars of MAC address&amp;gt;&lt;br /&gt;
 #define WIFI_CONFIG_TOOL       WIFI_WPSCONFIG    // Default tool if wifi fails to connect (WIFI_SMARTCONFIG, WIFI_MANAGER or WIFI_WPSCONFIG)&lt;br /&gt;
&lt;br /&gt;
 // Syslog&lt;br /&gt;
 #define SYS_LOG_HOST           &amp;quot;Ip-Adresse-Server&amp;quot;&lt;br /&gt;
 #define SYS_LOG_PORT           514&lt;br /&gt;
 #define SYS_LOG_LEVEL          LOG_LEVEL_NONE&lt;br /&gt;
 #define SERIAL_LOG_LEVEL       LOG_LEVEL_INFO&lt;br /&gt;
 #define WEB_LOG_LEVEL          LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
 // Ota&lt;br /&gt;
 #if (ARDUINO &amp;gt;= 168)&lt;br /&gt;
  #define OTA_URL              &amp;quot;http://Ip-Adresse-Server:80/api/arduino/&amp;quot; PROJECT &amp;quot;.ino.bin&amp;quot;&lt;br /&gt;
 #else&lt;br /&gt;
  #define OTA_URL              &amp;quot;http://Ip-Adresse-Server:80/api/arduino/&amp;quot; PROJECT &amp;quot;.cpp.bin&amp;quot;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
 // MQTT&lt;br /&gt;
 #define MQTT_HOST              &amp;quot;Ip-Adresse-Server&amp;quot;&lt;br /&gt;
 #define MQTT_PORT              1883&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Im Userprofile des Arduino Kompilers (%userprofile%\Documents\Arduino\libraries\pubsubclient\src\PubSubClient.h) die Max Packet Size auf 512 erhöht werden!&lt;br /&gt;
&lt;br /&gt;
  #define MQTT_MAX_PACKET_SIZE 512&lt;br /&gt;
  #define MQTT_KEEPALIVE 120&lt;br /&gt;
Anpassung der max. Packet Size auf 512 und das Keepalive auf 120&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Anschluß wird der Sketch mit der Arduino IDE (getestet mit 1.6.12) compiliert und die Binary dann exportiert (Sketch / Kompilierte Binärdatei exportieren). Die erzeugte .bin Datei dann mit dem Tool &amp;quot;ESP8266Flasher.exe&amp;quot; flashen, so wie auch bei ESPEasy. Sehr gut funktioniert aud das Esptool. Wer nicht compilieren will, kann auch im Unterverzeichnis ./api/arduino/ die fertige Binary ( sonoff.ino ) benutzen, aber dann ohne Voreinstellung der lokalen IPs.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MQTT testen===&lt;br /&gt;
[[Datei:sonoff_sw_20.jpg|thumb|left|alt=Arends Menü]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach erfolgtem Flash des Modules kann das Webinterface des Moduls zum ersten Mal aufgerufen werden (im Router nach der IP des Moduls suchen).&lt;br /&gt;
&lt;br /&gt;
Es bieten sich hier mehrere Möglichkeiten die die weitere Einrichtung des Moduls unterstützen. Einfach die Menüpunkte durchprobieren, sie erklären sich von selbst. Für erste Tests empfiehlt sich die lokale Konsole um die Ereignisse aus Sicht des Modules mit verfolgen zu können. Alles was hier gesendet wird, sollte ebenfalls am Server mitgeloggt werden können. Wenn bis hierher alles funktioniert, kann dann mir der Konfiguration in FHEM beginnen.&lt;br /&gt;
&lt;br /&gt;
Der Name des Moduls kann unter &amp;quot;Configuration&amp;quot; -&amp;gt; &amp;quot;Configure MQTT&amp;quot; -&amp;gt; &amp;quot;Topic (sonoff)&amp;quot; nachgeschaut und geändert werden. In FHEM wird beim definieren des Moduls dieser Name in den subscribeReadings bzw. publishSets eingegeben um die Verbindung zum Modul herzustellen.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Server jetzt eine Konsole öffnen und folgende Topic (alle) einstellen.&lt;br /&gt;
&lt;br /&gt;
 mosquitto_sub -d -v -t \# &lt;br /&gt;
Mit dieser Einstellung werden alle Topics geloggt! &lt;br /&gt;
&lt;br /&gt;
 pi@raspberry ~ $ mosquitto_sub -d -v -t \#&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoff_dht/DHT/TEMPERATURE&#039;, ... (6 bytes))&lt;br /&gt;
 tele/sonoff_dht/DHT/TEMPERATURE 21.8 C&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoff_dht/DHT/HUMIDITY&#039;, ... (6 bytes))&lt;br /&gt;
 tele/sonoff_dht/DHT/HUMIDITY 41.7 %&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoff_dht/TIME&#039;, ... (19 bytes))&lt;br /&gt;
 tele/sonoff_dht/TIME 2017-02-22T16:05:43&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow3/STATE&#039;, ... (104 bytes))&lt;br /&gt;
 tele/sonoffpow3/STATE {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:05:44&amp;quot;, &amp;quot;Uptime&amp;quot;:100, &amp;quot;LIGHT&amp;quot;:&amp;quot;ON&amp;quot;, &amp;quot;Wifi&amp;quot;:{&amp;quot;AP&amp;quot;:2, &amp;quot;SSID&amp;quot;:&amp;quot;Pergola&amp;quot;, &amp;quot;RSSI&amp;quot;:96}}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow3/ENERGY&#039;, ... (134 bytes))&lt;br /&gt;
 tele/sonoffpow3/ENERGY {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:05:44&amp;quot;, &amp;quot;Yesterday&amp;quot;:0.083, &amp;quot;Today&amp;quot;:0.055, &amp;quot;Period&amp;quot;:0, &amp;quot;Power&amp;quot;:0, &amp;quot;Factor&amp;quot;:0.00, &amp;quot;Voltage&amp;quot;:229, &amp;quot;Current&amp;quot;:0.000}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;stat/TestSwitch/RESULT&#039;, ... (14 bytes))&lt;br /&gt;
 stat/TestSwitch/RESULT {&amp;quot;POWER&amp;quot;:&amp;quot;ON&amp;quot;}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;stat/TestSwitch/POWER&#039;, ... (2 bytes))&lt;br /&gt;
 stat/TestSwitch/POWER ON&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow3/STATE&#039;, ... (104 bytes))&lt;br /&gt;
 tele/sonoffpow3/STATE {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:07:14&amp;quot;, &amp;quot;Uptime&amp;quot;:100, &amp;quot;LIGHT&amp;quot;:&amp;quot;ON&amp;quot;, &amp;quot;Wifi&amp;quot;:{&amp;quot;AP&amp;quot;:2, &amp;quot;SSID&amp;quot;:&amp;quot;Pergola&amp;quot;, &amp;quot;RSSI&amp;quot;:96}}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow3/ENERGY&#039;, ... (134 bytes))&lt;br /&gt;
 tele/sonoffpow3/ENERGY {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:07:14&amp;quot;, &amp;quot;Yesterday&amp;quot;:0.083, &amp;quot;Today&amp;quot;:0.055, &amp;quot;Period&amp;quot;:0, &amp;quot;Power&amp;quot;:3, &amp;quot;Factor&amp;quot;:0.20, &amp;quot;Voltage&amp;quot;:227, &amp;quot;Current&amp;quot;:0.072}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;stat/TestSwitch/RESULT&#039;, ... (15 bytes))&lt;br /&gt;
 stat/TestSwitch/RESULT {&amp;quot;POWER&amp;quot;:&amp;quot;OFF&amp;quot;}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;stat/TestSwitch/POWER&#039;, ... (3 bytes))&lt;br /&gt;
 stat/TestSwitch/POWER OFF&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interessant sind für uns nun diese Einträge &amp;quot;stat/TestSwitch/POWER ON&amp;quot; , dazu am Taster des Sonoff manuell umschalten. Dies entspricht genau der Syntax wie sie im Anschluss in FHEM dann zu verwenden ist.&lt;br /&gt;
&lt;br /&gt;
Mit diesen Einstellungen können dann entweder nach Telemetriedaten oder nach Statusmeldungen gefiltert werden. Dies ist jedoch nur notwendig wenn bereits andere MQTT Devices am Broker hängen und es sonst zu unübersichtlich wird.&lt;br /&gt;
 mosquitto_sub -h localhost -t tele/sonoff/#    = Telemetriedaten&lt;br /&gt;
 mosquitto_sub -h localhost -t stat/sonoff/#    = Statusmeldungen&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sw_21.jpg|thumb|left|alt=Arends Log]]&lt;br /&gt;
Sehr nützlich das lokale Log zur Fehlersuche und Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MQTT in FHEM einrichten==&lt;br /&gt;
[[Datei:sonoff_sw_24.jpg|thumb|left|alt=FHEM sonoff Schalter]]&lt;br /&gt;
Dieser einfache Schalter kommuniziert bidirektional mit dem sonoff Device.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sw_25.jpg|thumb|left|alt=FHEM sonoff Schalter]]&lt;br /&gt;
Die Readings in diesem verwendeten Beispiel zeigen sich wie in FHEM gewohnt.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&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;
[https://forum.fhem.de/index.php?topic=27532.0 Link zum Forum: MQTT FHEM Einrichtung]&lt;br /&gt;
&lt;br /&gt;
 ### 1. Broker anlegen ###&lt;br /&gt;
 define myBroker MQTT 10.0.0.5:1883&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/set&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;
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_state&#039;&#039;&#039; unterschiedliche Syntax des Topic Strings haben!&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sonoff POW einrichten==&lt;br /&gt;
[[Datei:sonoff_sw_31.jpg|thumb|left|alt=Sonoff POW]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier geht es ausschließlich um das Modul Sonoff POW!}}&lt;br /&gt;
Das Modul kommt in gewohnter Itead Qualität und eine derart kostengünstige Energiemessung wird bei Smart Home Anwendern gerne eingesetzt. Die Originalsoftware habe ich nicht einmal getestet, da damit eine Anbindung an FHEM leider nicht möglich ist.&lt;br /&gt;
&lt;br /&gt;
Ebenso möchte kaum jemand an eine nicht dokumentierte chinesische Cloud die Steuerbefehle seiner Schalter senden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei einer Charge des Sonoff POW gibt es Kontaktprobleme beim Sicherungshalter. ITAED hat deshalb eine Rückrufaktion gestartet: [https://www.itead.cc/blog/sonoff-th16-and-pow-recall-notice Link zur Rückrufaktion]. Bitte unbedingt die Kontaktierung des Sicherungshalter überprüfen bzw. neuen Sicherungshalter einsetzen!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_sw_33.jpg|thumb|left|alt=Sonoff POW]]&lt;br /&gt;
Bitte auf keinen Fall das Modul während der Arbeiten an die Netzspannung anschießen. Zum Flashen genügt (und nur diese) die Versorgungspannung des USB-TTL Konverters. Wie auf dem Foto gut erkennbar, wurde dieses Modul ohne einlöten einer Pfostensteckerleiste geflasht. Die Steckverbindung wird einfach in die Lötaugen gesteckt und mit einem Gummiring fixiert, da ja spätere Flashvorgänge im Webif des Models funktionieren und so die Arbeit eingespart werden kann. Es steht jedoch nichts im Wege die Pfostensteckerleiste einzulöten.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Die Anschlüsse am Modul sind wie folgt belegt.&lt;br /&gt;
 o GND&lt;br /&gt;
 o TxD&lt;br /&gt;
 o RxD&lt;br /&gt;
 o VDD&lt;br /&gt;
&lt;br /&gt;
Für den Flashvorgang gelten die selben Regeln wie schon beim sonoff Switch oben erwähnt (3,3V!).&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sonoff POW Software===&lt;br /&gt;
[[Datei:sonoff_sw_35.jpg|thumb|left|alt=Sonoff POW FHEM]]&lt;br /&gt;
Als Software steht im Augenblick nur der Sketch von Arends zur Verfügung, liefert aber alles was das Herz begehrt und ist ist einfach zu handhaben. Hier eine eine einfache Darstellung mit der aktuellen Leistung und dem Tagesverbrauch. Zusätzlich besteht auch noch die Möglichkeit den angeschlossenen Verbraucher Ein- oder Auszuschalten. &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_pow_02.jpg|thumb|left|alt=Sonoff POW Webif]]&lt;br /&gt;
Seit Version 2.0.19a ist auch die Leistungsanzeige im WEBIF wie im Bild links integriert. Auch der Energieverbrauch des Vortages wird mit angezeigt. Alle hier angezeigten Daten werden auch zyklisch im MQTT String an FHEM übergeben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich kann im Sketch auch das Feature &amp;quot;&#039;&#039;&#039;Power_Limit&#039;&#039;&#039;&amp;quot; aktiviert werden. Mit dem Power_Limit wird eine zusätzliche Nachricht erzeugt, wenn ein bestimmter einstellbarer Grenzwert über- oder unterschritten wird. &lt;br /&gt;
&lt;br /&gt;
Es lassen sich dadurch Meldungen wie &amp;quot;Waschmaschine fertig&amp;quot; oder ähnliches ohne weitere Schwellwert Überwachungen in FHEM ableiten. Die Meldungen kommen in MQTT mit &amp;quot;&#039;&#039;&#039;POWER_LOW ON&#039;&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;&#039;POWER_LOW OFF&#039;&#039;&#039;&amp;quot;.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei erstmaligen Start des Modules muss der Typ des Modules von &amp;quot;SONOFF&amp;quot; auf &amp;quot;&#039;&#039;&#039;SONOFF_Pow&#039;&#039;&#039;&amp;quot; geändert werden, damit die Software weiß mit welchem Modul es zu tun hat und kann dann die entsprechenden Berechnungen durchführen. Die Leistungsdaten kommen ja in Form einer Frequenz aus dem Baustein und müssen im Sketch (xsns_hlw8102.ino) umgerechnet werden.&lt;br /&gt;
                                            &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_sw_36.jpg|thumb|left|alt=Sonoff POW Attribute]]&lt;br /&gt;
Dieses Bild zeigt die Attribute die vom Modul via MQTT an FHEM geliefert werden.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
aktuell gelieferter JSON String vom Sketch der alle Messdaten beinhaltet.&lt;br /&gt;
 {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:38:47&amp;quot;, &amp;quot;Yesterday&amp;quot;:&amp;quot;2.286&amp;quot;, &amp;quot;Today&amp;quot;:&amp;quot;1.593&amp;quot;, &amp;quot;Period&amp;quot;:9, &amp;quot;Power&amp;quot;:231, &amp;quot;Factor&amp;quot;:&amp;quot;1.00&amp;quot;, &amp;quot;Voltage&amp;quot;:231, &amp;quot;Current&amp;quot;:&amp;quot;0.866&amp;quot;}&lt;br /&gt;
und hier das zugehörige Reading.&lt;br /&gt;
 tele/sonoffpow/ENERGY    &lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
Hier ein Mittschnitt des Datenverkehrs zum Broker zwecks Kontrolle der korrekten Funktion der Module und der Software.&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow/STATE&#039;, ... (103 bytes))&lt;br /&gt;
 tele/sonoffpow/STATE {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:39:15&amp;quot;, &amp;quot;Uptime&amp;quot;:79, &amp;quot;LIGHT&amp;quot;:&amp;quot;OFF&amp;quot;, &amp;quot;Wifi&amp;quot;:{&amp;quot;AP&amp;quot;:2, &amp;quot;SSID&amp;quot;:&amp;quot;Liwest&amp;quot;, &amp;quot;RSSI&amp;quot;:54}}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow/ENERGY&#039;, ... (140 bytes))&lt;br /&gt;
 tele/sonoffpow/ENERGY {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:39:15&amp;quot;, &amp;quot;Yesterday&amp;quot;:&amp;quot;1.391&amp;quot;, &amp;quot;Today&amp;quot;:&amp;quot;1.191&amp;quot;, &amp;quot;Period&amp;quot;:0, &amp;quot;Power&amp;quot;:0, &amp;quot;Factor&amp;quot;:&amp;quot;0.00&amp;quot;, &amp;quot;Voltage&amp;quot;:0, &amp;quot;Current&amp;quot;:&amp;quot;0.000&amp;quot;}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoff_wall1/STATE&#039;, ... (105 bytes))&lt;br /&gt;
 tele/sonoff_wall1/STATE {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:39:15&amp;quot;, &amp;quot;Uptime&amp;quot;:96, &amp;quot;POWER&amp;quot;:&amp;quot;OFF&amp;quot;, &amp;quot;Wifi&amp;quot;:{&amp;quot;AP&amp;quot;:2, &amp;quot;SSID&amp;quot;:&amp;quot;Pergola&amp;quot;, &amp;quot;RSSI&amp;quot;:100}}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow3/STATE&#039;, ... (104 bytes))&lt;br /&gt;
 tele/sonoffpow3/STATE {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:39:20&amp;quot;, &amp;quot;Uptime&amp;quot;:100, &amp;quot;LIGHT&amp;quot;:&amp;quot;ON&amp;quot;, &amp;quot;Wifi&amp;quot;:{&amp;quot;AP&amp;quot;:2, &amp;quot;SSID&amp;quot;:&amp;quot;Pergola&amp;quot;, &amp;quot;RSSI&amp;quot;:96}}&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;tele/sonoffpow3/ENERGY&#039;, ... (134 bytes))&lt;br /&gt;
 tele/sonoffpow3/ENERGY {&amp;quot;Time&amp;quot;:&amp;quot;2017-02-22T16:39:20&amp;quot;, &amp;quot;Yesterday&amp;quot;:0.083, &amp;quot;Today&amp;quot;:0.057, &amp;quot;Period&amp;quot;:0, &amp;quot;Power&amp;quot;:0, &amp;quot;Factor&amp;quot;:0.00, &amp;quot;Voltage&amp;quot;:230, &amp;quot;Current&amp;quot;:0.000}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Einstellungen können mit folgender Syntax angefordert werden (zwei Terminalfenster öffnen, eines zum protokollieren und eines zum Seden der Befehle).&lt;br /&gt;
 mosquitto_sub -d -v -t \#  MQTT Datenverkehr protokolieren&lt;br /&gt;
 mosquitto_pub -q 2 -t cmnd/sonoffpow/status/set -m &amp;quot;8&amp;quot;      = SonoffPOW Status jetzt auslesen&lt;br /&gt;
 mosquitto_pub -q 2 -t cmnd/sonoffpow/TelePeriod/set -m &amp;quot;60&amp;quot; = Timer setzen, alle 60 Sekunden Daten senden &lt;br /&gt;
Die Kommandos können direkt am Broker (Terminalfenster Putty etc.) abgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonoff POW Kalibrieren ===&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wie der &#039;&#039;Sonoff POW kalibriert&#039;&#039; werden kann. }}&lt;br /&gt;
Ab Version 2.0.11 kann nun auch der POW kalibriert werden.&lt;br /&gt;
Dazu kann man 2 Konsolenfenster öffnen, im ersten aktiviert man das Protokoll für den Datenverkehr&lt;br /&gt;
 mosquitto_sub -d -v -t \#  MQTT Datenverkehr protokollieren&lt;br /&gt;
&lt;br /&gt;
Dann kann mit folgenden Befehlen die HLW Referenz Pulsfrequenz gesetzt werden.&lt;br /&gt;
 mosquitto_pub -q 2 -t cmnd/sonoffpow/HLWUCAL/set -m &amp;quot;2100&amp;quot;     default = 1950&lt;br /&gt;
 mosquitto_pub -q 2 -t cmnd/sonoffpow/HLWICAL/set -m &amp;quot;2450&amp;quot;     default = 3500&lt;br /&gt;
 mosquitto_pub -q 2 -t cmnd/sonoffpow/HLWPCAL/set -m &amp;quot;13500&amp;quot;    default = 12345 &lt;br /&gt;
Entweder man hat eine definierte Last zur Verfügung oder besser man misst mit einem Leistungsmesser nach. Die Spannung kann man mit einem Multimeter nachmessen (sollte 230 V sein) und der Strom wird errechnet (bei 100 Watt I = P / U ) = 100/230 = 0,4347.&lt;br /&gt;
Die Referenzwerte solange geringfügig ändern bis die Ausgabe passt. Für die Ausgabe wird einfach eine Statusabfrage durchgeführt.&lt;br /&gt;
&lt;br /&gt;
 mosquitto_pub -q 2 -t cmnd/sonoffpow/status/set -m &amp;quot;8&amp;quot;&lt;br /&gt;
Befehl für die Statusabfrage&lt;br /&gt;
&lt;br /&gt;
 cmnd/sonoffpow/status/set 8&lt;br /&gt;
 Received PUBLISH (d0, q0, r0, m0, &#039;stat/sonoffpow/STATUS&#039;, ... (103 bytes))&lt;br /&gt;
 stat/sonoffpow/STATUS PWR: Voltage 225 V, Current 0.427 A, Current Power 98 W, Total Power Today 0.080 kWh, Power Factor 1.00&lt;br /&gt;
Ergebnis der Statusabfrage mit Spannung, Strom und Leistung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sonoff POW FHEM Anbindung===&lt;br /&gt;
Ein Beispiel einer einfachen Anbindung via JSON an FHEM. MQTT von Arends ist insofern notwendig, da in der Software ESPEasy und der Bridge noch keine Implementierung der Frequenzumrechnung enthalten ist.&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_Pow MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Pow IODev myBroker&lt;br /&gt;
 attr Sonoff_Pow icon measure_power&lt;br /&gt;
 attr Sonoff_Pow publishSet ON OFF cmnd/sonoffpow/POWER&lt;br /&gt;
 attr Sonoff_Pow stateFormat {sprintf(&amp;quot;aktuell: %.1f W Tag: %.2f Kw/h&amp;quot;, ReadingsVal($name,&amp;quot;Power&amp;quot;,undef), ReadingsVal($name,&amp;quot;Today&amp;quot;,undef))}&lt;br /&gt;
 attr Sonoff_Pow subscribeReading_ENERGY tele/sonoffpow/ENERGY&lt;br /&gt;
 attr Sonoff_Pow subscribeReading_POWER stat/sonoffpow/POWER&lt;br /&gt;
 attr Sonoff_Pow subscribeReading_state cmnd/sonoffpow/POWER&lt;br /&gt;
 attr Sonoff_Pow webCmd ON:OFF&lt;br /&gt;
Zusätzlich kann hier noch das Relais mit &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; ein- ausgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Ebenso notwendig ist das setzen der Regexp für den JSON Konverter.&lt;br /&gt;
 define ej3 expandJSON Sonoff.*:.*:.{.*}&lt;br /&gt;
hier wird alles was mit dem Namen Sonoff beginnt gefiltert und automatisch alle darin enthaltenen Readings erstellt.&lt;br /&gt;
&lt;br /&gt;
 define ej3 expandJSON Sonoff.*:ENERGY.*:.{.*} (Power|Yesterday|Today)&lt;br /&gt;
oder so, da werden nur die Readings Power, Yesterday und Today erstellt.&lt;br /&gt;
Somit ist auch kalr, das in FHEM auch JSON installiert sein muss. Ebenso können die verschiedenen Regexp im [https://github.com/ddtlabs/expandJSON Wiki] nachgelesen werden.&lt;br /&gt;
&lt;br /&gt;
[https://forum.fhem.de/index.php/topic,66761.15.html Link zum Diskussionsthread].&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Source Reading:&#039;&#039;&#039;&lt;br /&gt;
 device:reading:.{.*} &lt;br /&gt;
 .*WifiIOT.*:sensor.*:.{.*} &lt;br /&gt;
 sonoff_.*:.*:.{.*} &lt;br /&gt;
 dev.*:(sensor1|sensor2|teleme.*):.{.*} &lt;br /&gt;
 (dev.*|[Dd]evice.*):json:.{.*} &lt;br /&gt;
 (devX:jsonX:.{.*}|devY.*:jsonY:.{.*Wifi.*{.*SSID.*}.*}) &lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Target Reading:&#039;&#039;&#039;&lt;br /&gt;
 .*power.* &lt;br /&gt;
 (Current|Voltage|Wifi.*)  &lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Komplette Definition des Filters:&#039;&#039;&#039;&lt;br /&gt;
 define ej1 expandJSON device:sourceReading:.{.*} targetReading &lt;br /&gt;
 define ej3 expandJSON .*\.SEN\..*:.*:.{.*} &lt;br /&gt;
 define ej3 expandJSON sonoff_.*:sensor.*:.{.*} (power.*|current|voltage)&lt;br /&gt;
&lt;br /&gt;
===Sonoff POW Netz-Anschluß===&lt;br /&gt;
[[Datei:sonoff_sw_34.jpg|thumb|left|alt=Sonoff POW Netzanschluß]]&lt;br /&gt;
Erst wenn alle Arbeiten an der Hard- und Software abgeschlossen sind, kann man das Modul an die Netzspannung anschließen. Wer es sich einfach machen will, nimmt eine Industriell gefertigte 230 V Verlängerung  (zwischen 1,5 - 3 Meter) und schneidet sie in der Mitte durch. Nach dem abisolieren der flexiblen Drähte sollte diese &#039;&#039;&#039;verlötet oder mit Aderendhülsen&#039;&#039;&#039; versehen werden (müssen aber exakt passen, da hier kaum Platz in den Klemmen ist). &lt;br /&gt;
Mit einem kleinen Schraubendreher kann man die Feder der Klemmen niederdrücken und das verzinnte Drahtende tief ich die Öffnung stecken. Es dürfen keine Drahtlitzen aus den Öffnungen sichtbar sein, Kurzschlußgefahr! Ebenso sollte eine Zugprobe durchgeführt werden ob die Klemme auch richtig eingerastet ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; diese Arbeiten müssen von einem ausgebildeten Fachpersonal (Elektriker) durchgeführt werden, Lebensgefahr!&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sonoff POW Design===&lt;br /&gt;
&lt;br /&gt;
====ReadingsGroup mit Schaltmöglichkeit====&lt;br /&gt;
[[Datei:sonoff_pow_03.jpg|thumb|left|alt=readingsGroup mit Schalter]]&lt;br /&gt;
Die ReadingsGroup kann auch gleich mit einem Schalter versehen werden um den POW Ein- oder Aus schalten zu können. Dazu ist aber eine andere Einstellung im Sketch erforderlich.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der &amp;quot;&#039;&#039;&#039;user_config.h&#039;&#039;&#039;&amp;quot; muss an dieser Stelle auch die &amp;quot;&#039;&#039;&#039;PUB_PREFIX&#039;&#039;&#039;&amp;quot; auf die gleiche Topic wie &amp;quot;PUB_PREFIX2&amp;quot; eingestellt werden. Durch diese Maßnahme wird erreicht, dass sofort nach dem Knopfdruck auch der Status mit der Topic &amp;quot;tele&amp;quot; übertragen wird. Würde der weiterhin mit &amp;quot;stat&amp;quot; übertragen, kann er in der Readingsgroup nur sehr umständlich weiter behandelt werden. Dadurch wird erreicht, dass der Schalter sofort nach dem Schaltvorgang und der Rückmeldung (Status) auch seine Farbe ändert. Wird dieser Eintrag vergessen, ändert der Schalter erst nach Eintreffen der nächsten zyklischen Abfrage seinen Status/Farbe.&lt;br /&gt;
&lt;br /&gt;
 #define SUB_PREFIX             &amp;quot;cmnd&amp;quot;       // Sonoff devices subscribe to:- SUB_PREFIX/MQTT_TOPIC and SUB_PREFIX/MQTT_GRPTOPIC&lt;br /&gt;
 #define PUB_PREFIX             &amp;quot;tele&amp;quot;       // Sonoff devices publish to:- PUB_PREFIX/MQTT_TOPIC&lt;br /&gt;
 #define PUB_PREFIX2            &amp;quot;tele&amp;quot;       // Sonoff devices publish telemetry data to:- PUB_PREFIX2/MQTT_TOPIC/UPTIME, POWER/LIGHT and TIME&lt;br /&gt;
hier die PUB_PREFIX mit der geänderten Topic &amp;quot;tele&amp;quot; anstatt &amp;quot;stat&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define SonoffPows readingsGroup &amp;lt;%measure_power&amp;gt;,&amp;lt;aktuell&amp;gt;,&amp;lt;Tag&amp;gt;,&amp;lt;Gestern&amp;gt;,&amp;lt;Strom&amp;gt;,&amp;lt;Durchschnitt&amp;gt;,&amp;lt;max.P&amp;gt;,&amp;lt;Zyklus&amp;gt;,&amp;lt;Faktor&amp;gt;,&amp;lt;Status&amp;gt;,&amp;lt; hr &amp;gt; .*(Sonoff_Pow|Sonoff_Pow2|Sonoff_Pow3|Sonoff_Pow4):Power,Today,Yesterday,Current,Power_avg_day,Power_max_day,Period,Factor,LIGHT&lt;br /&gt;
 attr SonoffPows commands {&#039;LIGHT.ON&#039; =&amp;gt; &#039;set $DEVICE OFF&#039;,&#039;LIGHT.OFF&#039; =&amp;gt; &#039;set $DEVICE ON&#039;}&lt;br /&gt;
 attr SonoffPows mapping %ALIAS&lt;br /&gt;
 attr SonoffPows nameStyle style=&amp;quot;color:yellow&amp;quot;&lt;br /&gt;
 attr SonoffPows room Energie,MQTT&lt;br /&gt;
 attr SonoffPows valueFormat {&#039;Power&#039; =&amp;gt;&amp;quot;%.0f W&amp;quot;, &#039;Today&#039; =&amp;gt;&amp;quot;%.2f Kw&amp;quot;,&#039;Yesterday&#039; =&amp;gt;&amp;quot;%.2f Kw&amp;quot;, &#039;CURRENT&#039; =&amp;gt;&amp;quot;%.2f A&amp;quot;,&#039;Power_max_day&#039; =&amp;gt; &amp;quot;%.0f W&amp;quot;,&#039;Power_avg_day&#039; =&amp;gt; &amp;quot;%.2f W&amp;quot;,&#039;Power&#039;=&amp;gt;&amp;quot;%.0f W&amp;quot;,&#039;Factor&#039; =&amp;gt; &amp;quot;%.2f &amp;quot;}&lt;br /&gt;
 attr SonoffPows valueIcon {&#039;LIGHT.ON&#039; =&amp;gt; &#039;rc_GREEN@green&#039;, &#039;LIGHT.OFF&#039; =&amp;gt; &#039;rc_RED@red&#039;}&lt;br /&gt;
 attr SonoffPows valueStyle { if($READING eq &amp;quot;Power&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 0 &amp;amp;&amp;amp; $VALUE &amp;lt;= 100){ &#039;style=&amp;quot;color:green;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 100 &amp;amp;&amp;amp; $VALUE &amp;lt; 200){ &#039;style=&amp;quot;color:orange;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 200){ &#039;style=&amp;quot;color:red;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Today&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 4.8){ &#039;style=&amp;quot;color:red;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Today&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 2.5){ &#039;style=&amp;quot;color:green;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Today&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 2.5 &amp;amp;&amp;amp; $VALUE &amp;lt; 4.8 ){ &#039;style=&amp;quot;color:orange;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Yesterday&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 2.5){ &#039;style=&amp;quot;color:green;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Yesterday&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 2.5 &amp;amp;&amp;amp; $VALUE &amp;lt; 4.8 ){ &#039;style=&amp;quot;color:orange;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Yesterday&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 4.8){ &#039;style=&amp;quot;color:red;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Current&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 0.45){&#039;style=&amp;quot;color:green;;text-align:right&amp;quot;&#039;}elsif( $READING eq &amp;quot;Current&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 0.45 &amp;amp;&amp;amp; $VALUE &amp;lt; 0.87 ){&#039;style=&amp;quot;color:orange;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Current&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 0.87){ &#039;style=&amp;quot;color:red;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power_avg_day&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 100){ &#039;style=&amp;quot;color:lightgreen;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power_avg_day&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 100 &amp;amp;&amp;amp; $VALUE &amp;lt; 200 ){ &#039;style=&amp;quot;color:orange;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power_avg_day&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 200){ &#039;style=&amp;quot;color:red;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Period&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 10){ &#039;style=&amp;quot;color:lightgreen;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Period&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 10 &amp;amp;&amp;amp; $VALUE &amp;lt; 15 ){ &#039;style=&amp;quot;color:orange;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Period&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 15){ &#039;style=&amp;quot;color:red;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power_max_day&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 100){ &#039;style=&amp;quot;color:lightgreen;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power_max_day&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 100 &amp;amp;&amp;amp; $VALUE &amp;lt; 200 ){ &#039;style=&amp;quot;color:orange;;text-align:right&amp;quot;&#039; }elsif( $READING eq &amp;quot;Power_max_day&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt;= 200){ &#039;style=&amp;quot;color:red;;text-align:right&amp;quot;&#039;}}&lt;br /&gt;
Dieses Beispiel ist für &#039;&#039;&#039;Tasmota mit JSON&#039;&#039;&#039; ausgelegt und benötigt ebenso wie oben die Erweiterung &amp;quot;average&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_Pow_CURRENT_POWER average Sonoff_Pow:Power.*&lt;br /&gt;
damit werden der Durchschnitt und min max für Tasmota mit JSON erzeugt.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====POW mit FTUI anzeigen====&lt;br /&gt;
[[Datei:sonoff_pow_energy.JPG|thumb|left|alt=Tablett FTUI]]&lt;br /&gt;
Wer möchte kann die Energieanzeigen auch mit der {{Link2Forum|Topic=34233|LinkText=Tablett UI}} für eine Tablet Ansicht gestalten. Mit dieser stehen viele Möglichkeiten zu einer attraktiven Darstellung zur Verfügung.&lt;br /&gt;
Hier ein Beispiel welches mit den Widget &amp;quot;[http://www.fhemwiki.de/wiki/FHEM_Tablet_UI#Widget_THERMOSTAT thermostat]&amp;quot; dargestellt ist.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sonoff Slampher Flashen==&lt;br /&gt;
[[Datei:sonoff_sl_53.jpg|thumb|left|alt=Sonoff SLAMPHER]]&lt;br /&gt;
Dieses Modul ist eine Besonderheit was das Flashen betrifft, denn mit Hilfe des Tasters kann der ESP8266 NICHT in den Flashmode gebracht werden. Der Taster ist intern anderwärtig verdrahtet und somit für diesen Zweck nicht zu gebrauchen.&lt;br /&gt;
&lt;br /&gt;
Wie hier links im Bild zu sehen ist, muss der rechte Pin des R20 (oben im Bild) während dem Einstecken des USB Steckers auf Masse gelegt werden. Die beste Möglichkeit ist ein Stücken Draht anzulöten und diesen dann beim einstecken auf den Masse Pin des USB-Konverters zu legen.&lt;br /&gt;
&lt;br /&gt;
Pinbelegung des Steckers von oben nach unten:&lt;br /&gt;
 o - GND&lt;br /&gt;
 o - TxD&lt;br /&gt;
 o - RxD&lt;br /&gt;
 &#039;&#039;&#039;o&#039;&#039;&#039; - Vdd&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sl_51.jpg|thumb|left|alt=Sonoff SLAMPHER R20]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier ist genau ersichtlich, wo der R20 auf der Platine platziert ist. }}&lt;br /&gt;
Hier nocheinmal schön zu sehen wo der R20 (der ist nicht eingelötet sondern leer) exakt auf der Platine liegt, gemeint ist der rechte Pin. Hier kann auch leicht gelötet werden, da keine empfindlichen Bauteile in der Nähe sind und auch genug Platz vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_sl_50.jpg|thumb|left|alt=Sonoff SLAMPHER R20]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier ist genau ersichtlich, wo der Draht am R20 aufgelötet wurde }}&lt;br /&gt;
Hier ist ein kleines Stück Schaltdraht auf den Pin bereist aufgelötet und bereit zum Flashen!&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wurde keine Pfostensteckerleiste auf die Platine aufgelötet, sondern nur durchgesteckt und mit einem Gummiring  zum Relais fixiert, das erspart den Lötvorgang, weil in Zukunft dann ohnehin OTA geflasht werden kann.&lt;br /&gt;
&lt;br /&gt;
Also Pin20 auf Masse legen und USB-Konverter an den PC einstecken, dann den Draht von der Masse entfernen. Der ESP8266 sollte jetzt im Flashmodus bereit stehen und kann wie bereits oben beschrieben geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sonoff Slampher Software===&lt;br /&gt;
[[Datei:sonoff_sl_54.jpg|thumb|left|alt=Sonoff SLAMPHER FHEM]]&lt;br /&gt;
&lt;br /&gt;
Als Software wird Arends Sketch installiert (Kommunikation über MQTT), da zum derzeitigen Zeitpunkt ESPEasy das Modul noch nicht integriert hat und somit auch nicht ansteuern kann.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_SL MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_SL IODev myBroker&lt;br /&gt;
 attr Sonoff_SL devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON&lt;br /&gt;
 attr Sonoff_SL icon hue_filled_br30&lt;br /&gt;
 attr Sonoff_SL publishSet ON OFF cmnd/sonoffsl/POWER/set&lt;br /&gt;
 attr Sonoff_SL room Bewegung,_Sonoff&lt;br /&gt;
 attr Sonoff_SL stateFormat Licht&lt;br /&gt;
 attr Sonoff_SL subscribeReading_Licht tele/sonoffsl/POWER&lt;br /&gt;
 attr Sonoff_SL subscribeReading_state cmnd/sonoffsl/POWER/set&lt;br /&gt;
 attr Sonoff_SL webCmd ON:OFF&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel wie in FHEM der Slampher eingebunden werden kann. In diesem Beispiel wird davon ausgegangen, das im Modul die Topic &amp;quot;sonoffsl&amp;quot; benannt wurde. Wer einen anderen Namen haben möchte, muss dies dann auch in FHEM entsprechend anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sonoff Th10/16 FHEM==&lt;br /&gt;
[[Datei:sonoff_th_01.jpg|thumb|left|alt=Sonoff TH10]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Temperatur Modul TH10 / 16! }}&lt;br /&gt;
Das Modul kann durch drücken des Tasters während dem Einstecken des USB-Konverters in den Flashmodus gebracht werden.&lt;br /&gt;
Der Th10/16 kann mit zwei unterschiedlichen Typen von Sensoren bestückt werden, hier im Beispiel mit dem externen Temperaturfühler DS18B20.&lt;br /&gt;
&lt;br /&gt;
Wie im Bild klar zu sehen ist, kann das Webif auch zur Darstellung via Mobile verwendet werden. Mit &amp;quot;Toggle&amp;quot; wird Ein- oder Aus geschaltet und  darunter ist die aktuelle Temperatur ersichtlich. Für diese Ansicht muss keine MQTT Verbindung eingerichtet werden, da die Kommunikation hier rein über HTTP erfolgt.&lt;br /&gt;
&lt;br /&gt;
Die unten dargestellten Beispiele für FHEM beziehen sich auf Arends Sketch, also über MQTT. Dieses Modul kann aber genauso leicht über ESPEasy und der ESPEasy-Bridge eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Pinbelegung des Steckers von oben nach unten:&lt;br /&gt;
 o - GND&lt;br /&gt;
 o - TxD&lt;br /&gt;
 o - RxD&lt;br /&gt;
 &#039;&#039;&#039;o&#039;&#039;&#039; - Vdd&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_th_02.jpg|thumb|left|alt=Sonoff TH10]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Einbindung in FHEM via MQTT! }}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ### Temperatur und Luftfeuchte vom Sonoff Switch ###&lt;br /&gt;
 define Sonoff_Temp MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Temp IODev myBroker&lt;br /&gt;
 attr Sonoff_Temp alias Pool Wasser&lt;br /&gt;
 attr Sonoff_Temp eventMap ON:on OFF:off&lt;br /&gt;
 attr Sonoff_Temp icon temperature_humidity&lt;br /&gt;
 attr Sonoff_Temp publishSet ON OFF cmnd/sonoffth/POWER/set&lt;br /&gt;
 attr Sonoff_Temp room _Sonoff&lt;br /&gt;
 attr Sonoff_Temp stateFormat {sprintf(&amp;quot;Temperatur: %.1f Grad&amp;quot;, ReadingsVal($name,&amp;quot;temperature&amp;quot;,0))}&lt;br /&gt;
 attr Sonoff_Temp subscribeReading_SENSOR tele/sonoffth/SENSOR&lt;br /&gt;
 attr Sonoff_Temp subscribeReading_state cmnd/sonoffth/POWER/set&lt;br /&gt;
Beispiel für FHEM mit Temperaturanzeige mit DS18B20&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_Switch MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Switch IODev myBroker&lt;br /&gt;
 attr Sonoff_Switch alias Pool Licht&lt;br /&gt;
 attr Sonoff_Switch devStateIcon on:rc_GREEN:off off:rc_RED:on&lt;br /&gt;
 attr Sonoff_Switch eventMap ON:on OFF:off&lt;br /&gt;
 attr Sonoff_Switch icon light_ceiling&lt;br /&gt;
 attr Sonoff_Switch publishSet ON OFF cmnd/sonoffth/POWER/set&lt;br /&gt;
 attr Sonoff_Switch room _Sonoff&lt;br /&gt;
 attr Sonoff_Switch stateFormat Licht&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Licht tele/sonoffth/POWER&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_state cmnd/sonoffth/POWER/set&lt;br /&gt;
 attr Sonoff_Switch webCmd ON:OFF&lt;br /&gt;
Der Schalter nochmals seperat dargestellt, je nach Geschmack.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sonoff 4CH 4-Kanal Schaltmodul==&lt;br /&gt;
[[Datei:sonoff_ch4_1.jpg|thumb|left|alt=Sonoff CH4]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Achtung andere Einstellungen der Arduino IDE: Select Board &amp;quot;Generic ESP8285 Module&amp;quot; (=Flash Mode &amp;quot;DOUT&amp;quot;) and Flash Size &amp;quot;1M (64K SPIFFS)&amp;quot;n! }}&lt;br /&gt;
&lt;br /&gt;
Der Sonoff 4CH ist mit seinen 4 Kanälen ein sehr preiswertes Modul im Gehäuse und für Hutschinenmontage. Anstatt des üblichen ESP8266 besitzt dieses Modul schon den moderneren &#039;&#039;&#039;ESP8285&#039;&#039;&#039;. Es müssen daher in der Arduino IDE andere Einstellungen vorgenommen werden. Unter Board wird hier das &amp;quot;&#039;&#039;&#039;Generic 8285 Module&#039;&#039;&#039;&amp;quot; mit &#039;&#039;&#039;1M und 64K Spiffs&#039;&#039;&#039; angewählt. Der Flashmode &amp;quot;&#039;&#039;&#039;DOUT&#039;&#039;&#039;&amp;quot; wird dann automatisch eingestellt, bzw. ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Es ist daher unbedingt notwendig den Sketch mit den geänderten Einstellungen selbst zu kompilieren, ansonsten stürzt das Modul nach Auswahl des Typs ab  und wird nicht mehr rebooten können!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Modul ist etwas größer als die anderen Sonoff Produkte und besitzt mit 14,5 x 9 cm schon beachtliche Einbau Maße.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_ch4_2.jpg|thumb|left|alt=Sonoff 4CH FDTI]]&lt;br /&gt;
Als weitere Besonderheit sei hier erwähnt, das die Signale &#039;&#039;&#039;RxD auf RxD und TxD auf TxD&#039;&#039;&#039; des FTDI Konverters zu verbinden sind. Wie bei allen Sonoff Modulen darf man &#039;&#039;&#039;zum flashen keine Netzspannung anschließen&#039;&#039;&#039;, sondern nur über die Versorgungsspannung des FDTI Konverters mit 3,3 V versorgen (Jumper richtig setzen). Die Stiftleiste für den FTDI Anschluß ist hier schon eingelötet.&lt;br /&gt;
&lt;br /&gt;
In den Flashmodus gelangt man durch drücken der &#039;&#039;&#039;Taste FW/IO0&#039;&#039;&#039; während des einstecken des USB Anschlusses.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_ch4_3.jpg|thumb|left|alt=Sonoff 4CH Arends]]&lt;br /&gt;
Hier die Ansicht des Webinterface des Arends Sketches!&lt;br /&gt;
Bei der Software sei erwähnt, das die getestete Version 3.1.16 nur bei Kanal 1 den Modus &amp;quot;PulseTime&amp;quot; beherrscht. Wer also gepulste Ausgänge (zB: elektrische Garage/Toröffner) benötigt muss diese per Software nachbilden oder mit dem Kanal 1 auskommen. Eine &amp;quot;Pulsetime 10&amp;quot; ist ein guter Wert dafür (etwa 1 Sekunde). &lt;br /&gt;
&lt;br /&gt;
Als Alternative kann mit dieser HTML Seite des Webservers am Modul des CH4 schon mit jedem Browser fähigem Handy (Android, iPhone, Windows) aufgerufen werden und somit alle Funktionen gesteuert werden.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Datei:sonoff_ch4_4.jpg|thumb|left|alt=Sonoff CH4 Software APP]]&lt;br /&gt;
Hier dargestellt die Original Software die Sonoff zum Modul liefert (EWeLink) und über ihre Cloud verbindet. Leider kann hier keine gepulste Ausgabe erfolgen. Mit einem Countdown kann zwar der Ausgang wieder abgeschaltet werden, die kleinste Zeiteinheit ist aber 1 Minute und somit für einen Impuls leider nicht zu gebrauchen. Ebenso kann mit dieser Software keine Einbindung in FHEM erfolgen, obwohl es eine nette anschauliche Darstellung ist.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonoff 4CH 4-Kanal Anbindung FHEM===&lt;br /&gt;
Beispiel zur Anbindung in FHEM für den 4CH, hier werden einfach 4 einzelne Schalter definiert!&lt;br /&gt;
 define Sonoff_ch1 MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_ch1 IODev myBroker&lt;br /&gt;
 attr Sonoff_ch1 alias Sonoff CH1&lt;br /&gt;
 attr Sonoff_ch1 devStateIcon on:rc_GREEN:off off:rc_RED:on&lt;br /&gt;
 attr Sonoff_ch1 eventMap ON:on OFF:off ON:Ein OFF:Aus&lt;br /&gt;
 attr Sonoff_ch1 group Toröffner&lt;br /&gt;
 attr Sonoff_ch1 icon light_ceiling&lt;br /&gt;
 attr Sonoff_ch1 publishSet ON OFF cmnd/sonoffch4/POWER1/set&lt;br /&gt;
 attr Sonoff_ch1 stateFormat Power&lt;br /&gt;
 attr Sonoff_ch1 subscribeReading_Power tele/sonoffch4/POWER1&lt;br /&gt;
 attr Sonoff_ch1 subscribeReading_state cmnd/sonoffch4/POWER1/set&lt;br /&gt;
 attr Sonoff_ch1 webCmd Ein:Aus&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_ch2 MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_ch2 IODev myBroker&lt;br /&gt;
 attr Sonoff_ch2 alias Sonoff CH2&lt;br /&gt;
 attr Sonoff_ch2 devStateIcon on:rc_GREEN:off off:rc_RED:on&lt;br /&gt;
 attr Sonoff_ch2 eventMap ON:on OFF:off ON:Ein OFF:Aus&lt;br /&gt;
 attr Sonoff_ch2 group Toröffner&lt;br /&gt;
 attr Sonoff_ch2 icon light_ceiling&lt;br /&gt;
 attr Sonoff_ch2 publishSet ON OFF cmnd/sonoffch4/POWER2/set&lt;br /&gt;
 attr Sonoff_ch2 stateFormat Power&lt;br /&gt;
 attr Sonoff_ch2 subscribeReading_Power tele/sonoffch4/POWER2&lt;br /&gt;
 attr Sonoff_ch2 subscribeReading_state cmnd/sonoffch4/POWER2/set&lt;br /&gt;
 attr Sonoff_ch2 webCmd Ein:Aus&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_ch3 MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_ch3 IODev myBroker&lt;br /&gt;
 attr Sonoff_ch3 alias Sonoff CH3&lt;br /&gt;
 attr Sonoff_ch3 devStateIcon on:rc_GREEN:off off:rc_RED:on&lt;br /&gt;
 attr Sonoff_ch3 eventMap ON:on OFF:off ON:Ein OFF:Aus&lt;br /&gt;
 attr Sonoff_ch3 group Toröffner&lt;br /&gt;
 attr Sonoff_ch3 icon light_ceiling&lt;br /&gt;
 attr Sonoff_ch3 publishSet ON OFF cmnd/sonoffch4/POWER3/set&lt;br /&gt;
 attr Sonoff_ch3 stateFormat Power&lt;br /&gt;
 attr Sonoff_ch3 subscribeReading_Power tele/sonoffch4/POWER3&lt;br /&gt;
 attr Sonoff_ch3 subscribeReading_state cmnd/sonoffch4/POWER3/set&lt;br /&gt;
 attr Sonoff_ch3 webCmd Ein:Aus&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_ch4 MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_ch4 IODev myBroker&lt;br /&gt;
 attr Sonoff_ch4 alias Sonoff CH4&lt;br /&gt;
 attr Sonoff_ch4 devStateIcon on:rc_GREEN:off off:rc_RED:on&lt;br /&gt;
 attr Sonoff_ch4 eventMap ON:on OFF:off ON:Ein OFF:Aus&lt;br /&gt;
 attr Sonoff_ch4 group Toröffner&lt;br /&gt;
 attr Sonoff_ch4 icon light_ceiling&lt;br /&gt;
 attr Sonoff_ch4 publishSet on off cmnd/sonoffch4/POWER4/set&lt;br /&gt;
 attr Sonoff_ch4 stateFormat Power&lt;br /&gt;
 attr Sonoff_ch4 subscribeReading_Power tele/sonoffch4/POWER4&lt;br /&gt;
 attr Sonoff_ch4 subscribeReading_state cmnd/sonoffch4/POWER4/set&lt;br /&gt;
 attr Sonoff_ch4 webCmd Ein:Aus&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Erweiterungen=&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sonoff Switch mit Temperatur + Luftfeuchte== &lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier geht es um nützliche Hardware Erweiterungen an den Originalmodulen!}}&lt;br /&gt;
Wozu überhaupt den Switch erweitern wenn es auch die Modelle TH10 und TH16 gibt?&lt;br /&gt;
&lt;br /&gt;
Manche Personen können dadurch dem Basteltrieb nachkommen, aber das wesentliche ist der Preis, da die Switches doch fast um die Hälfte billiger sind. Die Sensoren kosten ebenfalls kaum nennenswerte Beträge.&lt;br /&gt;
&lt;br /&gt;
Oder es hat schon jemand Switches im Einsatz und möchte jetzt zusätzlich die Temperatur erfassen!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware erweitern mit DHT22 ===&lt;br /&gt;
[[Datei:sonoff_sw_4.PNG|thumb|left|alt=Sonoff Switch Pinleiste mit Temperatur]]&lt;br /&gt;
Am Sonoff Switch wurde ja schon eine Stiftleiste zum Flashen eingelötet. Diese Stiftleiste bietet schon alle Anschlüsse welche für die Temperatur- und Luftfeuchtemessung benötigt werden. Am 5. Anschluß der Stifftleiste ist das Signal &amp;quot;SCL&amp;quot; (GPIO14) herausgeführt, welches für den DHT22 zur Erfassung der Messdaten benötigt wird. Der Sonsor wird mit einem einem 3-poligen Kabel (zB: ein Steckkabel für ein Breadboard oder direkt anlöten) verbunden. Damit der DHT22 korrekt funktioniert, wird ein Widerstand mit 4,7 K Ohm zwischen Vdd und Data am DHT22 zusätzlich benötigt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sw_45.jpg|thumb|left|alt=AM2302 / DHT22]]&lt;br /&gt;
&lt;br /&gt;
Ansicht des DHT22 (AM2302) mit den aufgesteckten Verbindungskabeln. Von links nach rechts sind das&lt;br /&gt;
&lt;br /&gt;
 1 = VCC 3,3 V&lt;br /&gt;
 2 = Data&lt;br /&gt;
 3 = nc (nicht belegt)&lt;br /&gt;
 4 = GND&lt;br /&gt;
&lt;br /&gt;
Pin1 (VCC) des DHT22 muss also auf Pin1 der Stiftleiste, Pin2 (Data) auf Pin5 und Pin4 (GND) auf Pin4. &lt;br /&gt;
Pin2 und Pin1 soll hier noch der Widerstand aufgelötet werden.&lt;br /&gt;
&lt;br /&gt;
 1 ------- 1 (VDD)&lt;br /&gt;
 2 ------- 5 (GPIO14)&lt;br /&gt;
 3&lt;br /&gt;
 4 ------- 4 (GND)&lt;br /&gt;
 DHT22  Stiftleiste&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sw_44.jpg|thumb|left|alt=umgebautes Modul]]&lt;br /&gt;
Diese Darstellung zeigt das umgebaute und bereits verschlossene Modul. Auf der Seite des Tasters (bitte nur hier, da auf der anderen Seite die 230 V verlaufen und neben der Lebensgefahr auch den Sensor beeinflussen) ist hier einfach mit einer Eisensäge ein Schlitz eingesägt, der dient in diesem Falle als Kabeldurchführung. Ein Schlitz ist besser als ein Loch, da der Oberteil des Gehäuses sich leichter aufsetzen läßt. Wer ein längeres Kabel benötigt, kann natürlich auch ein 3-poliges Telefonkabel (oder Mikrokabel oder sonstiges) verwenden. Der Sensor sollte etwas Abstand zum Gehäuse haben, da dieses auch eine Eigenerwärmung hat. Wer es ganz originalgetreu lösen will, kann auch eine 3-polige Mini Buchse für Klinckenstecker (3,5mm) einbauen so wie sie am TH10/16 vorhanden ist.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software anpassen am Beispiel MQTT ===&lt;br /&gt;
[[Datei:sonoff_sw_40.jpg|thumb|left|alt=Sonoff MQTT]]&lt;br /&gt;
&lt;br /&gt;
Die richtige Auswahl des Sensors und des verwendeten GPIO erfolgt im WEBIF des Modules und wird seit Tasmota nur mehr dort eingestellt. Eventuell sollte das aktuell verwendete [https://github.com/ddtlabs/expandJSON/ JSON Filter] geändert/erweitert werde (siehe beim Modul POW).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Anpassung DHT22 in FHEM ===&lt;br /&gt;
[[Datei:sonoff_sw_41.jpg|thumb|left|alt=umgebautes Modul]]&lt;br /&gt;
&lt;br /&gt;
Links in der Hardcopy sind die Readings die nach der Anpassung von FHEM (Broker) befüllt werden sollten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ### Temperatur und Luftfeuchte vom Sonoff Switch ###&lt;br /&gt;
 define Sonoff_Temp MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Temp IODev myBroker&lt;br /&gt;
 attr Sonoff_Temp icon temperature_humidity&lt;br /&gt;
 attr Sonoff_Temp room MQTT&lt;br /&gt;
 attr Sonoff_Temp stateFormat {sprintf(&amp;quot;Temperatur: %.1f Grad Feuchte: %.1f &amp;quot;, ReadingsVal($name,&amp;quot;temperature&amp;quot;,0), ReadingsVal($name,&amp;quot;humidity&amp;quot;,0))}&lt;br /&gt;
 attr Sonoff_Temp subscribeReading_Sensor tele/sonoff/SENSOR&lt;br /&gt;
Hier die zusätzliche Erweiterung um die Temperatur und die Luftfeuchte in FHEM. Der in der Topic verwendete Name &amp;quot;sonoff&amp;quot; muss natürlich der Einstellung in der Software am Switch entsprechen. Bei Verwendung mehrerer Switches muss natürlich auch der Name bei jedem geändert werden.&lt;br /&gt;
&lt;br /&gt;
Als Regexp für JSON kann dieser Filter eingesezt werden.&lt;br /&gt;
 define ej3 expandJSON .*\.SEN\..*:.*:.{.*} &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logfile für die Temperatur ===&lt;br /&gt;
 define SVG_FileLog_Sonoff_Temp SVG myDbLog:SVG_FileLog_Sonoff_Temp:HISTORY&lt;br /&gt;
 attr SVG_FileLog_Sonoff_Temp room MQTT&lt;br /&gt;
&lt;br /&gt;
Und schließlich fehlt noch das Logfile, damit der Temperaturverlauf auch in schönen Plots dargestellt werden kann.&lt;br /&gt;
Das hier verwendete Beispiel funktioniert nur mit einer DbLog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sonoff Switch als Thermostat verwenden mit MQTT== &lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_sw_55.jpg|thumb|left|alt=Thermostat]]&lt;br /&gt;
Mit diesem einfachen Beispiel wird ein Pelett Ofen mit einem externen Thermostat (sonoff Switch oder TH10/16) gesteuert. Zum besseren Überblick wird die Steuerung in einzelne Module getrennt, es könnte aber auch einiges zu einer einzigen Definition zusammen gefasst werden. Der Thermostat könnte auch als Frostwächter benutzt werden und ein anderes Heizgerät steuern.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 ###################################&lt;br /&gt;
 ### Sonoff Thermostat Regelung ####&lt;br /&gt;
 ###################################&lt;br /&gt;
 define Sonoff_dht MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_dht IODev myBroker&lt;br /&gt;
 attr Sonoff_dht alias Raumtemperatur&lt;br /&gt;
 attr Sonoff_dht group Thermostat&lt;br /&gt;
 attr Sonoff_dht icon temperature_humidity&lt;br /&gt;
 attr Sonoff_dht publishSet ON OFF cmnd/sonoff_dht/POWER/set&lt;br /&gt;
 attr Sonoff_dht room _Sonoff&lt;br /&gt;
 attr Sonoff_dht stateFormat {sprintf(&amp;quot;Temperatur: %.1f Grad Feuchte: %.1f &amp;quot;, ReadingsVal($name,&amp;quot;temperature&amp;quot;,0),  ReadingsVal($name,&amp;quot;humidity&amp;quot;,0))}&lt;br /&gt;
 attr Sonoff_dht subscribeReading_Sensor tele/sonoff_dht/SENSOR&lt;br /&gt;
 attr Sonoff_dht subscribeReading_state cmnd/sonoff_dht/POWER/set&lt;br /&gt;
FHEM Definition zur Erfassung der Temperatur und der Luftfeuchte. Damit dieses Beispiel funktioniert, ist am Sonoff Modul die Topic &amp;quot;&#039;&#039;&#039;sonoff_dht&#039;&#039;&#039;&amp;quot; zu setzen. Dieser Temperaturwert dient dem Thermostat als ISTWert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define Sonoff_Sw MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Sw IODev myBroker&lt;br /&gt;
 attr Sonoff_Sw alias Pellets Ofen&lt;br /&gt;
 attr Sonoff_Sw devStateIcon on:rc_GREEN:off off:rc_RED:on&lt;br /&gt;
 attr Sonoff_Sw eventMap ON:on OFF:off&lt;br /&gt;
 attr Sonoff_Sw group Thermostat&lt;br /&gt;
 attr Sonoff_Sw icon sani_boiler_temp&lt;br /&gt;
 attr Sonoff_Sw publishSet ON OFF cmnd/sonoff_dht/POWER/set&lt;br /&gt;
 attr Sonoff_Sw room _Sonoff&lt;br /&gt;
 attr Sonoff_Sw stateFormat Licht&lt;br /&gt;
 attr Sonoff_Sw subscribeReading_Licht tele/sonoff_dht/POWER&lt;br /&gt;
 attr Sonoff_Sw subscribeReading_state cmnd/sonoff_dht/POWER/set&lt;br /&gt;
 attr Sonoff_Sw webCmd ON:OFF&lt;br /&gt;
FHEM Definition zum Absetzen der Befehle für das Relais (Thermostat) Ein- / Aus. Wenn das zu steuernde Geräte einen potentialfreien Thermostatanschluß benötigt (in den meisten Fällen), muss noch ein Relais dazwischen geschaltet werden um die Trennung der Netzspannung zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
 define ThermostatPellets dummy&lt;br /&gt;
 attr ThermostatPellets alias Pellets Ofen Sollwert&lt;br /&gt;
 attr ThermostatPellets group Thermostat&lt;br /&gt;
 attr ThermostatPellets icon temp_control&lt;br /&gt;
 attr ThermostatPellets room _Sonoff&lt;br /&gt;
 attr ThermostatPellets setList state:0,5,10,12,13,14,15,16,17,17.5,18,18.5,19,19.5,20,20.5,21,21.5,22,23,24,25,26,27&lt;br /&gt;
 attr ThermostatPellets webCmd state&lt;br /&gt;
Die Sollwertvorgabe für das Thermostat durch einen Dummy, damit können die gewünschten Temperaturen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
 ### sofort ausführen wenn neuer Sollwert eingestellt wird ###&lt;br /&gt;
 define Thermostat_on_notify notify ThermostatPellets IF (ReadingsVal(&amp;quot;Sonoff_Sw&amp;quot;,&amp;quot;state&amp;quot;,0) eq &amp;quot;OFF&amp;quot; &amp;amp;&amp;amp; (ReadingsVal(&amp;quot;Sonoff_dht&amp;quot;,&amp;quot;temperature&amp;quot;,0) &amp;lt;= Value(&amp;quot;ThermostatPellets&amp;quot;))) (set Sonoff_Sw ON)&lt;br /&gt;
 define Thermostat_off_notify notify ThermostatPellets IF (ReadingsVal(&amp;quot;Sonoff_Sw&amp;quot;,&amp;quot;state&amp;quot;,0) eq &amp;quot;ON&amp;quot; &amp;amp;&amp;amp; (ReadingsVal(&amp;quot;Sonoff_dht&amp;quot;,&amp;quot;temperature&amp;quot;,0) &amp;gt; Value(&amp;quot;ThermostatPellets&amp;quot;))) (set Sonoff_Sw OFF)&lt;br /&gt;
Mit einem notify wird die manuelle Änderung des Sollwertes überwacht und sofort reagiert.&lt;br /&gt;
&lt;br /&gt;
 ## zyklisch prüfen ob Sollwert erreicht wurde ###&lt;br /&gt;
 define Thermostat_on at +*00:15:00 IF (ReadingsVal(&amp;quot;Sonoff_Sw&amp;quot;,&amp;quot;Licht&amp;quot;,0) eq &amp;quot;OFF&amp;quot; &amp;amp;&amp;amp; (ReadingsVal(&amp;quot;Sonoff_dht&amp;quot;,&amp;quot;temperature&amp;quot;,0) &amp;lt;= Value(&amp;quot;ThermostatPellets&amp;quot;))) (set Sonoff_Sw ON)&lt;br /&gt;
 define Thermostat_off at +*00:15:00 IF (Value(&amp;quot;Sonoff_Sw&amp;quot;) eq &amp;quot;ON&amp;quot; &amp;amp;&amp;amp; (ReadingsVal(&amp;quot;Sonoff_dht&amp;quot;,&amp;quot;temperature&amp;quot;,0) &amp;gt; Value(&amp;quot;ThermostatPellets&amp;quot;))) (set Sonoff_Sw OFF)&lt;br /&gt;
Hier noch die Soll- Ist Wertvergleiche zur Steuerung. Es wird alle 15 Minuten überprüft ob die Temperatur erreicht ist. Bei einer trägen Heizung sollten 15 Minuten ausreichend sein, wer will kann dies aber auch alle 5 oder 10 Minuten prüfen.&lt;br /&gt;
Da des öfteren die Bezeichnungen der Readings im Sketch geändert werden ( zB:temperature ), bitte die richtige Schreibweise ( Groß/Klein ) in den Readings kontrollieren und gegebenenfalls hier anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sonoff Switch mit Bewegungsmelder HC-SR501== &lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_pir_1.jpg|thumb|left|alt=Bewegungsmelder]]&lt;br /&gt;
Basierend auf dem Wall Switch MQTT Sketch von Arends wurde hier ein Sonoff BASIC + PIR HC-SR501 in eine größere Verteilerdose eingebaut, der Sonoff wurde dabei etwas gekürzt. Die Bewegungsmelder sind ab etwa 70 Cent erhältlich.&lt;br /&gt;
&lt;br /&gt;
Der Sketch kann auch den Blink Modus. Damit kann man im Alarmfall z.B. Alle Strahler rings ums Haus blinken lassen.&lt;br /&gt;
&lt;br /&gt;
Mehr dazu kann hier im {{Link2Forum|Topic=63824|LinkText=Forum}}im Diskussionsthread nachgelesen werden.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_pir_2.jpg|thumb|left|alt=Bewegungsmelder]]&lt;br /&gt;
Ein Beispiel wir der Bewegungsmelder in der Feuchtraumdose montiert werden kann. Wird der Bewegungsmelder abgesetzt vom Switch montiert, ist darauf zu achten das die Kabel nicht zu lange werden.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
===Spannungsversorgung des HC-SR501===&lt;br /&gt;
[[Datei:sonoff_pir_4.jpg|thumb|left|alt=5V für Bewegungsmelder]]&lt;br /&gt;
Der HC-SR501 wird vom Sonoff versorgt, wobei hier die 3,3 V nicht immer ausreichen. Es ist deshalb am HC-SR501 eine Diode zu überbrücken, dann reichen die 3,3V vom Sonoff. Es können aber auch am Sonoff die 5V angezapft werden. Hier im Bild dargestellt wo die 5V angezapft werden können.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_pir_5.jpg|thumb|left|alt=3,3V für Bewegungsmelder]]&lt;br /&gt;
Hier eine kleine Übersicht der wichtigsten Teile und deren Platzierung am HC-SR501. &lt;br /&gt;
Den PIR kann man auch mit 3,3V betreiben wenn man die Diode am Eingang nach Vcc überbrückt, dann reicht die Spannung für einen reibungslosen Betrieb völlig aus. Dies gilt für den HC-SR501, wird ein anderer PIR verwendet muss man nachschauen ob das auch möglich ist, ansonsten die 5V Variante wählen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Einbindung des HC-SR501 in FHEM===&lt;br /&gt;
 # ------------- Sonoff_pir mit Bewegungsmelder ---------------&lt;br /&gt;
 define Sonoff_pir MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_pir IODev myBroker&lt;br /&gt;
 attr Sonoff_pir eventMap ON:on OFF:off&lt;br /&gt;
 attr Sonoff_pir group Sonoff&lt;br /&gt;
 attr Sonoff_pir icon hue_filled_br30&lt;br /&gt;
 attr Sonoff_pir publishSet ON OFF cmnd/sonoff_pir/POWER/set&lt;br /&gt;
 attr Sonoff_pir room MQTT&lt;br /&gt;
 attr Sonoff_pir stateFormat Licht&lt;br /&gt;
 attr Sonoff_pir subscribeReading_Licht stat/sonoff_pir/POWER&lt;br /&gt;
 attr Sonoff_pir subscribeReading_state cmnd/sonoff_pir/POWER/set&lt;br /&gt;
 attr Sonoff_pir webCmd :&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel wie der Sonoff Switch in FHEM eingebunden wird. Wenn im Sketch der Prefix von stat auf tele geändert wurde, ist dies auch hier durchzuführen ( subscribeReading_Licht tele/sonoff_pir/POWER ), ansonsten bleibt es so wie im Beispiel. Getestet wurde dieses Beispiel mit Version 3.1.6. Die Topic sollte auf den Namen &amp;quot;sonoff_pir&amp;quot; eingestellt werden. Bei anderen Namen ist dies entsprechend in FHEM anzupassen. &lt;br /&gt;
&lt;br /&gt;
Mit dem Kommando &#039;&#039;&#039;BUTTONTOPIC Alarm_SO2&#039;&#039;&#039; ( direkt im Webinterface des Sonoff ) wird der Wall Switch GPIO14 vom Sonoff entkoppelt und somit sendet der Bewegungsmelder direkt an FHEM --&amp;gt; Motion_pir MQTT_DEVICE&lt;br /&gt;
&lt;br /&gt;
Es sollte auch unbedingt kontrolliert werden, wie die Ausgabe des Alarmes in der Console erfolgt. Erscheint hier die Meldung &amp;quot;cmnd/Alarm_SO2/POWER = TOGGLE&amp;quot; dann muss mit dem Kommando &amp;quot;&#039;&#039;&#039;switchmode 1&#039;&#039;&#039;&amp;quot; das Ausgabeformat umgeschaltet werden, erst dann kommt das gewünschte Format &amp;quot;On&amp;quot; und &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 # ------------------ Motion_pir MQTT_DEVICE -----------------&lt;br /&gt;
 define Motion_pir MQTT_DEVICE&lt;br /&gt;
 attr Motion_pir IODev myBroker&lt;br /&gt;
 attr Motion_pir devStateIcon on:on-for-timer off:off&lt;br /&gt;
 attr Motion_pir eventMap ON:on OFF:off&lt;br /&gt;
 attr Motion_pir group Sonoff&lt;br /&gt;
 attr Motion_pir icon people_sensor&lt;br /&gt;
 attr Motion_pir room MQTT&lt;br /&gt;
 attr Motion_pir stateFormat Alarm&lt;br /&gt;
 attr Motion_pir subscribeReading_Alarm cmnd/Alarm_SO2/POWER&lt;br /&gt;
Die Motion_pir dient nun zur eigentlichen Einschaltung des Lichtes und sendet das Kommando &#039;&#039;&#039;cmnd/Alarm_SO2/POWER&#039;&#039;&#039; an den entkopellten GPIO 14 des Switch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # ------------------ DoIf zur Motion Abfrage -----------------&lt;br /&gt;
 define di_Sonoff_pir_Alarm DOIF ([Motion_pir:&amp;quot;on&amp;quot;] and [Tag_Nacht:twilight_weather] &amp;lt; 35) (set Sonoff_pir on) DOELSEIF ([Motion_pir:&amp;quot;off&amp;quot;] and [Tag_Nacht:twilight_weather] &amp;lt; 35) (set Sonoff_pir off)&lt;br /&gt;
 attr di_Sonoff_pir_Alarm comment Abhängig von Helligkeitssensor wird nachts,bei Bewegung das Licht eingeschaltet!&lt;br /&gt;
 attr di_Sonoff_pir_Alarm group Sonoff&lt;br /&gt;
 attr di_Sonoff_pir_Alarm room MQTT&lt;br /&gt;
Zusätzlich kann nun mit einem &#039;&#039;&#039;Doif&#039;&#039;&#039; verknüpft werden um das Ganze mit Tag_Nacht:twilight_weather dann in Abhängigkeit der Helligkeit zu schalten. Selbstverständlich kann jede andere Quelle mit einem Helligkeitswert verwendet werden.&lt;br /&gt;
&lt;br /&gt;
===Alarmausgabe über Grouptopic===&lt;br /&gt;
 # ------------------------ Sonoffs Group ----------------------&lt;br /&gt;
 define Sonoffs MQTT_DEVICE&lt;br /&gt;
 attr Sonoffs IODev myBroker&lt;br /&gt;
 attr Sonoffs eventMap ON:on OFF:off&lt;br /&gt;
 attr Sonoffs group Sonoff&lt;br /&gt;
 attr Sonoffs icon hue_filled_br30&lt;br /&gt;
 attr Sonoffs publishSet ON OFF cmnd/sonoffs/POWER/set&lt;br /&gt;
 attr Sonoffs room MQTT&lt;br /&gt;
 attr Sonoffs stateFormat state&lt;br /&gt;
 attr Sonoffs subscribeReading_Licht stat/sonoffs/POWER&lt;br /&gt;
 attr Sonoffs subscribeReading_state cmnd/sonoffs/POWER/set&lt;br /&gt;
Wer möchte kann auch mit der Group Topic mehrere Switches mit Bewegungsmelder zusammenfassen und alle Lampen im Alarmfall gemeinsam in den Blinkmodus schalten. cmnd/sonoffs ist das Kommando für die Group Topic, sofern diese vom User nicht verändert wurde.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sonoff Switch als IR-Sender verwenden == &lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_ir_1.jpg|thumb|left|alt=IR]]&lt;br /&gt;
Mit einem normalen Sonoff Basic Modul kann dies zu einer IR Fernbedienung hochgerüstet werden.&lt;br /&gt;
&lt;br /&gt;
Der einfache Schaltplan ist [https://raw.githubusercontent.com/altelch/SonoffIR/master/SonoffIR-Schematics.png hier] zu finden und der Nachbau ist sehr einfach. Man kann aber auch aus einer alten FB die IR-Diode ausbauen und zusammen schalten. Ein kleines Howto ist in [https://github.com/altelch/SonoffIR diesem Wiki] auf Github zu finden.&lt;br /&gt;
&lt;br /&gt;
Verwendet wird dazu der Arends Sketch.&lt;br /&gt;
&lt;br /&gt;
Als erstes sucht man sich auf [http://lirc.sourceforge.net/remotes/ LIRC]die entsprechenden FB-Codes, im Beispiel hier für einen Samsung TV 55&amp;quot; Curved UHD HU8580. Die FB ist zwar nicht exakt dieselbe, aber die Befehle passen soweit. Im Webif des Sonoff Modules ist beim angeschlossenen GPIO der IR-Diode &amp;quot;8 IRremote&amp;quot; einzustellen.&lt;br /&gt;
&lt;br /&gt;
Link zum {{Link2Forum|Topic=67316|LinkText=Forums Thread}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Wichtig sind dabei folgende Daten:&lt;br /&gt;
 name  Samsung_BN59-00940A&lt;br /&gt;
 bits           16&lt;br /&gt;
 pre_data_bits  16&lt;br /&gt;
 pre_data       0xE0E0&lt;br /&gt;
 Power On/Off   0x40BF[/code]&lt;br /&gt;
&lt;br /&gt;
Nun stellt man sich den Sendestring zusammen:&lt;br /&gt;
 predata+Befehl =  E0E0&#039;&#039;&#039;40BF&#039;&#039;&#039; (hex) = 3772793023 (dec) und 32 Bit Datenlänge.&lt;br /&gt;
&lt;br /&gt;
 Der JSON String für den IRSend ist laut [https://github.com/arendst/Sonoff-Tasmota/wiki/Commands Arends Wiki] folgender.&lt;br /&gt;
 IRsend    | {&amp;quot;protocol&amp;quot;: &amp;quot;&amp;lt;proto&amp;gt;&amp;quot;, | Send IR remote control as JSON encapsulated command.&lt;br /&gt;
           |   &amp;quot;bits&amp;quot;: 1..32         | &amp;lt;proto&amp;gt; is NEC, SONY, RC5, RC6, DISH, JVC or SAMSUNG&lt;br /&gt;
           |   &amp;quot;data&amp;quot;: 1..(2^32)-1}  | bits are the required number of data bits.&lt;br /&gt;
           |                         | data is the data frame as 32 bit unsigned integer.&lt;br /&gt;
           |                         | See http://www.lirc.org/ for more info.&lt;br /&gt;
&lt;br /&gt;
das ergibt dann unseren Befehl für die Kommandozeile am Modul. Die Bitlänge für Pre und Data sind ebenfalls zu addieren (16 + 16 = 32 Bit) und beim Arends Sketch muss im JSON Format gesendet werden:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;irsend  {&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772793023}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
oder hier für die Kommandozeile am Broker:&lt;br /&gt;
 &#039;&#039;&#039;mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772793023}&#039;&#039;&#039;&#039;&lt;br /&gt;
TestSwitch ist hier der verwendete Name des Sonoff Moduls, wird ein anderer Name verwendet ist dieser hier anzupassen.&lt;br /&gt;
&lt;br /&gt;
Jedesmal wenn nun der Befehl gesendet wird, wird entweder Ein- oder Aus geschaltet. Die Verzögerung über Wlan ist vernachlässigbar. Ebenso können die Kanäle oder die Laustärke verstellt werden. Im Prinzip funktionieren alle Befehle die auf der FB vorhanden sind.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sonoff Switch als IR-Sender FHEM Beispiel===&lt;br /&gt;
[[Datei:sonoff_ir_2.jpg|thumb|left|alt=IR]]&lt;br /&gt;
Hier ein Beispiel wie der Code für die Fernbedienung in Fhem eingebunden werden kann.&lt;br /&gt;
 define RC_TV remotecontrol&lt;br /&gt;
 attr RC_TV rc_iconpath icons/remotecontrol&lt;br /&gt;
 attr RC_TV rc_iconprefix black_btn_&lt;br /&gt;
 attr RC_TV room Entwicklung&lt;br /&gt;
 attr RC_TV row00 KEY_POWER:POWEROFF,:blank,:blank&lt;br /&gt;
 attr RC_TV row02 :blank,:blank,:blank&lt;br /&gt;
 attr RC_TV row03 KEY_1:1,KEY_2:2,KEY_3:3&lt;br /&gt;
 attr RC_TV row04 KEY_4:4,KEY_5:5,KEY_6:6&lt;br /&gt;
 attr RC_TV row05 KEY_7:7,KEY_8:8,KEY_9:9&lt;br /&gt;
 attr RC_TV row06 :blank,KEY_0:0,:blank&lt;br /&gt;
 attr RC_TV row07 :blank,:blank,:blank&lt;br /&gt;
 attr RC_TV row08 KEY_VOLUMEUP:UP,KEY_MUTE:MUTE,KEY_CHANNELUP:CHUP&lt;br /&gt;
 attr RC_TV row09 KEY_VOLUMEDOWN:DOWN,:blank,KEY_CHANNELDOWN:CHDOWN&lt;br /&gt;
&lt;br /&gt;
 define Samsung_TV notify RC_TV &amp;quot;/opt/fhem/ircmd.sh $EVENT&amp;quot;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
In einem externen Shell Script werden die Parameter übergeben und der Sendestring für den IRSend zusammen gestellt. Das Script ins FHEM Home Verzeichnis kopieren ( /opt/fhem ) und die Rechte auf 755 setzen.&lt;br /&gt;
[https://wiki.fhem.de/wiki/Remotecontrol Link zum Wiki] einer universellen Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh -e&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_POWER&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772793023}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E0E01F   3772833823&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_VOLUMEUP&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772833823}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E0D02F   3772829743&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_VOLUMEDOWN&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772829743}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E0F00F   3772837903&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_MUTE&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772837903}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E020DF   3772784863&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_1&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772784863}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E0A05F   3772817503&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_2&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772817503}&#039;&lt;br /&gt;
 fi   &lt;br /&gt;
 # E0E0609F   3772801183&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_3&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772801183}&#039;&lt;br /&gt;
 fi &lt;br /&gt;
 # E0E010EF   3772780783&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_4&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772780783}&#039;&lt;br /&gt;
 fi &lt;br /&gt;
 # E0E0906F   3772813423&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_5&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772813423}&#039;&lt;br /&gt;
 fi &lt;br /&gt;
 # E0E050AF   3772797103&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_6&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772797103}&#039;&lt;br /&gt;
 fi &lt;br /&gt;
 # E0E030CF   3772788943&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_7&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772788943}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E0B04F   3772821583&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_8&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772821583}&#039;&lt;br /&gt;
 fi &lt;br /&gt;
 # E0E0708F   3772805263&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_9&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772805263}&#039;&lt;br /&gt;
 fi         &lt;br /&gt;
 # E0E08877   3772811383&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_0&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772811383}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E048B7   3772795063&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_CHANNELUP&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772795063}&#039;&lt;br /&gt;
 fi&lt;br /&gt;
 # E0E008F7   3772778743&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;KEY_CHANNELDOWN&amp;quot; ]; then&lt;br /&gt;
  mosquitto_pub -q 2 -t cmnd/TestSwitch/IRSend/set -m &#039;{&amp;quot;protocol&amp;quot;: &amp;quot;SAMSUNG&amp;quot;,&amp;quot;bits&amp;quot;: 32, &amp;quot;data&amp;quot;: 3772778743}&#039;&lt;br /&gt;
 fi  &lt;br /&gt;
Das Script kann sehr leicht für jede andere FB abgeändert werden und auch noch zusätzliche Tasten eingebunden werden. Bitte nicht auf die vorangestellten Pre-Data-Bits vergessen. Auf die Verwendung des Scriptes kann auch verzichtet werden, wenn der JSON String in Fhem direkt zusammen gestellt wird. Für den Nachbau ist es aber leichter verständlicher und kann auch leicht selber an die eigene FB angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Sonoff Development Board==&lt;br /&gt;
[[Datei:sonoff_dev_1.jpg|thumb|left|alt=Dev. Board]]&lt;br /&gt;
Das Board kommt ohne Software und muss zunächst mit einem Sketch bespielt werden. Hier kurz beschrieben der Arends Sketch, es funktioniert aber mit ESPEasy genau so gut. &lt;br /&gt;
&lt;br /&gt;
Damit die vielen GPIO&#039;s auch nach freiem Wunsch zugeordnet werden können, müssen die erforderten Einstellungen da allerdings in der sonoff_template.h bekannt gegeben werden. Hier wurde der GPIO12 und 13 einem Relais zugeordnet. Der Rest kann dann frei im Webif konfiguriert werden (Type = User Test).&lt;br /&gt;
&lt;br /&gt;
Link zum [https://www.itead.cc/wiki/Sonoff_DEV Wiki des Herstellers]&lt;br /&gt;
&lt;br /&gt;
Link zum [https://www.itead.cc/wiki/images/3/30/01.73.02.0101_Sonoff_DEV_Schematic.pdf Schaltplan]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Anschlüsse und GPIO&#039;s am Board.&lt;br /&gt;
&lt;br /&gt;
 3V3    VDD   3.3V Power supply output  &lt;br /&gt;
 GND    GND   Power supply pin  &lt;br /&gt;
  4    GPIO4  GPIO4  &lt;br /&gt;
  5    GPIO5  GPIO5  &lt;br /&gt;
 12    GPIO12 GPIO12/HSPIQ  &lt;br /&gt;
 13    GPIO13 GPIO13/HSPID  &lt;br /&gt;
 14    GPIO14 GPIO14/HSPICLK  &lt;br /&gt;
 ADC    ADC   Detect analog input voltage（0~1V）  &lt;br /&gt;
 RX    U0RXD  Flash programming UART RX;GPIO3  &lt;br /&gt;
 TX    U0TXD  Flash programming UART TX;GPIO1;SPICS1  &lt;br /&gt;
 E-FW  GPIO0  GPIO0/SPICS2/Serial programming enable pin  &lt;br /&gt;
 RESET RESET  External reset signal(low active)  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:sonoff_dev_2.jpg|thumb|left|alt=Dev. Board]]&lt;br /&gt;
hier können die wesentlichen Funktionen (Relaisfunktion oder freier GPIO) konfiguriert werden. Man zählt die GPIO&#039;s von oben nach unten und wenn einer nicht benötigt wird, wird eine 0 angegeben.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
 { &amp;quot;User Test&amp;quot;,       // Sonoff Basic User Test&lt;br /&gt;
     GPIO_KEY1,        // GPIO00 Button&lt;br /&gt;
     0,&lt;br /&gt;
     GPIO_USER,        // GPIO02 Optional sensor&lt;br /&gt;
     GPIO_USER,        // GPIO03 Serial TXD and Optional sensor&lt;br /&gt;
     GPIO_USER,        // GPIO04 Optional sensor&lt;br /&gt;
     GPIO_USER,        // GPIO05 Optional sensor&lt;br /&gt;
     0, 0, 0, 0, 0, 0,&lt;br /&gt;
     &#039;&#039;&#039;GPIO_REL2&#039;&#039;&#039;,        // GPIO12 Relay 2 (0 = Off, 1 = On)&lt;br /&gt;
     &#039;&#039;&#039;GPIO_REL1&#039;&#039;&#039;,        // GPIO13 Relay 1 (0 = Off, 1 = On)&lt;br /&gt;
     GPIO_USER,        // GPIO14 Optional sensor&lt;br /&gt;
     0, 0&lt;br /&gt;
  }&lt;br /&gt;
Hier wurde am Modul &amp;quot;&#039;&#039;&#039;User Test&#039;&#039;&#039;&amp;quot; in der Datei &amp;quot;sonoff_template.h&amp;quot; abgeändert, um 2 Relais über GIPO12 und GPIO13 ansteuern zu können. &lt;br /&gt;
&lt;br /&gt;
Gedacht ist es als Enwicklerboard, es ist aber auch genau so gut für den produktiven Einsatz geeignet, hat aber kein eingebautes Netzteil. Es ist zum flashen &#039;&#039;&#039;kein externes FTDI Modul notwendig&#039;&#039;&#039;, das hat es bereits an Board und es muss lediglich der USB Treiber für Windows installiert werden. Geflasht wird dann mit dem USB Kabel der Spannungsversorgung.&lt;br /&gt;
&lt;br /&gt;
Die 4-pol. Stecker haben das &#039;&#039;&#039;Rastermaß 2.0 mm&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
===Sonoff Dev Board Anbindung FHEM===&lt;br /&gt;
&lt;br /&gt;
je nach Anwendungszweck wird entweder ein normaler Schalter oder wie bei DHT16 beschrieben ein oder mehrere Sensoren angebunden.&lt;br /&gt;
Beim Arends Sketch ist zu beachten, dass pro Sensorgruppe nur ein Sensor angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
 •DHT11 Temperature and Humidity -  DHT11 (1)  in group 1&lt;br /&gt;
 •DHT21 Temperature and Humidity -  AM2301 (2) in group 1&lt;br /&gt;
 •AM2301 Temperature and Humidity - AM2301 (2) in group 1&lt;br /&gt;
 •DHT22 Temperature and Humidity -  DHT22 (3)  in group 1&lt;br /&gt;
 •AM2302 Temperature and Humidity - DHT22 (3)  in group 1&lt;br /&gt;
 •AM2321 Temperature and Humidity - DHT22 (3)  in group 1&lt;br /&gt;
 •DS18B20 Temperature           - DS18x20 (4)  in group 2&lt;br /&gt;
 Enable option  USE_DS18x20  in  user_config.h  for multiple sensors using OneWire library&lt;br /&gt;
 •DS18S20 Temperature          -  DS18x20 (4)  in group 2&lt;br /&gt;
 Enable option  USE_DS18x20  in  user_config.h  using OneWire library&lt;br /&gt;
 •External switch               -  Switch (9) &lt;br /&gt;
 Use  SwitchMode  to tune it&#039;s behaviour&lt;br /&gt;
 •HC-SR501 PIR Motion Detection -  Switch (9) &lt;br /&gt;
 Use  SwitchMode  to tune it&#039;s behaviour&lt;br /&gt;
Beispiel: 2 DHT22 funktionieren nicht, aber ein DHT22 und ein DS18b20 schon. Wer mehrere Sensoren benötigt, muss auf ESPEasy ausweichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
--[[Benutzer:Reinhart|Reinhart]] ([[Benutzer Diskussion:Reinhart|Diskussion]]) 23. Feb. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=21729</id>
		<title>Anwesenheitserkennung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=21729"/>
		<updated>2017-06-16T16:04:45Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Version auf 0.81-1 geändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Viele Benutzer führen bereits eine eigene &#039;&#039;&#039;Anwesenheitserkennung&#039;&#039;&#039; durch. Diese basiert in den meisten Fällen auf Ping Checks oder bei [[AVM Fritz!Box|FritzBoxen]] auf dem Befehl &#039;&#039;ctlmgr_ctl&#039;&#039;. Diese Lösungen können aber je nach Aufbau und Funktion FHEM massiv beeinträchtigen. Aufgrund des Aufbaus vom FHEM kann dieses dadurch für mehrere Sekunden zum völligen Stillstand gebracht werden.&lt;br /&gt;
&lt;br /&gt;
In FHEM gibt es mittlerweile mehrere Module, die eine zuverlässige Anwesenheitserkennung bieten, ohne dabei FHEM bei der Ausführung zu beeinträchtigen.&lt;br /&gt;
&lt;br /&gt;
Eine erweiterte Funktion der Anwesenheitserkennung ist die Standortverfolgung, die sich nicht nur auf ein oder sehr wenige mit (eigenem) WLAN versorgte Gebiete beschränkt.&lt;br /&gt;
&lt;br /&gt;
== Vorüberlegungen ==&lt;br /&gt;
Generell gibt es mehrere Ansätze um Anwesenheitserkennung mit Handys/Smartphones durchzuführen.&lt;br /&gt;
&lt;br /&gt;
* via PING Checks im gesamten WLAN&lt;br /&gt;
* Aktivitätsprüfung auf einer FritzBox&lt;br /&gt;
* Bluetooth Checks in der gesamten Wohnung&lt;br /&gt;
* eigene Perl-Funktion&lt;br /&gt;
* aktive Benachrichtigung des Smartphones, ausgelöst z.B. über Geo-Lokation/Geofence&lt;br /&gt;
&lt;br /&gt;
Dabei gilt bei der Auswahl der Art darauf zu achten wie sich das jeweilige Device verhält. Aufgrund der Vielfältigkeit kann man hier keine allgemeine Vorgehensweise empfehlen. Als einfacher Start (zumindest für Nicht-Apfel Telefone) eignet sich die Ping-Überprüfung und die FritzBox-Abfrage sehr gut.&lt;br /&gt;
&lt;br /&gt;
=== Randbedingungen ===&lt;br /&gt;
Es gibt Geräte, die ihr WLAN/Bluetooth auch im Standby ständig aktiv haben und auf Anfragen antworten können (fast alle Android-Geräte). Gerade bei Tests über WLAN kann sich das aber signifikant auf die Akku Leistung auswirken.&lt;br /&gt;
&lt;br /&gt;
Andere Geräte wiederum schalten WLAN im Standby Betrieb aus, um Akkukapazität zu sparen. Bluetooth hingegen bleibt weiterhin aktiviert und kann auf Anfragen reagieren. (iPhone)&lt;br /&gt;
&lt;br /&gt;
Wenn man bei einem iPhone die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert hat, so ist dies auch im Standby jederzeit pingbar, wenn der Recher auf dem iTunes zum synchroniseren läuft auch an ist. Ansonsten ist bei iPhone Geräten nur die Aktivitätsprüfung mit einer FritzBox oder das überwachen der DHCP Lease auf einer Airport Basestation wirklich zuverlässig.&lt;br /&gt;
&lt;br /&gt;
Auch wenn Bluetooth aktiviert ist, so bleiben einige Mobiltelefone erst dann empfangsbereit, wenn sie bereits zu irgend einem Bluetoothgerät gekoppelt wurden. Sind diese Geräte noch nie gekoppelt worden, deaktivieren diese ihren Bluetooth Empfänger beim verlassen des Bluetooth-Menüs im Gerät (iPhone).&lt;br /&gt;
&lt;br /&gt;
Hier gilt es vor allem auszuprobieren, wie stark der Akku durch eine Anwesenheitserkennung belastet wird. Entscheidend ist hier, in welchem Abstand man eine Anwesenheitserkennung durchführt. Viele Abfragen wirken sich stärker auf den Akku aus als wenige. Wenige Abfragen bieten aber keine zuverlässige und zeitnahe Erkennung.&lt;br /&gt;
&lt;br /&gt;
Als Alternative, unabhängig vom WLAN und der Erkennung, ob ein Gerät dort eingebucht ist oder nicht, bzw. unabhängig von Bluetooth kann zumindest bei einem iPhone die seit iOS 7 nochmals stark verbesserte Geo-Lokation (Geofencing) genutzt werden. Die iPhone Apps [http://geofency.com/ Geofency] oder [http://geofancy.com/ Geofancy] werden über das FHEM-Modul GEOFANCY angebunden und übertragen ihren Status immer dann, wenn ein definierter Standort betreten oder verlassen wird. Gekoppelt mit entsprechenden Notify und/oder Watchdog Kommandos ist so ebenfalls eine sehr zuverlässige Anwesenheitserkennung möglich (und das nicht nur für das eigene Zuhause).&lt;br /&gt;
&lt;br /&gt;
== Das PRESENCE Modul ==&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an. Diese sind aktuell folgende:&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;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äte, ü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;
=== Ping-Überwachung von Geräten 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;
So sollten die Berechtigungen aussehen&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo ls -la /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
unter Jessie&lt;br /&gt;
:&amp;lt;code&amp;gt;-rwxr-xr-x 1 root root 38844 Feb 12  2014 /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
unter Wheezy&lt;br /&gt;
:&amp;lt;code&amp;gt;-rwsr-xr-x 1 root root 33220 Mär 30  2012 /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Sollte es trotzdem unter Jessie nicht funktionieren kann man auch dort die Berechtigung analog wheezy setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo chmod u+s /bin/ping&amp;lt;/code&amp;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;
=== Bluetooth-Überwachung von Geräten durch den FHEM Server ===&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;
=== Bluetooth-Überwachung von Geräten durch verteilte Agenten in der Wohnung (presenced/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 (Download-Link ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für den Raspberry zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beide Programme (presenced/collectord) 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. Nach Installation der *.deb Pakete sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-rc.d presenced defaults&lt;br /&gt;
sudo update-rc.d collectord defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von presenced ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] Beschreibung zum PRESENCE Modul enthalten.&lt;br /&gt;
&lt;br /&gt;
==== Jeden Raum einzeln ansprechen (presenced) ====&lt;br /&gt;
Nun kann zuallererst jeder Raum einzeln angesprochen werden. Dabei ist zu beachten, dass pro Definition in der Konfiguration nur ein Gerät in einem Raum spezifisch überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Eine Definition sieht dabei folgendermaßen aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy_Wohnzimmer PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.0.10:5111&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird nun das Gerät nur im Wohnzimmer (Raspberry mit IP 192.168.0.10) überwacht.&lt;br /&gt;
&lt;br /&gt;
==== Alle Räume gemeinsam ansprechen (collectord) ====&lt;br /&gt;
Um jedoch alle Räume gemeinsam zu verwenden, gibt es den Collector-Daemon. 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;
Um alle Räume zu kennen, müssen diese mit einem Config-File dem collectord mitgeteilt werden. Dieses sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Schlafzimmer]           # Name des Raumes (wird in FHEM als Reading angezeigt)&lt;br /&gt;
address=192.168.179.31   # IP-Adresse oder Hostname des presenced&lt;br /&gt;
port=5111                # TCP Port, der verwendet werden soll (standardmäßig Port 5111)&lt;br /&gt;
presence_timeout=120     # Prüfinterval, das verwendet werden soll, wenn ein Gerät anwesend ist&lt;br /&gt;
absence_timeout=20       # Prüfinterval, das verwendet werden soll, wenn ein Gerät abwesend ist&lt;br /&gt;
&lt;br /&gt;
[Wohnzimmer]&lt;br /&gt;
address=192.168.179.34&lt;br /&gt;
port=5111&lt;br /&gt;
presence_timeout=180&lt;br /&gt;
absence_timeout=20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist dieses Config-File unter /etc/collectord.conf zu finden. Mit dieser Konfiguration kann der Collectord gestartet werden. Es empfiehlt sich diesen mit auf dem FHEM Server zu betreiben. Die erforderliche Definition in der FHEM-Konfiguration:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald das Handy irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort an FHEM und teilt den Raum mit.&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von collectord findet man in der [http://fhem.de/commandref.html#PRESENCE Commandref zum PRESENCE Modul].&lt;br /&gt;
&lt;br /&gt;
=== Überwachung von Geräten mit 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;
=== Eventbasierte Anwesenheitserkennung am Beispiel mittels UniFi Controller ===&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;
== Das GEOFANCY Modul ==&lt;br /&gt;
Das Modul ermöglicht über einen sogenannten Webhook Mechanismus (umgangssprachlich oft auch als &amp;quot;Push&amp;quot; benannt) das aktive Melden des aktuellen Standortes. Die iPhone Apps  [http://geofency.com/ Geofency] und [http://geofancy.com/ Geofancy] können dann aktiv und quasi in dem Moment, wo man den Wohnbereich betritt oder verlässt, benachrichtigen. Android Nutzern können [https://play.google.com/store/apps/details?id=de.egi.geofence.geozone&amp;amp;hl=de EgiGeoZone Geofence] nutzen. Das geht nochmals um einiges schneller, als die Erkennung im WLAN, bei der die Anwesenheit nur in (engen) Zyklen aktiv geprüft werden muss. Gleichzeitig werden Ressourcen in FHEM geschont. Die aktuelle Implementierung im iPhone 5S mit dediziert für das Tracking zuständigem Chip ist so gut, dass der Akku ebenfalls sehr geschont wird.&lt;br /&gt;
&lt;br /&gt;
=== Modul in FHEM einrichten ===&lt;br /&gt;
Das Modul ist mit einer einfachen Definition sofort betriebsbereit:&lt;br /&gt;
:&amp;lt;code&amp;gt;define geofancy GEOFANCY geo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit nimmt FHEM unter &amp;lt;nowiki&amp;gt;http://192.168.178.1:8083/fhem/geo&amp;lt;/nowiki&amp;gt; entsprechende Meldungen des iPhones entgegen. Damit das nicht nur über das lokale WLAN funktioniert, bedarf es allerdings noch einiger zusätzlicher Maßnahmen. FHEM muss vom Internet erreichbar gemacht werden, dabei sollte unbedingt an die Absicherung des Zugriffs gedacht werden.&lt;br /&gt;
&lt;br /&gt;
Zunächst einmal habe ich bei mir eine eigene FHEMWEB Instanz dafür angelegt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define WEBhook FHEMWEB 8088 global&lt;br /&gt;
attr WEBhook column Alarms: Apartment: Living: Bedroom: Kitchen: Sonos: Residents: Weather: Bathroom: Logs: Statistics: DashboardRoom: System: hidden: all:&lt;br /&gt;
attr WEBhook hiddenroom input,detail,save,Unsorted,Everything,CUL_HM,FS20,Commandref,style,Edit files,Select style,Logfile,Floorplans,Remote doc,FileLogs,Apartment,Bathroom,Bedroom,Kitchen,Living,Residents,System,Weather,Event monitor,NEW&lt;br /&gt;
attr WEBhook room hidden&lt;br /&gt;
attr WEBhook webname webhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist unter der URL &amp;lt;nowiki&amp;gt;http://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; das GEOFANCY Modul erreichbar. Ich verstecke in dieser Ansicht noch alle Räume, die ich so habe. Wer die Raumnamen allerdings kennt, kann sie trotzdem aufrufen. Die Anzeige in den Räumen kann man mit dem Attribut column und entsprechend leeren Definitionen verstecken. Nun muss man explizit den Devicenamen kennen, um noch etwas über die Konfiguration in Erfahrung bringen zu können.&lt;br /&gt;
Auch wenn das Security-by-Obscurity ist - ich fühle mich wohler damit.&lt;br /&gt;
&lt;br /&gt;
=== Webhook weiter absichern ===&lt;br /&gt;
Mit Hilfe eines [http://fhem.de/commandref.html#allowed allowed]-Devices lässt sich die FHEMWEB Instanz noch weiter absichern indem nur die tatsächlich benötigten Kommandos erlaubt werden (in diesem Fall keine) und damit alle anderen nicht erlaubten (attr,define,get,set,...) automatisch nicht mehr zur Verfügung stehen: &lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
define allowedWEBhook allowed&lt;br /&gt;
attr allowedWEBhook allowedCommands ,&lt;br /&gt;
attr allowedWEBhook allowedDevices ,&lt;br /&gt;
attr allowedWEBhook validFor WEBhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem ist dringend zu empfehlen, den Zugriff über TLS/SSL und HTTP Basic-Authentication weiter abzusichern. Läuft FHEM auf einem Raspberry&amp;amp;nbsp;Pi, dann empfehle ich dazu die Konfiguration eines ReverseProxy (vorzugsweise HAproxy, Pound oder Varnish, notfalls auch Nginx oder Apache); damit ist man am flexibelsten und kann auch alle FHEMWEB Instanzen direkt über einen einzigen Port (meist 443, der HTTPS Standard Port) zusammenfassen. Ich möchte hier allerdings beschreiben, wie weit man mit FHEM Bordmitteln kommt und nehme das Beispiel einer Installation auf einer Fritzbox.&lt;br /&gt;
&lt;br /&gt;
Wie TLS aktiviert wird, steht in der Commandref für [[FHEMWEB]]. Um die Kommandos auf der Fritzbox ausführen zu können, muss zuerst Telnet aktiviert werden (bitte Google benutzen). Anschließend wechselt man auf der Fritzbox ins Verzeichnis /var/media/ftp/fhem und kann dann den Hinweisen aus der [http://fhem.de/commandref.html#FHEMWEB Commandref] unter dem Punkt HTTPS folgen. Letztlich fehlt noch das entsprechende Attribut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr WEBhook HTTPS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes aktivieren wir Benutzername+Passwort für den Zugriff. Die commandref für allowed gibt auch hier unter dem Punkt basicAuth entsprechende Hinweise. Wir fügen hier einfach mal einen Benutzer &amp;quot;webhook&amp;quot; mit dem Passwort &amp;quot;Geofancy&amp;quot; hinzu, das sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr allowedWEBhook basicAuth { &amp;quot;$user:$password&amp;quot; eq &amp;quot;webhook:Geofancy&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zur Absicherung gibt auch [[FritzBox Webzugriff absichern]].&lt;br /&gt;
&lt;br /&gt;
Um zu testen, ob unsere Absicherung erfolgreich war, kann man die URL &amp;lt;nowiki&amp;gt;https://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; aufrufen (wichtig ist, dass man jetzt https und nicht mehr http eingibt; ansonsten bekommt man keine Antwort). Eine Zertifikatswarnung kann getrost ignoriert werden, verschlüsselt wird trotzdem. Es sollte auch eine Passwort Abfrage kommen und die Eingabe der entsprechenden Daten sollte dann zu einer entsprechenden Meldung vom GEOFANCY Modul führen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NOK No data received, see API information on http://wiki.geofancy.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist ok, schließlich sind wir keine App, sondern der Mensch, der nur mal eben prüfen will :-)&lt;br /&gt;
&lt;br /&gt;
=== Zugriff vom Internet ermöglichen ===&lt;br /&gt;
Das ist je nach Fritzbox und Software Version unterschiedlich. Grundsätzlich gilt: Eine Weiterleitung des ports 8088 vom Internet auf das laufende FHEM auf Port 8088 intern ist von AVM so nicht vorgesehen.&lt;br /&gt;
Bei mir führte folgendes zum Erfolg:&lt;br /&gt;
&lt;br /&gt;
* Einloggen per Telnet auf der Fritzbox (ich habe FritzOS 6 installiert)&lt;br /&gt;
* Konfiguration editieren mittels &amp;quot;nvi /var/flash/ar7.cfg&amp;quot;&lt;br /&gt;
* Suchen nach richtiger Zeile durch Eingabe von &amp;quot;/internet_forwardrules&amp;quot; und Enter&lt;br /&gt;
* Hinzufügen einer weiteren Zeile (Vorsicht, die bestehende Zeile endet mit ; und das muss in , umgeändert werden, so dass das ; schließlich am Ende der Zeile steht.&lt;br /&gt;
&lt;br /&gt;
So sieht es bei mir vorher aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
Hinterher:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;, &amp;quot;tcp 0.0.0.0:8088 0.0.0.0:8088 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach mittels &amp;quot;:x&amp;quot; abspeichern und sofort per &amp;quot;reboot&amp;quot; die Box neu starten, um diese Änderungen zu aktivieren. Das ist wichtig; ansonsten zeigt die Erfahrung, dass die Änderung nicht dauerhaft erhalten bleibt und die gerade gemachten Änderungen verloren gehen.&lt;br /&gt;
&lt;br /&gt;
Wer die Einstellungen zu &amp;quot;internet_forwardrules&amp;quot; bei sich nicht finden kann, hat womöglich eine andere Version als ich oder ein leicht anderes Gerät und bemüht am besten Google, was er tun kann, um das Gleiche zu erreichen. Möglicherweise tauchen die Einträge auch erst auf, wenn man mal über das Webinterface ein Forwarding eingerichtet hatte.&lt;br /&gt;
&lt;br /&gt;
Hat man einen DynDNS Dienst oder myFritz auf der Fritzbox aktiviert, so kann man jetzt auch von draußen auf den Webhook zugreifen. Das kann man prüfen, indem man das iPhone aus dem WLAN ausbucht und einmal die externe Adresse eingibt, also z.B. https://meindyndns.org:8088/webhook/geo.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Alternativen für den Zugriff aus dem Internet ===&lt;br /&gt;
Als Alternative zum Port Forwarding kann man sich auch per VPN in das lokale Netzwerk einwählen. iOS bietet dazu auch eine automatische Aktivierung des VPN (VPN on Demand), wie z.B. [http://forum.loxone.com/dede/netzwerk-firewall-and-security/8121-vpn-demand-ios-8-1-1-fritz-box-kleine-how.html hier] beschrieben wird.&lt;br /&gt;
&lt;br /&gt;
Auch eine Alternative ist, das Portforwarding nicht direkt an FHEM einzurichten, sondern an einem im Netzwerk laufenden Reverse-Proxy, der dann seinerseits die Anfragen an FHEM weiterleitet. Dies kann z.B. Apache, Nginx oder am besten HAproxy sein.&lt;br /&gt;
Letzterer ist dabei sehr flexibel, allerdings nicht unbedingt einfach zu konfigurieren. Ein paar Inspirationen diesbezüglich gibt es z.B. [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/stat/etc/haproxy hier] und [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/dyn/etc/haproxy hier]. Wer pfSense nutzt, findet [http://loredo.me/post/116633549315/geeking-out-with-haproxy-on-pfsense-the-ultimate diesen Artikel] womöglich auch interessant. Er zeigt auch, dass mit HAproxy noch weit mehr möglich ist.&lt;br /&gt;
Der Reverse-Proxy sollte dabei auch unbedingt der TLS Termination Point sein (TLS Offloading). Nicht nur spart man sich dann die Aktivierung von TLS in FHEM, sondern man hat auch mehr Einfluss darauf, wie TLS arbeitet (z.B. Deaktivierung von SSLv3, forcieren von TLSv1.2, nur als sicher eingestufte Cipher Suite... siehe auch Infos auf der [https://wiki.mozilla.org/Security/Server_Side_TLS Mozilla Website]).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten in der Geof[e|a]ncy.app ===&lt;br /&gt;
Hat das alles soweit geklappt, können endlich in der Geofency.app bzw. Geofancy.app am iPhone die gewünschten Bereiche definiert werden. Am Besten zuvor in den Global Settings die folgenden Einstellungen hinterlegen:&lt;br /&gt;
&lt;br /&gt;
* URL: https://meindyndns.org:8088/webhook/geo&lt;br /&gt;
* POST (oder GET, ist egal - das FHEM Modul kann beides)&lt;br /&gt;
* HTTP Basic Authentication: EIN (entsprechend Username und Password eintragen)&lt;br /&gt;
&lt;br /&gt;
Anfänglich ist es empfehlenswert noch &amp;quot;Notification on success&amp;quot; und &amp;quot;Notification on Failure&amp;quot; einzuschalten. Ersteres kann man ausmachen wenn man weiß, dass es soweit funktioniert. Über &amp;quot;Send Test-Request&amp;quot; kann man einmal einen Test schicken und erhält das Ergebnis entsprechend dargestellt. Es sollte sowas kommen wie&lt;br /&gt;
:&amp;lt;code&amp;gt;POST Success: test OK&amp;lt;/code&amp;gt;. In Geofancy.app gibt es keine Rückmeldung über den Erfolg des Testrequests. In FHEM sollten sich durch den Testrequest jedoch die Readings sofort aktualisieren (Ggf. ist ein Reload der FHEMWEB-Seite nötig da zusätzliche Tabellenzeilen nicht via Longpoll ergänzt werden). &lt;br /&gt;
&lt;br /&gt;
Funktioniert das soweit, kann man eine neue Lokation als sein Zuhause anlegen. Es empfiehlt sich einen ID-Namen zu setzen; dieser ist dann in FHEM als Name für die Lokation sichtbar. Für die eigene Wohnung empfiehlt sich hier &amp;quot;home&amp;quot; (da dies auch direkt vom RESIDENTS Modul so verwendet werden kann). Man kann auch Trigger für andere Standorte anlegen. FHEM weiß dann sogar, wenn ihr im Büro seid und könnte sich dabei auch unterschiedlich verhalten, als wenn ihr &amp;quot;auf Achse&amp;quot; seid. Bei letzterem ist der Status im GEOFANCY Modul &amp;quot;underway&amp;quot;, was so viel heißt wie &amp;quot;unbekannter Aufenthaltsort&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Zumindest für Geofancy.app liefert ein Testrequest wohl zufällige Locations zurück. Die eigenen Location-IDs werden also nicht übergeben, selbst wenn man sich in einem Geofence befindet. Um zu testen muss man sich wohl oder übel selbst bewegen ;-).&lt;br /&gt;
&lt;br /&gt;
=== GEOFANCY Modul individualisieren ===&lt;br /&gt;
Die im GEOFANCY Modul dargestellten Readings sind nun in etwa so, wenn ihr euch bewegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      -&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:51F23894-AAAA-BBBB-CCCC-0123456789AB trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer genauer hinschaut sieht: Mein iPhone heißt wohl 51F23894-AAAA-BBBB-CCCC-0123456789AB.&lt;br /&gt;
Damit nun die Readings für mein iPhone richtig angelegt werden, muss ein Device Alias gesetzt werden. Sinnvoll erscheint mir der Vorname des Besitzers:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr geofancy devAlias 51F23894-AAAA-BBBB-CCCC-0123456789AB:Julian&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Alias-Namen können mit Leerzeichen einfach angehängt werden.&lt;br /&gt;
Jetzt werden weitere Readings angelegt, sobald GEOFANCY entsprechende Daten vom Mobilgerät empfängt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   Julian          arrived home&lt;br /&gt;
     2014-01-18 14:37:42   currLocLat_Julian 48.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocLong_Julian 11.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocTime_Julian 2014-01-18 14:37:42&lt;br /&gt;
     2014-01-18 14:37:42   currLoc_Julian  home&lt;br /&gt;
     2014-01-17 19:18:23   lastArr         Julian home&lt;br /&gt;
     2014-01-17 18:41:46   lastDep         Julian Office&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      Julian&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-17 18:41:46   lastLocArr_Julian 2014-01-17 08:58:37&lt;br /&gt;
     2014-01-17 18:41:46   lastLocDep_Julian 2014-01-17 18:41:46&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLat_Julian 48.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLong_Julian 11.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLoc_Julian  Office&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:Julian trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man nun etwas bestimmtes tun, wenn man nach Hause kommt oder das Heim verlässt, kann man am Besten ein entsprechendes Notify auf das Reading currLoc_Name setzen. Ich aktualisiere lediglich zwei Dummies, durch die dann alle weiteren Notifies ausgelöst werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define n_Julian.Presence notify geofancy:currLoc_Julian:.home set Julian.homestatus:FILTER=STATE!=home home&lt;br /&gt;
attr n_Julian.Presence room Residents&lt;br /&gt;
define n_Julian.absence notify geofancy:currLoc_Julian:.underway {\&lt;br /&gt;
if (Value(&amp;quot;Julian.homestatus&amp;quot;) ne &amp;quot;gone&amp;quot;) {\&lt;br /&gt;
  fhem(&amp;quot;set Julian.homestatus:FILTER=STATE!=absent absent&amp;quot;);;\&lt;br /&gt;
}\&lt;br /&gt;
}&lt;br /&gt;
define n_Julian.whereabout notify geofancy:currLoc_Julian:.* set Julian.whereabout:FILTER=STATE!=$EVTPART1 $EVTPART1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer es noch einfacher möchte (bzw. auch noch mehr Features) schaut sich einmal die neue Modulfamilie aus RESIDENTS[http://fhem.de/commandref_DE.html#RESIDENTS], ROOMMATE[http://fhem.de/commandref_DE.html#ROOMMATE] und GUEST[http://fhem.de/commandref_DE.html#GUEST] an. Diese sind direkt auf GEOFANCY abgestimmt. Dabei kann das devAlias Attribut entfallen und man hinterlegt die UUID stattdessen direkt im ROOMMATE oder GUEST Device (Attribut r*_geofenceUUIDs). Das erspart es für jeden Bewohner und jedes Device zig unterschiedliche Devices der Typen Notify, DOIF oder Watchdog anlegen und pflegen zu müssen.&lt;br /&gt;
&lt;br /&gt;
Wer mehr Kontrolle möchte kann natürlich bei notify, DOIF und Co. bleiben: &amp;lt;code&amp;gt;define n_rr_Julian.location notify geofancy:currLoc_Julian:.* set rr_Julian:FILTER=location!=$EVTPART1 location $EVTPART1&amp;lt;/code&amp;gt;. Wobei &amp;quot;Julian&amp;quot; dabei als devAlias in GEOFANCY eingtragen wurde, rr_Julian der Name des ROOMMATE aus RESIDENTS ist. Außerdem wurden die Location-IDs in der Geofency.app bzw. Geofancy.app so gewählt, dass diese direkt einem ROOMMATE-Status entsprechen (also z.B. home, wayhome...).&lt;br /&gt;
&lt;br /&gt;
== Beispiele für die Nutzung der Anwesenheitserkennung ==&lt;br /&gt;
Hier sollen Beispiele für den Nutzen von Anwesenheitserkennung aufgezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Abschalten aller Verbraucher (Licht, Musikanlage) beim Verlassen der Wohnung ===&lt;br /&gt;
Typisches Szenario: Man geht ausser Haus, aber hat vergessen im Bad das Licht aus zu machen. Allerdings geht man heutzutage fast garnicht mehr ohne Handy aus dem Haus.&lt;br /&gt;
&lt;br /&gt;
Nun soll FHEM in der gesamten Wohnung das Licht, sowie sonstige Verbraucher ausschalten, wenn ich länger als 15 Minuten ausser Haus bin. Dazu benötigt man zuerst eine structure, die alle Verbraucher und sonstigen Devices, die das betrifft, zusammenfasst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Gesamte_Wohnung structure Gesamtes_Licht Licht_Wohnzimmer Licht_Kueche LED_Kueche Licht_Bad Licht_Schlafzimmer AV_Receiver TV_Steckdose&lt;br /&gt;
attr Gesamte_Wohnung room Wohnung&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mittels eines watchdogs eine Überwachung für sein Handy anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Überwachen der gesamten Wohnung mittels collectord sowie presenced in jedem Raum&lt;br /&gt;
define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&lt;br /&gt;
attr Handy event-on-change-reading state  # Ein Event soll nur bei der Änderung des Anwesenheitsstatus (Reading: status) erfolgen. Wichtig für den watchdog!!!&lt;br /&gt;
&lt;br /&gt;
# Nach 15 Minuten Abwesenheit (Handy im Status &amp;quot;absent&amp;quot;) soll die gesamte Wohnung ausgeschaltet werden.&lt;br /&gt;
define watchdog_Anwesenheit watchdog Handy:absent 00:15 Handy:present set Gesamte_Wohnung off ; trigger watchdog_Anwesenheit .&lt;br /&gt;
attr watchdog_Anwesenheit regexp1WontReactivate 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigung bei Batteriewechsel ===&lt;br /&gt;
Mit Hilfe des PRESENCE-Moduls kann man auch bei batteriebetriebenen Geräten eine Meldung ausgeben, sobald ein Batteriewechsel ansteht. Hier im Beispiel wird der Eve-Room-Sensor von Elgato eingebunden und anschließend mit einer DOIF-Nachricht ausgestattet.&lt;br /&gt;
Die Bluetooth-Adresse des Sensors kann mittels eines BLE-Scanners ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# PRESENCE-Modul für Elgato Eve Room Sensor mit Aktualisierung aller 6 Minuten&lt;br /&gt;
define Eve_Room_BLE lan-bluetooth &amp;lt;Bluetooth-Adresse&amp;gt; 127.0.0.1:5333 360&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend wird eine DOIF-Regel definiert, die eine Nachricht an die installiere [[FHEM_APP|FHEM App]] absendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Eve_Room_BLE_Battery_Msg DOIF ([Eve_Room_BLE] eq &amp;quot;absent&amp;quot;) (set Msg_iPhone message &#039;Batteriewechsel beim Eve Room Sensor im Wohnzimmer.&#039;)&lt;br /&gt;
attr Eve_Room_BLE_Battery_Msg wait 600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung des PRESENCE-Eintrages sollte nicht größer sein als das WAIT-Attribut der DOIF-Regel. Ansonsten könnte eine kurze Systemstörung zum Fehlalarm führen.&lt;br /&gt;
&lt;br /&gt;
== Anwesenheitserkennung Bluetooth PebbleBee mit PRESENCE Modul ==&lt;br /&gt;
Im Forum gibt es einen {{Link2Forum|Topic=28753|LinkText=langen Beitrag}} über die Einrichtung eines BT-Tag an einem RaspberryPI mit FHEM. Dabei werden Skripte wie blescan.pl und lepresenced genannt.&lt;br /&gt;
Da mittlerweile viele neue Informationen zusammen gekommen sind wurde der Wiki Eintrag erstellt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Konfiguration für &#039;&#039;&#039;LE Deviced (z.B. Gtags,Pebbles etc.)&#039;&#039;&#039; und &#039;&#039;&#039;NICHT LE Device (z.B. IPhone)&#039;&#039;&#039; beschreiben.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Beide hier beschriebenen Wege (presenced/lepresenced) können parallel auf dem selben BT-Dongle laufen, da sich die Ports unterscheiden! }} &lt;br /&gt;
&#039;&#039;&#039;Wo finde ich denn lepresenced?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
lepresenced kann über Github heruntergeladen werden (Link weiter unten)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Was ist der Vorteil gegenüber blescan.pl?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
blescan.pl hat u. a. das Problem, dass dank der wundervollen Bluetooth-Implementierung unter Linux ab und zu der Scan fehlschlägt und das Interface resettet werden muss. Das tut blescan.pl auch mit aller Gewalt. Dazu kommt, dass bei längeren Scanzeiten und vielen Tags sich die Prozesse anstauen, weil immer nur auf einen Tag &amp;quot;gewartet&amp;quot; wird. Außerdem wurden mit der Einführung von lepresenced sämtliche Supportverträge gekündigt lepresenced läuft dauerhaft und merkt sich bei allen sendenden Tags den Zeitstempel des letzten Empfangs. &lt;br /&gt;
&lt;br /&gt;
=== Getestete Hardware/Software===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie&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 Dongel am PI installieren ===&lt;br /&gt;
&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain 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 Raspberry 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;source 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;/source&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;source 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;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für ein  LE Device (z.B. Gtags,Pebbles etc.) ===&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ändigkeithalber 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;
&lt;br /&gt;
&#039;&#039;&#039;1.Variante:&#039;&#039;&#039;&lt;br /&gt;
Herunterladen der aktuellen lepresenced-0.81-1.deb 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&lt;br /&gt;
 https://svn.fhem.de/trac/export/13992/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.81-1.deb&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.Variante:&#039;&#039;&#039;&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 svn://svn.code.sf.net/p/fhem/code/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;
Egal welche Variante gewählt wurde, kann nun mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i lepresenced-0.81-1.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.81-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;
Ab hier kann, wenn alles problemlos funktioniert hat mit der [[Einrichtung der G-Tags über FHEM]] weitergemacht werden.&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 der G-Tags über FHEM====&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration der BT-Tags in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der 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;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für ein NICHT LE Device (z.B. IPhone) ===&lt;br /&gt;
Die Installation kann (wie in der commanref beschrieben) über Debian Pakete erfolgen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.deb package for Debian (noarch): presenced-1.3.deb http://svn.code.sf.net/p/fhem/code/trunk/fhem/contrib/PRESENCE/deb/presenced-1.3.deb&lt;br /&gt;
&lt;br /&gt;
.deb package for Raspberry Pi (raspbian): presenced-rpi-1.3.deb http://svn.code.sf.net/p/fhem/code/trunk/fhem/contrib/PRESENCE/deb/presenced-rpi-1.3.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i presenced-rpi-1.3.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installation perl script file (Auszug commanref)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
direct perl script file: presenced http://svn.code.sf.net/p/fhem/code/trunk/fhem/contrib/PRESENCE/presenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration der BT-Tags in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der Tag dem FHEM-Server bekannt gemacht werden.&lt;br /&gt;
{{Randnotiz|RNText=Wenn man mit collectord arbeitet muß man die Erkennung bei allen Devices auf port 5222 setzen.&lt;br /&gt;
  lan-bluetooth xx:xx:80:xx:xx:AC 127.0.0.1:5222 20 120}}&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;
=== Automatischer Start ===&lt;br /&gt;
&lt;br /&gt;
Wurde leprecend mit der oben genannten Variante 1 oder 2 installiert worden sein, wird per systemctl der automatische Start direkt eingerichtet. Es ist somit keine extra Konfiguration per Cron oder init.d notwendig.&lt;br /&gt;
&lt;br /&gt;
Wurde die Variante 3 - die manuelle Installation - durchgeführt; bitte folgende Schritte für den automatischen Start befolgen:&lt;br /&gt;
 &lt;br /&gt;
Damit das leprecend Skript beim Systemstart mitgestartet wird, sollte eine Crontab Eintrag gesetzt werden. Alternativ die rc.local anpassen.&lt;br /&gt;
Ersteres würde so aussehen:&lt;br /&gt;
&lt;br /&gt;
Ein sh-Skript mit dem Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo start-stop-daemon -d /opt/fhem/script -S -x /opt/fhem/script/lepresenced &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
unter dem Verzeichnis /home/pi ablegen, welches sich init_start.sh nennt.&lt;br /&gt;
&lt;br /&gt;
Das Skript dann unter: sudo crontab -e einhängen mit folgender Folge:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@reboot        /home/pi/init_start.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zweiteres so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei rc.local, freie Stelle suchen, vor &amp;quot;exit 0&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Start lepresenced&lt;br /&gt;
/opt/fhem/script/lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;source 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;/source&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;source 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;/source&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;
===  Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags ===&lt;br /&gt;
&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;
=== Verwendung von Collectord bei mehreren PRESENCE Installationen mit LE-Devices ===&lt;br /&gt;
&lt;br /&gt;
Um zwei presence Installation zu verbinden wird der collectored Daemon von Markus Bloch benötigt.&lt;br /&gt;
Hierfür gibt es im Wiki auch eine kurze Erläuterung sowie die Commandref.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufbau:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
RPi1 (Hautpinstanz): fhem nebst presence Installation sowie collectord&lt;br /&gt;
RPi2 (Zweitsystem): fhem nebst presence Installation&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Installation:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auf RPi1 wird wie in der Commandref und im Wiki beschriebendas Presence Paket (https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/) heruntergeladen, installiert und konfiguriert.&lt;br /&gt;
Alle BT-Tags werden dann wie im Wiki beschrieben konfiguriert.&lt;br /&gt;
&lt;br /&gt;
auf RPi2 wird wie in der Commandref und im Wiki beschriebendas Presence Paket (https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/) heruntergeladen, installiert und konfiguriert.&lt;br /&gt;
Alle BT-Tags werden dann wie im Wiki beschrieben konfiguriert.&lt;br /&gt;
&lt;br /&gt;
Somit sollte auf beiden Systemen eine identische Konfiguration vorliegen.&lt;br /&gt;
&lt;br /&gt;
Jetzt wird das collectord heruntergeladen und installiert:&lt;br /&gt;
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.7.deb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install collectord-1.7.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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfiguration Shell:&#039;&#039;&#039;&amp;lt;br&amp;gt;&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=5111		          # 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=5111		          # 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: Es dürfen keine [Namen] mit Leerzeichen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfiguration FHEM:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
RPi1&lt;br /&gt;
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60&lt;br /&gt;
Hinweis: Der Port ist der, des Collectord!! Also hier, Standard 5222&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
RPi2&lt;br /&gt;
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.27:5222 60&lt;br /&gt;
Hinweis: Der Port ist der, des Collectord!! Also hier, Standard 5222 die IP-Adresse von RPi1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der Konfiguration kann der Daemon gestartet werden. Um eine visuelle Log-Ausgabe mit dem Aufruf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /usr/bin/perl /usr/sbin/collectord -vv -c /etc/collectord.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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:55 - forked with PID 15556&lt;br /&gt;
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5111&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;Automatischer Start:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn das Collectord per .deb Paket installiert wurde, startet es automatisch bei einem Reboot mit.&lt;br /&gt;
Manuell Starten als Daemon mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /usr/bin/perl /usr/sbin/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;
=== 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;source 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;/source&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; ~&lt;br /&gt;
    :msg,contains,&amp;quot;bt_err_ratelimited:&amp;quot; ~&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 [[https://forum.fhem.de/index.php/topic,28753.msg499184/topicseen.html#msg499184]] diskutiert.&lt;br /&gt;
&lt;br /&gt;
==== Ansprechpartner ====&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:Code Snippets]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21547</id>
		<title>DevelopmentProfiling</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21547"/>
		<updated>2017-05-14T12:32:42Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Profilieren Schritt für Schritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Profiling FHEM =&lt;br /&gt;
== What is profiling? ==&lt;br /&gt;
In software engineering, profiling (&amp;quot;program profiling&amp;quot;, &amp;quot;software profiling&amp;quot;) is a form of dynamic program analysis that measures, for example, the space (memory) or time complexity of a program, the usage of particular instructions, or frequency and duration of function calls. The most common use of profiling information is to aid program optimization. (from [http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29 Wikipedia])&lt;br /&gt;
&lt;br /&gt;
== Profiling step-by-step ==&lt;br /&gt;
You need [http://search.cpan.org/dist/Devel-NYTProf/ Devel::NYTProf] from CPAN.&lt;br /&gt;
&lt;br /&gt;
On Debian based systems install package &amp;quot;libdevel-nytprof-perl&amp;quot;:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libdevel-nytprof-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start &amp;lt;tt&amp;gt;fhem.pl&amp;lt;/tt&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;perl -d:NYTProf /opt/fhem/fhem.pl /opt/fhem/conf/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let it run for a while and then shut down FHEM.&lt;br /&gt;
&lt;br /&gt;
You will find a bunch of &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; files in &amp;lt;tt&amp;gt;/opt/fhem&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; contains the profile for the parent process and each &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile for a child process forked by the parent process. Not &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; but the largest &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile of the master process since FHEM does an initial fork when it is ready.&lt;br /&gt;
&lt;br /&gt;
You transfer the profile of the master process into something human-readable by issueing the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nytprofhtml -f nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces a subfolder names &amp;lt;tt&amp;gt;nytprof.&amp;lt;/tt&amp;gt; Direct your browser to file &amp;lt;tt&amp;gt;index.html&amp;lt;/tt&amp;gt; therein. You will get a bunch of information how FHEM spends its time.&lt;br /&gt;
&lt;br /&gt;
= FHEM Profilieren =&lt;br /&gt;
&lt;br /&gt;
== Was ist profilieren == &lt;br /&gt;
Kurz gesagt, mittels profilieren kann man ein Programm in seinem Ablauf untersuchen und so schauen, wo z.B. die Performance verbessert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Profilieren Schritt für Schritt ==&lt;br /&gt;
Benötigt wird das Paket Devel::NYTProf dies kann auf Debian Systemen mittels &amp;lt;code&amp;gt;sudo apt-get install libdevel-nytprof-perl&amp;lt;/code&amp;gt; installiert werden.&lt;br /&gt;
Weiterhin benötigt wird eine .conf Datei. Soll unsere aktuelle komplette Instanz profiliert werden, können wir einfach wie folgt vorgehen. Voraussetzung ist, das unsere fhem.cfg Datei im Hauptordner fhem abgelegt ist. Typischerweise wäre das unter /opt/fhem. Dann können wir wie folgt vorgehen auf der Console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo cp /opt/fhem/fhem.cfg /opt/fhem/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun haben wir im Ordner /opt/fhem die Datei fhem.conf erstellt. Als nächstes müssen wir fhem so starten, dass es profiliert wird:&lt;br /&gt;
# Fhem beenden. Entweder in fhem mittels &amp;quot;shutdown&amp;quot; in der Commandzeile, oder mittels Console: &amp;lt;code&amp;gt;sudo /etc/init.d/fhem stop&amp;lt;/code&amp;gt;&lt;br /&gt;
# In den Ordner fhem wechseln &amp;lt;code&amp;gt;cd /opt/fhem&amp;lt;/code&amp;gt;&lt;br /&gt;
# fhem wie folgt starten: &amp;lt;code&amp;gt;sudo perl -d:NYTProf /opt/fhem/fhem.pl /opt/fhem/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann fhem solange laufen, wie wir es benötigen, oder der Prozess, welchen wir beobachten wollen, eingetreten ist. &lt;br /&gt;
Es kann vorkommen, dass während dieser Zeit auf der Console ständig angezeigt was fhem aktuell macht. Um den Prozess nun zu beenden muss fhem herunter gefahren werden. Dafür sollte im Idealfall eine zweite Console geöffnet werden. Dort gehen wir wie folgt vor:&lt;br /&gt;
# Wir verbinden uns mittels Telnet mit unserem laufenden FHEM &amp;lt;code&amp;gt; telnet &amp;lt;DeinFHEMServer&amp;gt; 7072&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ein &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt; absetzen&lt;br /&gt;
# Fhem wird nun beendet. &lt;br /&gt;
&lt;br /&gt;
Anmerkung: Sollte ein Fehler erscheinen, dass Telnet ein unbekannter Befehl ist, dann müsst ihr noch Telnet mittels &amp;lt;code&amp;gt;sudo apt-get install telnet&amp;lt;/code&amp;gt; installieren. &lt;br /&gt;
&lt;br /&gt;
Jetzt haben wir im Ordner /opt/fhem mindestens die Datei nytprof.out, manchmal auf noch nytprof.out.PIDNUMMER.&lt;br /&gt;
Um zu testen, ob die Datei in Ordnung ist, kann folgender Befehl im Ordner /opt/fhem abgesetzt werden: &amp;lt;code&amp;gt;sudo nytprofhtml&amp;lt;/code&amp;gt; Dies sollte ohne Fehlermeldung durchlaufen und ein Unterordner namens &amp;lt;tt&amp;gt;nytprof.&amp;lt;/tt&amp;gt; mit HTML Inhalt erstellt worden sein. Über die &amp;lt;tt&amp;gt;index.html&amp;lt;/tt&amp;gt; könnt ihr nun erkennen was euer fhem so die ganze Zeit macht.&lt;br /&gt;
&lt;br /&gt;
Solltet ihr während des Prozesses über das WebUI von FHEM arbeiten wollen und ein &amp;lt;tt&amp;gt;save&amp;lt;/tt&amp;gt; ausführen wollen, dann müsst ihr vorher die fhem.conf Datei noch wie folgt bearbeiten:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo chown fhem:dialout fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
official perlfaq: [http://learn.perl.org/faq/perlfaq3.html#How-do-I-profile-my-Perl-programs How do I profile my Perl programs?]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21545</id>
		<title>DevelopmentProfiling</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21545"/>
		<updated>2017-05-14T09:18:11Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Profilieren Schritt für Schritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Profiling FHEM =&lt;br /&gt;
== What is profiling? ==&lt;br /&gt;
In software engineering, profiling (&amp;quot;program profiling&amp;quot;, &amp;quot;software profiling&amp;quot;) is a form of dynamic program analysis that measures, for example, the space (memory) or time complexity of a program, the usage of particular instructions, or frequency and duration of function calls. The most common use of profiling information is to aid program optimization. (from [http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29 Wikipedia])&lt;br /&gt;
&lt;br /&gt;
== Profiling step-by-step ==&lt;br /&gt;
You need [http://search.cpan.org/dist/Devel-NYTProf/ Devel::NYTProf] from CPAN.&lt;br /&gt;
&lt;br /&gt;
On Debian based systems install package &amp;quot;libdevel-nytprof-perl&amp;quot;:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libdevel-nytprof-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start &amp;lt;tt&amp;gt;fhem.pl&amp;lt;/tt&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;perl -d:NYTProf /opt/fhem/fhem.pl /opt/fhem/conf/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let it run for a while and then shut down FHEM.&lt;br /&gt;
&lt;br /&gt;
You will find a bunch of &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; files in &amp;lt;tt&amp;gt;/opt/fhem&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; contains the profile for the parent process and each &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile for a child process forked by the parent process. Not &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; but the largest &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile of the master process since FHEM does an initial fork when it is ready.&lt;br /&gt;
&lt;br /&gt;
You transfer the profile of the master process into something human-readable by issueing the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nytprofhtml -f nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces a subfolder names &amp;lt;tt&amp;gt;nytprof.&amp;lt;/tt&amp;gt; Direct your browser to file &amp;lt;tt&amp;gt;index.html&amp;lt;/tt&amp;gt; therein. You will get a bunch of information how FHEM spends its time.&lt;br /&gt;
&lt;br /&gt;
= FHEM Profilieren =&lt;br /&gt;
&lt;br /&gt;
== Was ist profilieren == &lt;br /&gt;
Kurz gesagt, mittels profilieren kann man ein Programm in seinem Ablauf untersuchen und so schauen, wo z.B. die Performance verbessert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Profilieren Schritt für Schritt ==&lt;br /&gt;
Benötigt wird das Paket Devel::NYTProf dies kann auf Debian Systemen mittels &amp;lt;code&amp;gt;sudo apt-get install libdevel-nytprof-perl&amp;lt;/code&amp;gt; installiert werden.&lt;br /&gt;
Weiterhin benötigt wird eine .conf Datei. Soll unsere aktuelle komplette Instanz profiliert werden, können wir einfach wie folgt vorgehen. Voraussetzung ist, das unsere fhem.cfg Datei im Hauptordner fhem abgelegt ist. Typischerweise wäre das unter /opt/fhem. Dann können wir wie folgt vorgehen auf der Console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo cp /opt/fhem/fhem.cfg /opt/fhem/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun haben wir im Ordner /opt/fhem die Datei fhem.conf erstellt. Als nächstes müssen wir fhem so starten, dass es profiliert wird:&lt;br /&gt;
# Fhem beenden. Entweder in fhem mittels &amp;quot;shutdown&amp;quot; in der Commandzeile, oder mittels Console: &amp;lt;code&amp;gt;sudo /etc/init.d/fhem stop&amp;lt;/code&amp;gt;&lt;br /&gt;
# In den Ordner fhem wechseln &amp;lt;code&amp;gt;cd /opt/fhem&amp;lt;/code&amp;gt;&lt;br /&gt;
# fhem wie folgt starten: &amp;lt;code&amp;gt;perl -d:NYTProf /opt/fhem/fhem.pl /opt/fhem/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann fhem solange laufen, wie wir es benötigen, oder der Prozess, welchen wir beobachten wollen, eingetreten ist. Während dieser Zeit wird auf der Console ständig angezeigt was fhem aktuell macht. Um den Prozess nun zu beenden muss fhem herunter gefahren werden. Dafür sollte im Idealfall eine zweite Console geöffnet werden. Dort gehen wir wie folgt vor:&lt;br /&gt;
# Wir verbinden uns mittels Telnet mit unserem laufenden FHEM &amp;lt;code&amp;gt; telnet &amp;lt;DeinFHEMServer&amp;gt; 7072&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ein &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt; absetzen&lt;br /&gt;
# Fhem wird nun beendet. &lt;br /&gt;
&lt;br /&gt;
Anmerkung: Sollte ein Fehler erscheinen, dass Telnet ein unbekannter Befehl ist, dann müsst ihr noch Telnet mittels &amp;lt;code&amp;gt;sudo apt-get install telnet&amp;lt;/code&amp;gt; installieren. &lt;br /&gt;
&lt;br /&gt;
Jetzt haben wir im Ordner /opt/fhem mindestens die Datei nytprof.out, manchmal auf noch nytprof.out.PIDNUMMER.&lt;br /&gt;
Um zu testen, ob die Datei in Ordnung ist, kann folgender Befehl im Ordner /opt/fhem abgesetzt werden: &amp;lt;code&amp;gt;nytprofhtml&amp;lt;/code&amp;gt; Dies sollte ohne Fehlermeldung durchlaufen und ein Unterordner namens &amp;lt;tt&amp;gt;nytprof.&amp;lt;/tt&amp;gt; mit HTML Inhalt erstellt worden sein. Über die &amp;lt;tt&amp;gt;index.html&amp;lt;/tt&amp;gt; könnt ihr nun erkennen was euer fhem so die ganze Zeit macht.&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
official perlfaq: [http://learn.perl.org/faq/perlfaq3.html#How-do-I-profile-my-Perl-programs How do I profile my Perl programs?]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21389</id>
		<title>DevelopmentProfiling</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21389"/>
		<updated>2017-04-23T10:15:37Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Profiling FHEM */ - Deutsche Übersetzung hinzugefügt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Profiling FHEM =&lt;br /&gt;
== What is profiling? ==&lt;br /&gt;
In software engineering, profiling (&amp;quot;program profiling&amp;quot;, &amp;quot;software profiling&amp;quot;) is a form of dynamic program analysis that measures, for example, the space (memory) or time complexity of a program, the usage of particular instructions, or frequency and duration of function calls. The most common use of profiling information is to aid program optimization. (from [http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29 Wikipedia])&lt;br /&gt;
&lt;br /&gt;
== Profiling step-by-step ==&lt;br /&gt;
You need [http://search.cpan.org/dist/Devel-NYTProf/ Devel::NYTProf] from CPAN.&lt;br /&gt;
&lt;br /&gt;
On Debian based systems install package &amp;quot;libdevel-nytprof-perl&amp;quot;:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libdevel-nytprof-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start &amp;lt;tt&amp;gt;fhem.pl&amp;lt;/tt&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;perl -d:NYTProf /opt/fhem/fhem.pl /opt/fhem/conf/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let it run for a while and then shut down FHEM.&lt;br /&gt;
&lt;br /&gt;
You will find a bunch of &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; files in &amp;lt;tt&amp;gt;/opt/fhem&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; contains the profile for the parent process and each &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile for a child process forked by the parent process. Not &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; but the largest &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile of the master process since FHEM does an initial fork when it is ready.&lt;br /&gt;
&lt;br /&gt;
You transfer the profile of the master process into something human-readable by issueing the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nytprofhtml -f nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces a subfolder names &amp;lt;tt&amp;gt;nytprof.&amp;lt;/tt&amp;gt; Direct your browser to file &amp;lt;tt&amp;gt;index.html&amp;lt;/tt&amp;gt; therein. You will get a bunch of information how FHEM spends its time.&lt;br /&gt;
&lt;br /&gt;
= FHEM Profilieren =&lt;br /&gt;
&lt;br /&gt;
== Was ist profilieren == &lt;br /&gt;
Kurz gesagt, mittels profilieren kann man ein Programm in seinem Ablauf untersuchen und so schauen, wo z.B. die Performance verbessert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Profilieren Schritt für Schritt ==&lt;br /&gt;
Benötigt wird das Paket Devel::NYTProf dies kann auf Debian Systemen mittels &amp;lt;code&amp;gt;sudo apt-get install libdevel-nytprof-perl&amp;lt;/code&amp;gt; installiert werden.&lt;br /&gt;
Weiterhin benötigt wird eine .conf Datei. Soll unsere aktuelle komplette Instanz profiliert werden, können wir einfach wie folgt vorgehen. Voraussetzung ist, das unsere fhem.cfg Datei im Hauptordner fhem abgelegt ist. Typischerweise wäre das unter /opt/fhem. Dann können wir wie folgt vorgehen auf der Console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo cp /opt/fhem/fhem.cfg /opt/fhem/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun haben wir im Ordner /opt/fhem die Datei fhem.conf erstellt. Als nächstes müssen wir fhem so starten, dass es profiliert wird:&lt;br /&gt;
# Fhem beenden. Entweder in fhem mittels &amp;quot;shutdown&amp;quot; in der Commandzeile, oder mittels Console: &amp;lt;code&amp;gt;sudo /etc/init.d/fhem stop&amp;lt;/code&amp;gt;&lt;br /&gt;
# In den Ordner fhem wechseln &amp;lt;code&amp;gt;cd /opt/fhem&amp;lt;/code&amp;gt;&lt;br /&gt;
# fhem wie folgt starten: &amp;lt;code&amp;gt;perl -d:NYTProf /opt/fhem/fhem.pl /opt/fhem/conf/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann fhem solange laufen, wie wir es benötigen, oder der Prozess, welchen wir beobachten wollen, eingetreten ist. Während dieser Zeit wird auf der Console ständig angezeigt was fhem aktuell macht. Um den Prozess nun zu beenden muss fhem herunter gefahren werden. Dafür sollte im Idealfall eine zweite Console geöffnet werden. Dort gehen wir wie folgt vor:&lt;br /&gt;
# Wir verbinden uns mittels Telnet mit unserem laufenden FHEM &amp;lt;code&amp;gt; telnet &amp;lt;DeinFHEMServer&amp;gt; 7072&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ein &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt; absetzen&lt;br /&gt;
# Fhem wird nun beendet. &lt;br /&gt;
&lt;br /&gt;
Anmerkung: Sollte ein Fehler erscheinen, dass Telnet ein unbekannter Befehl ist, dann müsst ihr noch Telnet mittels &amp;lt;code&amp;gt;sudo apt-get install telnet&amp;lt;/code&amp;gt; installieren. &lt;br /&gt;
&lt;br /&gt;
Jetzt haben wir im Ordner /opt/fhem mindestens die Datei nytprof.out, manchmal auf noch nytprof.out.PIDNUMMER.&lt;br /&gt;
Um zu testen, ob die Datei in Ordnung ist, kann folgender Befehl im Ordner /opt/fhem abgesetzt werden: &amp;lt;code&amp;gt;nytprofhtml&amp;lt;/code&amp;gt; Dies sollte ohne Fehlermeldung durchlaufen und ein Unterordner namens &amp;lt;tt&amp;gt;nytprof.&amp;lt;/tt&amp;gt; mit HTML Inhalt erstellt worden sein. Über die &amp;lt;tt&amp;gt;index.html&amp;lt;/tt&amp;gt; könnt ihr nun erkennen was euer fhem so die ganze Zeit macht. &lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
official perlfaq: [http://learn.perl.org/faq/perlfaq3.html#How-do-I-profile-my-Perl-programs How do I profile my Perl programs?]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21272</id>
		<title>DevelopmentProfiling</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentProfiling&amp;diff=21272"/>
		<updated>2017-04-14T14:31:37Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Profiling step-by-step */ -&amp;gt; install mittels sudo apt-get hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Profiling FHEM =&lt;br /&gt;
== What is profiling? ==&lt;br /&gt;
In software engineering, profiling (&amp;quot;program profiling&amp;quot;, &amp;quot;software profiling&amp;quot;) is a form of dynamic program analysis that measures, for example, the space (memory) or time complexity of a program, the usage of particular instructions, or frequency and duration of function calls. The most common use of profiling information is to aid program optimization. (from [http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29 Wikipedia])&lt;br /&gt;
&lt;br /&gt;
== Profiling step-by-step ==&lt;br /&gt;
You need [http://search.cpan.org/~timb/Devel-NYTProf-4.23/lib/Devel/NYTProf.pm Devel::NYTProf] from CPAN.&lt;br /&gt;
&lt;br /&gt;
Edit: Der CPAN Link ist defekt. Man kann alternativ installieren mittels&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libdevel-nytprof-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start &amp;lt;tt&amp;gt;fhem.pl&amp;lt;/tt&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;perl -d:NYTProf /opt/fhem/fhem.pl /opt/fhem/conf/fhem.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let it run for a while and then shut down FHEM.&lt;br /&gt;
&lt;br /&gt;
You will find a bunch of &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; files in &amp;lt;tt&amp;gt;/opt/fhem&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; contains the profile for the parent process and each &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile for a child process forked by the parent process. Not &amp;lt;tt&amp;gt;nytprof.out&amp;lt;/tt&amp;gt; but the largest &amp;lt;tt&amp;gt;nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/tt&amp;gt; file contains the profile of the master process since FHEM does an initial fork when it is ready.&lt;br /&gt;
&lt;br /&gt;
You transfer the profile of the master process into something human-readable by issueing the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nytprofhtml -f nytprof.out.&amp;amp;lt;pid&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces a subfolder names &amp;lt;tt&amp;gt;nytprof.&amp;lt;/tt&amp;gt; Direct your browser to file &amp;lt;tt&amp;gt;index.html&amp;lt;/tt&amp;gt; therein. You will get a bunch of information how FHEM spends its time.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=IPCAM&amp;diff=21256</id>
		<title>IPCAM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=IPCAM&amp;diff=21256"/>
		<updated>2017-04-12T12:31:09Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Pfad-Parameter für Foscam FI9831P */ pathCmd und die Attribute angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung von Netzwerkkameras&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=49_IPCAM.pm&lt;br /&gt;
|ModOwner=mfr69bs ({{Link2FU|6|Martin Fischer}})}}&lt;br /&gt;
&lt;br /&gt;
[[IPCAM]] ermöglicht die ereignis- oder zeitgesteuerte Erzeugung von Mitschnitten bei Netzwerkkameras. Außerdem ist es möglich, die Kamera im PTZ-Modus oder über eigene Befehle zu steuern.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Die Kamera(bilder) müssen über eine URL erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Das IPCAM Objekt wird angelegt mit&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;define &amp;lt;name&amp;gt; IPCAM &amp;lt;ip[:port]&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zum obigen Define muss zwingend noch das &#039;&#039;path&#039;&#039; Attribut gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Die wichtigsten Attribute von &#039;&#039;IPCAM&#039;&#039; werden im Folgenden aufgeführt, die komplette Liste findet sich in der commandref (siehe Infobox).&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung ===&lt;br /&gt;
;basicauth&lt;br /&gt;
:Hinterlegung von Benutzernamen und Passwort &lt;br /&gt;
&lt;br /&gt;
=== Eigene Befehle ===&lt;br /&gt;
;cmd01, cmd02, ... cmd15&lt;br /&gt;
:Festlegung von Befehlen, die nicht zu den vordefinierten gehören, z.B. &amp;lt;code&amp;gt;attr ipcam cmd01 led_mode=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vordefinierte Befehle ===&lt;br /&gt;
;cmdPanLeft, cmdPanRight, cmdTiltUp, cmdTiltDown, cmdStep &lt;br /&gt;
:Diesen Befehlen können die Kameraspezifischen Werte zugeordnet werden, z.B. &amp;lt;code&amp;gt;attr ipcam cmdTiltUp command=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfade ===&lt;br /&gt;
;path&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Netzwerkkameras ==&lt;br /&gt;
{{Randnotiz|RNText=Die Aufzählungen der unterstützten und der problematischen Netzwerkkameras sollten ergänzt werden, sobald neue Erkenntnisse vorliegen; beide Listen sind nicht vollständig.}}&lt;br /&gt;
Bei den folgenden Netzwerkkameras ist gesichert, dass sie durch das &#039;&#039;IPCAM&#039;&#039; Modul unterstützt sind:&lt;br /&gt;
* {{Link2Forum|Topic=33347|Message=257115|LinkText=Foscam 9805W}}&lt;br /&gt;
* {{Link2Forum|Topic=13826|LinkText=Instar 2905}}&lt;br /&gt;
* {{Link2Forum|Topic=36201|LinkText=IN-6001HD}}&lt;br /&gt;
* {{Link2Forum|Topic=11664|LinkText=Instar 6011, 6012, 2905}}&lt;br /&gt;
* {{Link2Forum|Topic=58676|LinkText=Instar IN-5905HD, IN-5907HD, IN-6014HD, IN-6012HD-PoE}}&lt;br /&gt;
* {{Link2Forum|Topic=15217|LinkText=WansView (Modell nicht näher spezifiziert)}}&lt;br /&gt;
* {{Link2Forum|Topic=11664|Message=158052|LinkText=Wansview 620, 625, 6012}}&lt;br /&gt;
* Axis 205&lt;br /&gt;
* D-Link DCS-933&lt;br /&gt;
&lt;br /&gt;
Nicht gesichert, ob die Kamera unterstützt wird bzw. ob alle Funktionen nutzbar sind:&lt;br /&gt;
* {{Link2Forum|Topic=33347|LinkText=Foscam FI9831W}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für Axis 205 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Cam1 path /jpg/image.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für D-Link DCS-933 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Cam1 path image.jpg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameter für Hikvision DS-2CD2032-I ===&lt;br /&gt;
Mit folgenden Parameter wurde (lt. diesem {{Link2Forum|Topic=39932|Message=322269|LinkText=Forenbeitrag}}) die Hikvision DS-2CD2032-I erfolgreich betrieben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Cam1 IPCAM 192.168.xxx.xxx&lt;br /&gt;
attr Cam1 basicauth &amp;lt;username&amp;gt;:&amp;lt;passwort&amp;gt;&lt;br /&gt;
attr Cam1 delay 0&lt;br /&gt;
attr Cam1 group Kamera&lt;br /&gt;
attr Cam1 icon it_camera&lt;br /&gt;
attr Cam1 path Streaming/channels/1/picture?snapShotImageType=JPEG&lt;br /&gt;
attr Cam1 snapshots 1&lt;br /&gt;
attr Cam1 storage /opt/fhem/www/snapshots/cam1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für Foscam FI9831P ===&lt;br /&gt;
Die Version ist ohne basicauth und hat Nutzer und Passwort direkt in der URL. Kann natürlich geändert werden.&lt;br /&gt;
Sämtliche Befehle für die Foscam HD Kameras findet man [https://www.manualslib.com/manual/728928/Foscam-Ip-Camera.html hier]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define IPKamera IPCAM &amp;lt;ip&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
attr IPKamera cmd01 cmd=ptzStopRun&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdPanLeft cmd=ptzMoveLeft&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdPanRight cmd=ptzMoveRight&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdPos01 cmd=ptzGotoPresetPoint&amp;amp;name=&amp;lt;Nameposition&amp;gt;&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdTiltDown cmd=ptzMoveDown&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera cmdTiltUp cmd=ptzMoveUp&amp;amp;usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera path cgi-bin/CGIProxy.fcgi?usr=xxx&amp;amp;pwd=xxx&amp;amp;cmd=snapPicture2&lt;br /&gt;
attr IPKamera pathCmd cgi-bin/CGIProxy.fcgi&lt;br /&gt;
attr IPKamera pathPanTilt cgi-bin/CGIProxy.fcgi?usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera storage ./www/images/webcam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nicht unterstützte Netzwerkkameras ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die hier aufgeführten Netzwerkkameras sind definitiv nicht unterstützt oder es gibt gravierende, hier beschriebene Einschränkungen.}}&lt;br /&gt;
;TRENDnet TV-IP320PI &lt;br /&gt;
:Aufruf der Funktion &amp;lt;code&amp;gt;get &#039;&#039;myCam&#039;&#039; image&amp;lt;/code&amp;gt; führt zur Fehlermeldung &#039;&#039;...invalid Format&#039;&#039;; auf Kamerabild oder Stream kann jedoch über die URL camHostnameOrIP/Streaming/channels/1/Picture (Bild) bzw. camHostnameOrIP/Streaming/channels/1/httpPreview (Stream) zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
== Generierte Ereignisse ==&lt;br /&gt;
Das Modul &#039;&#039;IPCAM&#039;&#039; generiert die Ereignisse &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;last: &amp;lt;name_of_device&amp;gt;_snapshot.&amp;lt;image_extension&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;snapshots: &amp;lt;total_number_of_taken_snapshots_at_end&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Derzeit (08/2015) ist das Logging aus dem Modul zumindest lückenhaft und verbesserungsfähig. So sollten z.B. einige weitere Meldungen zur Fehlereingrenzung bei der Einrichtung eines IPCAM Objekts eingefügt werden:&lt;br /&gt;
* Ausgabe des kompletten Pfads / der URL, die bei der Erzeugung eines Snapshots aus einzelnen Bestandteilen zusammengesetzt wird&lt;br /&gt;
* Die Zuordnung von Meldungen zu &#039;&#039;verbose&#039;&#039;-Leveln sollte kontrolliert und ggf. umgestellt werden&lt;br /&gt;
* siehe auch diesen {{Link2Forum|Topic=39932|LinkText=Forenthread}}, der Beschreibung von Problemen, eine Hikvision IPCam in Betrieb zu nehmen&lt;br /&gt;
&lt;br /&gt;
Außerdem müsste das Modul dringend auf die aktuelle Form des Logging, [[verbose|verbose/Log3]], umgestellt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung für das Problem &amp;quot;Wrong or not supported image format: unknown&amp;quot; habe ich hier beschrieben: {{Link2Forum|Topic=10772|Message=425265|LinkText=Forenbeitrag}}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Forenthread zur {{Link2Forum|Topic=10772|LinkText=Erweiterung des IPCAM Moduls}}&lt;br /&gt;
* Forenthread zum Thema {{Link2Forum|Topic=21005|LinkText=Bewegungserkennung}}&lt;br /&gt;
* Forenthread zum Thema {{Link2Forum|Topic=30723|LinkText=Bewegungsmelder der Kamera &amp;quot;anzapfen&amp;quot;}}&lt;br /&gt;
* Webseite des Modulautors zum Thema [http://www.fischer-net.de/hausautomation/videoueberwachung.html Videoüberwachung]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Verkehrslage&amp;diff=19453</id>
		<title>Verkehrslage</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Verkehrslage&amp;diff=19453"/>
		<updated>2017-02-05T13:58:40Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Hinweis auf das Modul TRAFFIC eingebaut.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier wird ein Device erstellt um sich die [[Verkehrslage]] einer bestimmten Strecke anzeigen zu lassen. Das ganze beruht auf dem Modul [[HTTPMOD]]. &lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Inzwischen gibt es das Modul [[TRAFFIC]], welches die hier genannte Funktion bereits implementiert hat.}}&lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ziel ist es, dass ein Dummy die aktuelle Verkehrslage für einen bestimmten Weg anzeigt und sich regelmäßig aktualisiert.  &lt;br /&gt;
&lt;br /&gt;
== Vorraussetzungen ==&lt;br /&gt;
Benötigt wird das Modul [[HTTPMOD]], welches standardmäßig installiert ist. Weiterhin wird ein Google Account benötigt und ein API Key um auf die Daten der Google Verkehrslage zuzugreifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API Key von Google beziehen ==&lt;br /&gt;
Der Google API Key ist ein Schlüssel, welcher uns berechtigt Daten von Google zu erhalten. Google hat verschiedene Programme, welche über eine API Schnittstelle zur Verfügung gestellt werden. Damit nicht jeder einfach auf diese Daten zugreifen kann, wird der Key benötigt. Um diesen zu bekommen müsst ihr als aller erstes einen Google Account erstellen auf www.google.de &lt;br /&gt;
&lt;br /&gt;
Sobald ihr dies habt, müssen wir in die Developer Console. Grund ist, dass der Zugriff auf die Daten eigentlich für Entwickler ist. Dorthin gelang ihr über diesen [https://console.developers.google.com/start?hl=de Link]. &lt;br /&gt;
&lt;br /&gt;
Als nächstes müsst ihr oben Links auf &amp;quot;Google APIs verwenden&amp;quot; klicken und ein neues Projekt erstellen, wenn ihr noch keins habt.&lt;br /&gt;
&lt;br /&gt;
Jetzt in der Übersicht beim Reiter &amp;quot;Google APIs&amp;quot; unter Google Maps API &amp;quot;Google Maps Distance Matrix API&amp;quot; auswählen und dort auf den blauen Button &amp;quot;Enable&amp;quot; klicken.  &lt;br /&gt;
&lt;br /&gt;
Unter dem Reiter &amp;quot;Nutzung&amp;quot; könnt ihr später die Häufigkeit eurer Zugriffe anzeigen lassen. Unter dem Reiter &amp;quot;Kontingente&amp;quot; seht ihr, wie viele Zugriffe ihr an diesem Tag noch tätigen könnt. Insgesamt sind 2500 Zugriffe pro Tag erlaubt. Das sind etwa 1,7 Zugriffe pro Minute. So viele sollte man eigentlich nicht brauchen. &lt;br /&gt;
&lt;br /&gt;
Auf der linken Seite unter &amp;quot;Zugangsdaten&amp;quot; kann man sich nun auch seinen Key anzeigen lassen. Diesen werden wir später für die Zugriffe benötigen. &lt;br /&gt;
&lt;br /&gt;
== Link für das Modul erstellen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://maps.googleapis.com/maps/api/distancematrix/json?origins=ORT,STRASSE+NR&amp;amp;destinations=ORT,STRASSE+NR&amp;amp;mode=driving&amp;amp;language=de-DE&amp;amp;departure_time=now&amp;amp;key=APIKEY&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Den Link müssen wir mit unseren eigenen Angaben ergänzen. Starten wir zB in Frankfurt an der Friedberger Straße 291 und wollen nach Gießen in die Straße Schiffenberger Weg 115 sieht unser Link wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://maps.googleapis.com/maps/api/distancematrix/json?origins=Frankfurt,Friedberger%20Stra%C3%9Fe%20291&amp;amp;destinations=Gie%C3%9Fen,%20Schiffenberger%20Weg%20115&amp;amp;mode=driving&amp;amp;language=de-DE&amp;amp;departure_time=now&amp;amp;key=APIKEY&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich den Link einmal in die Browserzeile einzugeben. Dann muss auch nicht auf Leerzeichen geachtet werden und Google formatiert ihn uns automatisch, wie wir ihn brauchen. Übrigens seht ihr dann auch, wie die Seite aussieht, auf welche wir später mit dem HTTPMOD Modul zugreifen werden. &lt;br /&gt;
&lt;br /&gt;
== HTTPMOD Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
=== Definieren des Device ===&lt;br /&gt;
Wenn wir nun unseren Google API Key und den Link haben, müssen wir ein neues Device mittels des [[HTTPMOD]] Moduls anlegen. In unserem Beispiel werden wir es wie folgt nennen: Verkehr.FFM.GI Verkehr für die Übersicht, FFM, weil wir ins Frankfurt am Main starten werden und GI, weil wir in Gießen enden. &lt;br /&gt;
&lt;br /&gt;
Wir geben also folgendes in unsere Kommandozeile ein: &lt;br /&gt;
&amp;lt;pre&amp;gt;define Verkehr.FFM.GI HTTPMOD Link 3600&amp;lt;/pre&amp;gt; &lt;br /&gt;
in unserem Beispiel also:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Verkehr.FFM.GI HTTPMOD https://maps.googleapis.com/maps/api/distancematrix/json?origins=Frankfurt,Friedberger%20Stra%C3%9Fe%20291&amp;amp;destinations=Gie%C3%9Fen,%20Schiffenberger%20Weg%20115&amp;amp;mode=driving&amp;amp;language=de-DE&amp;amp;departure_time=now&amp;amp;key=APIKEY 3600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahl am Ende bestimmt die Häufigkeit der Abfrage in Sekunden. In unserem Fall also einmal die Stunde.&lt;br /&gt;
&lt;br /&gt;
=== Anlegen der Attribute ===&lt;br /&gt;
Die benötigten Daten werden nun über die Attribut readingXXName und readingXXRegex abgefragt. &lt;br /&gt;
&lt;br /&gt;
readingXXName: Hiermit geben wir dem späteren Reading einen Namen. &lt;br /&gt;
&lt;br /&gt;
readingXXRegex: Hier wird festgelegt, welcher Teil des Textes &amp;quot;herausgeschnitten&amp;quot; werden soll.&lt;br /&gt;
&lt;br /&gt;
XX: Wird durch Zahlen ersetzt, damit man eine Übersicht hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als aller Erstes müssen wir uns unsere eigenen Attribute vorbereiten. Dies machen wir mit dem attr userattr wie folgt:&lt;br /&gt;
&lt;br /&gt;
==== UserReadings Attribut ====&lt;br /&gt;
Hier definieren wir die später benötigte Attribute:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehr zu den Attributen unter [[HTTPMOD]].&lt;br /&gt;
&lt;br /&gt;
Legen wir nun unsere weiteren Attribut an:&lt;br /&gt;
&lt;br /&gt;
==== Dauer der Reise ====&lt;br /&gt;
Die Dauer der Reise greifen wir mit den Attributen: &lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading01Name duration &lt;br /&gt;
attr Verkehr.FFM.GI reading01Regex &amp;quot;duration&amp;quot;\s*:\s*{\s*[&amp;quot;\w\s:,]+&amp;quot;value&amp;quot;\s*:\s*(\d+)\s*} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;duration&amp;quot; heißen. Darin wird die Dauer der Reise in Sekunden angegeben.&lt;br /&gt;
&lt;br /&gt;
==== Dauer der Reise mit aktuellem Verkehr ====&lt;br /&gt;
Die Dauer der Reise mit Verkehr greifen wir mit den Attributen: &lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading02Name duration_in_traffic &lt;br /&gt;
attr Verkehr.FFM.GI reading02Regex &amp;quot;duration_in_traffic&amp;quot;\s*:\s*{\s*[&amp;quot;\w\s:,]+&amp;quot;value&amp;quot;\s*:\s*(\d+)\s*}  &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;duration&amp;quot; heißen. Darin wird die Dauer der Reise in Sekunden angegeben.&lt;br /&gt;
&lt;br /&gt;
==== Entfernung ====&lt;br /&gt;
Die Entfernung greifen wir mit den Attributen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading03Name distance &lt;br /&gt;
attr Verkehr.FFM.GI reading03Regex &amp;quot;distance&amp;quot;\s*:\s*{\s*[&amp;quot;\w\s:,]+&amp;quot;value&amp;quot;\s*:\s*(\d+)\s*}   &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;distance&amp;quot; heißen und uns die Entfernung angeben.&lt;br /&gt;
&lt;br /&gt;
==== Zielort ====&lt;br /&gt;
Den Zielort greifen wir mit den Attributen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading04Name destination_addresses  &lt;br /&gt;
attr Verkehr.FFM.GI reading04Regex &amp;quot;destination_addresses&amp;quot;\s*:\s*\[\s*&amp;quot;([\w\s.,-:üöäß(\)]+)&amp;quot;\s*\]   &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;destination_addresses&amp;quot; heißen und uns den Zielort angeben.&lt;br /&gt;
&lt;br /&gt;
==== Startort ====&lt;br /&gt;
Den Startort greifen wir mit den Attributen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading05Name origin_addresses  &lt;br /&gt;
attr Verkehr.FFM.GI reading05Regex &amp;quot;origin_addresses&amp;quot;\s*:\s*\[\s*&amp;quot;([\w\s.,-:üöäß(\)]+)&amp;quot;\s*\]   &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;origin_addresses&amp;quot; heißen und uns den Zielort angeben.&lt;br /&gt;
&lt;br /&gt;
==== Berechnung der Werte für die spätere Anzeige ====&lt;br /&gt;
Damit die Werte später User freundlich angezeigt werden, lassen wir sie von FHEM berechnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI userReadings duration_hr {strftime &amp;quot;%H:%M&amp;quot;, gmtime( int( ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration&amp;quot;,0) /60+0.5)*60 );}, duration_in_traffic_hr {strftime &amp;quot;%H:%M&amp;quot;, gmtime( int( ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration_in_traffic&amp;quot;,0) /60+0.5)*60 );}, distance_hr {int( ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;distance&amp;quot;,0) /1000+0.5);}, duration_diff {int((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration_in_traffic&amp;quot;,0)-ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration&amp;quot;,0))/60+0.5);}, duration_diff_hr {my $diff=int((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration_in_traffic&amp;quot;,0)-ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration&amp;quot;,0))/60+0.5); return &amp;quot;+&amp;quot;.$diff if ($diff&amp;gt;0); return &amp;quot;+0&amp;quot;;} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== State Anzeige ====&lt;br /&gt;
Uns als letztes noch, wie wir das ganze in State angezeigt bekommen möchten:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI stateFormat duration_hr duration_diff_hr Min. (distance_hr km) &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fertig ==&lt;br /&gt;
Fertig ist das Device, welches uns nun unseren Weg anzeigt. Natürlich könnt ihr die einzelnen Berechnungen und auch die State Anzeige für euch selbst anpassen und entsprechend ändern.&lt;br /&gt;
&lt;br /&gt;
== Anmerkung ==&lt;br /&gt;
Zwei Dinge möchte ich anmerken:&lt;br /&gt;
&lt;br /&gt;
1. Das ganze beruht auf {{Link2Forum|Topic=20151|Message=363109|LinkText=diesem}} und {{Link2Forum|Topic=20151|Message=365322|LinkText=diesem}} Beitrag. &lt;br /&gt;
&lt;br /&gt;
2. Sobald Google die Ausgabe der Website verändert, wird es vermutlich nicht mehr funktionieren. Wie ihr dem Thema im Forum entnehmen könnt, ist dies schon vorgekommen. Daher nicht wundern, sondern im Forum schauen, ob es schon eine Veränderung gibt oder selbst die Readings anpassen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=IPCAM&amp;diff=19410</id>
		<title>IPCAM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=IPCAM&amp;diff=19410"/>
		<updated>2017-02-04T12:24:34Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: FOSCAM FI9831P als Beispiel hinzugefügt. Auf Foscam Befehle externe verlinkt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung von Netzwerkkameras&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=49_IPCAM.pm&lt;br /&gt;
|ModOwner=mfr69bs ({{Link2FU|6|Martin Fischer}})}}&lt;br /&gt;
&lt;br /&gt;
[[IPCAM]] ermöglicht die ereignis- oder zeitgesteuerte Erzeugung von Mitschnitten bei Netzwerkkameras. Außerdem ist es möglich, die Kamera im PTZ-Modus oder über eigene Befehle zu steuern.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Die Kamera(bilder) müssen über eine URL erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Das IPCAM Objekt wird angelegt mit&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;define &amp;lt;name&amp;gt; IPCAM &amp;lt;ip[:port]&amp;gt; &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zum obigen Define muss zwingend noch das &#039;&#039;path&#039;&#039; Attribut gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Die wichtigsten Attribute von &#039;&#039;IPCAM&#039;&#039; werden im Folgenden aufgeführt, die komplette Liste findet sich in der commandref (siehe Infobox).&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung ===&lt;br /&gt;
;basicauth&lt;br /&gt;
:Hinterlegung von Benutzernamen und Passwort &lt;br /&gt;
&lt;br /&gt;
=== Eigene Befehle ===&lt;br /&gt;
;cmd01, cmd02, ... cmd15&lt;br /&gt;
:Festlegung von Befehlen, die nicht zu den vordefinierten gehören, z.B. &amp;lt;code&amp;gt;attr ipcam cmd01 led_mode=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vordefinierte Befehle ===&lt;br /&gt;
;cmdPanLeft, cmdPanRight, cmdTiltUp, cmdTiltDown, cmdStep &lt;br /&gt;
:Diesen Befehlen können die Kameraspezifischen Werte zugeordnet werden, z.B. &amp;lt;code&amp;gt;attr ipcam cmdTiltUp command=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfade ===&lt;br /&gt;
;path&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Netzwerkkameras ==&lt;br /&gt;
{{Randnotiz|RNText=Die Aufzählungen der unterstützten und der problematischen Netzwerkkameras sollten ergänzt werden, sobald neue Erkenntnisse vorliegen; beide Listen sind nicht vollständig.}}&lt;br /&gt;
Bei den folgenden Netzwerkkameras ist gesichert, dass sie durch das &#039;&#039;IPCAM&#039;&#039; Modul unterstützt sind:&lt;br /&gt;
* {{Link2Forum|Topic=33347|Message=257115|LinkText=Foscam 9805W}}&lt;br /&gt;
* {{Link2Forum|Topic=13826|LinkText=Instar 2905}}&lt;br /&gt;
* {{Link2Forum|Topic=36201|LinkText=IN-6001HD}}&lt;br /&gt;
* {{Link2Forum|Topic=11664|LinkText=Instar 6011, 6012, 2905}}&lt;br /&gt;
* {{Link2Forum|Topic=58676|LinkText=Instar IN-5905HD, IN-5907HD, IN-6014HD, IN-6012HD-PoE}}&lt;br /&gt;
* {{Link2Forum|Topic=15217|LinkText=WansView (Modell nicht näher spezifiziert)}}&lt;br /&gt;
* {{Link2Forum|Topic=11664|Message=158052|LinkText=Wansview 620, 625, 6012}}&lt;br /&gt;
* Axis 205&lt;br /&gt;
* D-Link DCS-933&lt;br /&gt;
&lt;br /&gt;
Nicht gesichert, ob die Kamera unterstützt wird bzw. ob alle Funktionen nutzbar sind:&lt;br /&gt;
* {{Link2Forum|Topic=33347|LinkText=Foscam FI9831W}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für Axis 205 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Cam1 path /jpg/image.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für D-Link DCS-933 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Cam1 path image.jpg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameter für Hikvision DS-2CD2032-I ===&lt;br /&gt;
Mit folgenden Parameter wurde (lt. diesem {{Link2Forum|Topic=39932|Message=322269|LinkText=Forenbeitrag}}) die Hikvision DS-2CD2032-I erfolgreich betrieben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Cam1 IPCAM 192.168.xxx.xxx&lt;br /&gt;
attr Cam1 basicauth &amp;lt;username&amp;gt;:&amp;lt;passwort&amp;gt;&lt;br /&gt;
attr Cam1 delay 0&lt;br /&gt;
attr Cam1 group Kamera&lt;br /&gt;
attr Cam1 icon it_camera&lt;br /&gt;
attr Cam1 path Streaming/channels/1/picture?snapShotImageType=JPEG&lt;br /&gt;
attr Cam1 snapshots 1&lt;br /&gt;
attr Cam1 storage /opt/fhem/www/snapshots/cam1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pfad-Parameter für Foscam FI9831P ===&lt;br /&gt;
Die Version ist ohne basicauth und hat Nutzer und Passwort direkt in der URL. Kann natürlich geändert werden.&lt;br /&gt;
Sämtliche Befehle für die Foscam HD Kameras findet man [https://www.manualslib.com/manual/728928/Foscam-Ip-Camera.html hier]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define IPKamera IPCAM &amp;lt;ip&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
attr IPKamera cmd01 cmd=ptzStopRun&lt;br /&gt;
attr IPKamera cmdPanLeft cmd=ptzMoveLeft&lt;br /&gt;
attr IPKamera cmdPanRight cmd=ptzMoveRight&lt;br /&gt;
attr IPKamera cmdPos01 cmd=ptzGotoPresetPoint&amp;amp;name=&amp;lt;Nameposition&amp;gt;&lt;br /&gt;
attr IPKamera cmdTiltDown cmd=ptzMoveDown&lt;br /&gt;
attr IPKamera cmdTiltUp cmd=ptzMoveUp&lt;br /&gt;
attr IPKamera path cgi-bin/CGIProxy.fcgi?usr=xxx&amp;amp;pwd=xxx&amp;amp;cmd=snapPicture2&lt;br /&gt;
attr IPKamera pathCmd cgi-bin/CGIProxy.fcgi?usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera pathPanTilt cgi-bin/CGIProxy.fcgi?usr=xxx&amp;amp;pwd=xxx&lt;br /&gt;
attr IPKamera storage ./www/images/webcam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aktuell gibt es noch eine Diskussion zum Problem mit pathcmd. Siehe dazu [https://forum.fhem.de/index.php/topic,65539.msg576760.html#msg576760 hier]&lt;br /&gt;
&lt;br /&gt;
== Nicht unterstützte Netzwerkkameras ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die hier aufgeführten Netzwerkkameras sind definitiv nicht unterstützt oder es gibt gravierende, hier beschriebene Einschränkungen.}}&lt;br /&gt;
;TRENDnet TV-IP320PI &lt;br /&gt;
:Aufruf der Funktion &amp;lt;code&amp;gt;get &#039;&#039;myCam&#039;&#039; image&amp;lt;/code&amp;gt; führt zur Fehlermeldung &#039;&#039;...invalid Format&#039;&#039;; auf Kamerabild oder Stream kann jedoch über die URL camHostnameOrIP/Streaming/channels/1/Picture (Bild) bzw. camHostnameOrIP/Streaming/channels/1/httpPreview (Stream) zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
== Generierte Ereignisse ==&lt;br /&gt;
Das Modul &#039;&#039;IPCAM&#039;&#039; generiert die Ereignisse &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;last: &amp;lt;name_of_device&amp;gt;_snapshot.&amp;lt;image_extension&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;snapshots: &amp;lt;total_number_of_taken_snapshots_at_end&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Derzeit (08/2015) ist das Logging aus dem Modul zumindest lückenhaft und verbesserungsfähig. So sollten z.B. einige weitere Meldungen zur Fehlereingrenzung bei der Einrichtung eines IPCAM Objekts eingefügt werden:&lt;br /&gt;
* Ausgabe des kompletten Pfads / der URL, die bei der Erzeugung eines Snapshots aus einzelnen Bestandteilen zusammengesetzt wird&lt;br /&gt;
* Die Zuordnung von Meldungen zu &#039;&#039;verbose&#039;&#039;-Leveln sollte kontrolliert und ggf. umgestellt werden&lt;br /&gt;
* siehe auch diesen {{Link2Forum|Topic=39932|LinkText=Forenthread}}, der Beschreibung von Problemen, eine Hikvision IPCam in Betrieb zu nehmen&lt;br /&gt;
&lt;br /&gt;
Außerdem müsste das Modul dringend auf die aktuelle Form des Logging, [[verbose|verbose/Log3]], umgestellt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung für das Problem &amp;quot;Wrong or not supported image format: unknown&amp;quot; habe ich hier beschrieben: {{Link2Forum|Topic=10772|Message=425265|LinkText=Forenbeitrag}}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Forenthread zur {{Link2Forum|Topic=10772|LinkText=Erweiterung des IPCAM Moduls}}&lt;br /&gt;
* Forenthread zum Thema {{Link2Forum|Topic=21005|LinkText=Bewegungserkennung}}&lt;br /&gt;
* Forenthread zum Thema {{Link2Forum|Topic=30723|LinkText=Bewegungsmelder der Kamera &amp;quot;anzapfen&amp;quot;}}&lt;br /&gt;
* Webseite des Modulautors zum Thema [http://www.fischer-net.de/hausautomation/videoueberwachung.html Videoüberwachung]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=17728</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=17728"/>
		<updated>2016-12-11T20:05:56Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: DOIF Zeilenumbruch eingefügt für bessere Lesbarkeit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Alexa-Fhem&#039;&#039;&#039; ist eine in JavaScript und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im [https://forum.fhem.de/index.php/topic,60244.0.html Forum] veröffentlicht.&lt;br /&gt;
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModTechName=&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModOwner=justme1968&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
Echo -&amp;gt; AVS -&amp;gt; AWS Lambda -&amp;gt; alexa-fhem -&amp;gt; AWS Lambds -&amp;gt; AVS -&amp;gt; Echo&lt;br /&gt;
 &lt;br /&gt;
*Der Echo (oder ein anderes Alexa/AVS fähiges device)  nimmt Audiodaten auf und schickt diese an AVS  (Amazon Voice Service) zur Erkennung&lt;br /&gt;
*AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den Erkannten Daten&lt;br /&gt;
:*Beim Custom Sill kommen die dazu nötgen Informationen aus dem &#039;&#039;Interaction Model&#039;&#039; der Alexa Skills Konfiguration&lt;br /&gt;
:*Beim Home Automation Skill sind die möglichen Sätze fest vorgegeben &lt;br /&gt;
*Das Event wird an den unter &#039;&#039;Configruation&#039;&#039; in der Alexa Skills Konfiguration hinterlegten Endpoint geschickt&lt;br /&gt;
:*Beim Home Automation Skill ist das zwingend eine AWS Lambda Routine&lt;br /&gt;
:*Beim Custom Skill kann das im Prinzip auch ein eigener Web Service sein&lt;br /&gt;
*Das Event wird vom &amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; code an alexa-fhem weitergeleitet&lt;br /&gt;
*alexa-fhem steuert FHEM und sendet ein Antwort Event zurück&lt;br /&gt;
*&amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; nimmt diese Antwort entgegen und gibt sie an AVS zurück&lt;br /&gt;
*AVS sogt dafür das der echo &#039;antwortet&#039; und das die Card in der Alexa App erscheint&lt;br /&gt;
&lt;br /&gt;
===Anmerkungen===&lt;br /&gt;
*Ein Skill hat keinen zugriff auf die Audiodaten&lt;br /&gt;
*Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und &#039;einfach&#039; Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.&lt;br /&gt;
*Es ist ein kleines Wunder wie schnell die Reaktion auf einen gesprochenen Satz erfolgt wenn man berücksichtigt welchen Weg die Daten insgesamt gehen.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Grundvoraussetzung für alle folgenden Schritte ist, dass ein Amazon-Account vorhanden ist. Es wird davon ausgegangen, dass bereits für alle folgenden Amazon-Dienste vorab das Konto jeweils eingerichtet wurde, die Einrichtung dieser ist nicht Bestandteil dieser Anleitungen.&lt;br /&gt;
&lt;br /&gt;
Es sei an dieser Stelle darauf hingewiesen, dass für die Nutzung der Amazon AWS-Dienste zwingend die Daten einer Kreditkarte angegeben werden müssen. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Da die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Dies vermeidet Fehler, die ansonsten geschehen können. Während der Konfiguration bietet es sich an diese Schritte dann parallel in gleichzeitig geöffneten Browserfenster durchzuführen. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
Folgende grundlegende Voraussetzungen sollten erfüllt sein, bevor du mit der Einrichtung beginnst:&lt;br /&gt;
* Amazon Echo oder Amazon Dot&lt;br /&gt;
* node.js (vermutlich ab Version 0.12.7, getestet mit 4.2.6. Kann in Debian z.B. mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo apt-get install nodejs-legacy&amp;lt;/source&amp;gt; installiert werden)&lt;br /&gt;
* Weiterleitung von Port 3000 vom Router aus auf den Rechner, auf dem Alexa-Fhem läuft&lt;br /&gt;
* Es empfiehlt sich ein alexa Gerät in FHEM anzulegen.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem installieren ===&lt;br /&gt;
# Die tgz-Datei entpacken (Quelle: https://forum.fhem.de/index.php/topic,60244.0.html)&lt;br /&gt;
# Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen&lt;br /&gt;
# Durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/source&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit (kein sudo!) &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von (kein sudo!)&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/source&amp;gt;. Hierbei beachten, dass ein Kennwort vergeben werden soll, das mindestens aus 4 Zeichen besteht.&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;~/.alexa/config.json&#039;&#039; kopieren und die Werte auf die eigene Umgebung hin anpassen. Der Filter funktioniert hierbei wie bei [http://www.fhemwiki.de/wiki/Homebridge_einrichten#Einstellungen_f.C3.BCr_homebridge homebridge-fhem],die folgenden Zeilen sind anzupassen oder zu löschen:&amp;lt;br&amp;gt;&amp;quot;nat-pmp&amp;quot;: -&amp;gt; wenn nat-pmp verwendet werden soll: die ip des eigenen routers,&amp;lt;br&amp;gt;&amp;quot;nat-upnp&amp;quot;: -&amp;gt; wenn nat-upnp verwendet werden soll: &#039;&#039;true&#039;&#039;,&amp;lt;br&amp;gt;&amp;quot;applicationId&amp;quot;: -&amp;gt; SkillID aus &amp;quot;Alexa Custom Skill anlegen&amp;quot; Punkt 7 (s.u.),&amp;lt;br&amp;gt;&amp;quot;oauthClientID&amp;quot;: -&amp;gt; &#039;&#039;Client Id&#039;&#039; aus Punkt 1. &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&lt;br /&gt;
# Durch Aufruf von &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/source&amp;gt; den Dienst starten (kein sudo!)&lt;br /&gt;
&lt;br /&gt;
Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem aus FHEM heraus starten ===&lt;br /&gt;
Zunächst das Start-up-Skript aus diesem Post herunterladen [https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271 https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271] und unter /etc/init.d/alexa speichern.&lt;br /&gt;
&lt;br /&gt;
Das Script geht davon aus, das der alexa-fhem script unter /opt/fhem/alexa-fhem liegt, und die logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Nun folgende Kommandos ausführen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo chmod 755 /etc/init.d/alexa&lt;br /&gt;
sudo update-rc.d alexa defaults&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; den User fhem für die Nutzung von sudo zulassen (&amp;lt;code&amp;gt;sudo nano /etc/sudoers&amp;lt;/code&amp;gt;), z.B. durch Anfügen der nachfolgenden Zeile:&lt;br /&gt;
&amp;lt;code&amp;gt;fhem ALL=(ALL) NOPASSWD: ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.Status dummy&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa dummy&lt;br /&gt;
attr FHEM.Alexa event-on-change-reading state&lt;br /&gt;
attr FHEM.Alexa webCmd status:start:stop:restart&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq &amp;quot;start&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa start &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;stop&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa stop &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;restart&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa restart &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;status&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa status &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)})&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Device mit dem Modul 39_alexa.pm anlegen ===&lt;br /&gt;
&lt;br /&gt;
Das Modul 39_alexa.pm stellt innerhalb von FHEM verschiedene Attribute z.B. alexaName oder alexaRoom zur Verfügung. Manche dieser Attribute (wie z.b. alexaName) werden in beiden Skills verwendet, andere werden ausschließlich bei einer Nutzung des Alexa Custom Skill verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Alexa Device geschieht durch die nachfolgende Definition:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skills anlegen ===&lt;br /&gt;
&lt;br /&gt;
==== Abgrenzung des &#039;&#039;&#039;Alexa Smart Home Skills&#039;&#039;&#039; und des &#039;&#039;&#039;Alexa Custom Skills&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
Der Alexa Smart Home Skill ist ein Amazon-Alexa-Standard-Skill, der wesentliche Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein &amp;quot;Alexa, schalte die Wohnzimmerlampe an&amp;quot; um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik &amp;quot;Smart Home&amp;quot; als Skill angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der Alexa Custom Skill ist kein Standard-Smart-Home-Skill, sondern ein individuell entwickelter Skill, so wie alle anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik &amp;quot;Smart Home&amp;quot; angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. &amp;quot;Alexa, starte [Name des Skills]&amp;quot;) oder direkt angesprochen wird (z.B. &amp;quot;Alexa, frage [Name des Skills] wie ist der Status von [Device] &amp;quot;). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch werden anspruchsvollere Steuerungsmöglichkeiten nur mit diesem realisiert werden können.&lt;br /&gt;
&lt;br /&gt;
=== Alexa Smart Home Skill anlegen ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Apps &amp;amp; Services ====&lt;br /&gt;
# Klicke nach der Anmeldung auf &#039;&#039;APPS &amp;amp; SERVICES&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Klicke anschließend auf &#039;&#039;Security Profiles&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-05-apps_and_services_-_security_profiles.png|200px]]&lt;br /&gt;
# Wähle anschließend &#039;&#039;Create a New Security Profile&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-06-apps_and_services_-_create_a_new_security_profile.png|200px]]&lt;br /&gt;
# Gebe dann ein Namen und eine Beschreibung für das Profil ein und bestätige die Eingaben durch anklicken von &#039;&#039;Save&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-07-apps_and_services_-_security_profile_management.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Login with Amazon ====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo &#039;&#039;Client Id&#039;&#039; und &#039;&#039;Client Secret&#039;&#039; zu finden ist}}&lt;br /&gt;
# Nachdem du die vorherigen Schritte befolgt hast, siehst du im Browser das Profil dass du angelegt hast. Klicke jetzt oben rechts auf &#039;&#039;Login with Amazon&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-08-login_with_amazon.png|200px]]&lt;br /&gt;
# Auf der neu geladenen Seite klickst du dann auf &#039;&#039;Sign up&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-09-login_with_amazon_-_sign_up.png|200px]]&lt;br /&gt;
# Wähle anschließend im Dropdown Menü das vorher angelegte Profil aus und bestätige das anschließend mit &#039;&#039;Confirm&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-10-login_with_amazon_-_create_new_profile.png|200px]] [[Datei:Developer.amazon.com-11-login_with_amazon_-_create_new_profile2.png|200px]]&lt;br /&gt;
# Im folgenden Fenster gibst du dann die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496] ein und bestätigst die Eingabe mit &#039;&#039;Save&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]&lt;br /&gt;
# Klicke dann bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad und wähle &#039;&#039;Web Settings&#039;&#039; aus&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]&lt;br /&gt;
# Im neu geladenen Fenster klickst du dann auf &#039;&#039;Edit&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-14-login_with_amazon_-_edit.png|200px]]&lt;br /&gt;
# Füge zuletzt dann bei &#039;&#039;Allowed Return URLs&#039;&#039; die Adresse [https://layla.amazon.co.uk/api/skill/link/xxx https://layla.amazon.co.uk/api/skill/link/xxx], [https://pitangui.amazon.com/api/skill/link/xxx https://pitangui.amazon.com/api/skill/link/xxx], und [https://layla.amazon.com/api/skill/link/xxx https://layla.amazon.com/api/skill/link/xxx] hinzu. xxx muss hierbei durch den Wert ersetzt werden, der bei Punkt 6 &#039;&#039;&#039;Skill Kit einrichten&#039;&#039;&#039; unter &#039;&#039;&#039;Redirect Urls&#039;&#039;&#039; am Ende der URLs angezeigt wird.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-15-login_with_amazon_-_allowed_return_urls.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Skill Kit einrichten ====&lt;br /&gt;
# Wähle im Menü den Punkt &#039;&#039;Alexa&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Klicke dann &#039;&#039;Get started&#039;&#039; beim Punkt &#039;&#039;Alexa Skills Kit&#039;&#039; an&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
# Wähle dann auf der neu geladenen Seite oben rechts &#039;&#039;Add a New Skill&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&lt;br /&gt;
# Auf der folgenden Seite wählst du &#039;&#039;Smart Home Skill API&#039;&#039; sowie &#039;&#039;German&#039;&#039; als Sprache aus und gibst ein Name für den Skill ein was du dann mit &#039;&#039;Next&#039;&#039; bestätigst.&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-19-alexa_-_alex_skills_kit_-_skill_information.png|200px]]&lt;br /&gt;
# Die folgende Seite klickst du mit &#039;&#039;Next&#039;&#039; dann weiter&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-20-alexa_-_alex_skills_kit_-_interaction_model.png|200px]]&lt;br /&gt;
# Auf der Seite Configuration gibst du dann unter &#039;&#039;&#039;Authorization URL&#039;&#039;&#039; die Adresse: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/source&amp;gt;an, bei &#039;&#039;&#039;Scope&#039;&#039;&#039;: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;profile:user_id&amp;lt;/source&amp;gt; und bei &#039;&#039;&#039;Access Token URI&#039;&#039;&#039;: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/source&amp;gt;sowie bei &#039;&#039;&#039;Privacy Policy URL&#039;&#039;&#039; die Adresse: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Folgende Felder müssen individuell ausgefüllt werden:&amp;lt;br /&amp;gt;* &#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; Europe auswählen und im Textfeld den Wert aus Punkt 12 &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; eintragen&amp;lt;br /&amp;gt;* &#039;&#039;Client Id&#039;&#039; -&amp;gt; &#039;&#039;Client Id&#039;&#039; aus Punkt 1. &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&amp;lt;br /&amp;gt;* &#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Punkt 1. &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-21-alexa_-_alex_skills_kit_-_configuration.png|200px]]&lt;br /&gt;
# &amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-22-alexa_-_alex_skills_kit_-_test.png|200px]]&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die &#039;&#039;Alexa Skill Id&#039;&#039; zu finden ist}}&lt;br /&gt;
Zur späteren Verwendung unter Punkt 7 &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; wird noch die Application Id benötigt. An diese kommt man wie folgt:&lt;br /&gt;
# Wähle im Menü den Punkt &#039;&#039;Alexa&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Klicke dann &#039;&#039;Get started&#039;&#039; beim Punkt &#039;&#039;Alexa Skills Kit&#039;&#039; an&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
# Beim vorher angelegten Eintrag auf &#039;&#039;Edit&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]&lt;br /&gt;
# Die Id, die nun oben angezeigt wird, ist die gesuchte &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Alexa Custom Skill anlegen ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
# Wähle im Menü den Punkt &#039;&#039;Alexa&#039;&#039; aus und klicke dann &#039;&#039;Get started&#039;&#039; beim Punkt &#039;&#039;Alexa Skills Kit&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_1.PNG|400px]]&lt;br /&gt;
# Klicke dann oben rechts auf &#039;&#039;Add a new skill&#039;&#039;&lt;br /&gt;
# Auf der Seite &#039;&#039;&#039;Create a new Alexa Skill&#039;&#039;&#039; werden folgende Optionen gewählt / Informationen eingetragen:&lt;br /&gt;
#:* Skill Type = Custom Interaction Model&lt;br /&gt;
#:* Language = German&lt;br /&gt;
#:* Name: Hier dem Skill einen beliebigen Namen geben. Dieser wird in der Alexa App unter &amp;quot;Meine Skills&amp;quot; angezeigt.&lt;br /&gt;
#:* Invocation Name: Name des Skills, unter dem dieser später gestartet wird. Z.B. &amp;quot;Alexa, starte James&amp;quot;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_2.PNG|400px]]&lt;br /&gt;
# Mit &#039;&#039;Next&#039;&#039; die Seite verlassen.&lt;br /&gt;
# Auf der Seite &#039;&#039;&#039;Interaction Model&#039;&#039;&#039; folgende Eingaben tätigen:&lt;br /&gt;
#:* In die Box &#039;&#039;&#039;Intent Schema&#039;&#039;&#039; den Programmcode aus folgendem Post einfügen: [https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230 https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230]&amp;lt;br /&amp;gt;[[Datei:CustomSkill_3.PNG|400px]]&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird bereits die Skill ID angezeigt (siehe Screenshot), die später als zusätzlicher Trigger für AWS Lambda verwendet wird. Bitte per Copy / Paste speichern.}}&lt;br /&gt;
:* Nun auf &#039;&#039;Add Slot Type&#039;&#039; klicken und die Custom Slot Types (siehe [https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230 https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230]) einrichten. Bitte beachten, dass das Pipeline-Zeichen einen Zeilenumbruch darstellen soll. Im Screenshot ist sichtbar, wie das aussehen muss.&amp;lt;br /&amp;gt; Für FHEM_Device und FHEM_Room bitte die eigenen in FHEM definierten Devices und Räume benennen (siehe oben alexaName und alexaRoom).&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:CustomSkill_4.PNG|400px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Der Screenshot zeigt die Einrichtung für FHEM_DEVICE. Nach der Einrichtung von FHEM_DEVICE &#039;&#039;SAVE&#039;&#039; klicken und die weiteren Slot Types (FHEM_ROOM, FHEM_SWITCH_ACTION und FHEM_artikel) jeweils durch klicken auf &#039;&#039;Add Slot Type&#039;&#039; einrichten.&lt;br /&gt;
:* Unter Sample Utterances bitte den Text aus [https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230 https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230] reinkopieren&amp;lt;br /&amp;gt;[[Datei:CustomSkill_5.PNG|400px]]&lt;br /&gt;
#:* Eingaben mit &#039;&#039;Next&#039;&#039; abschließen.&lt;br /&gt;
# Auf der Folgeseite &#039;&#039;Configuration&#039;&#039; bitte folgende Angaben machen:&lt;br /&gt;
#:* Service Endpoint Type = AWS Lambda&lt;br /&gt;
#:* Geographical Region = Europe&lt;br /&gt;
#:* Im Feld &#039;&#039;Europe&#039;&#039; wird die ARN eingetragen, die man erst in nachfolgenden Abschnitt erhält! Es muss hier also erst mal pausiert werden! Den Browser Tab geöffnet lassen!&lt;br /&gt;
#:* Sobald man die ARN hat geht es hier weiter...&lt;br /&gt;
#:* Do you allow users to create an account or link to an existing account with you? = Yes&lt;br /&gt;
#:* Authorization URL = https://www.amazon.com/ap/oa&lt;br /&gt;
#:* Client ID = Client ID von oben aus &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&lt;br /&gt;
#:* Domain List - nichts eingeben&lt;br /&gt;
#:* Scope = profile:user_id&lt;br /&gt;
#:* Redirect URLs - sollten vorbelegt sein&lt;br /&gt;
#:* Authorization Grant Type - Auth Code Grant auswählen&lt;br /&gt;
#:* Access Token URI = https://api.amazon.com/auth/o2/token&lt;br /&gt;
#:* Client Secret = siehe oben bei &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&lt;br /&gt;
#:* Client Authentication Scheme = HTTP Basic&lt;br /&gt;
#:* Privacy Policy URL = https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&lt;br /&gt;
#:* Das sollte jetzt alles wie folgt aussehen:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:CustomSkill_6.PNG|400px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:CustomSkill_7.PNG|400px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
:* Damit ist die Einrichtung des Custom Skill abgeschlossen. Auf der Folgeseite lässt sich der Skill dann testen. In der Alexa App sollte der Skill nun auch sichtbar sein. Er musshier noch aktiviert werden und die Kontoverknüpfung eingerichtet werden, was selbsterklärend ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AWS Lambda Funktion anlegen ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-01-site.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-02-login.png|200px]]&lt;br /&gt;
# Den Punkt &#039;&#039;Lambda&#039;&#039; links auf der Startseite auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-03-lambda.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Get Started Now&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]&lt;br /&gt;
# Den Blueprint &#039;&#039;Blank function&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]&lt;br /&gt;
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Smart Home&#039;&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]&amp;lt;br /&amp;gt;&#039;&#039;Achtung! Es ist möglich, dass ihr hier &#039;&#039;&#039;Alexa Smart Home&#039;&#039;&#039; überhaupt nicht auswählen könnt. Dann solltet ihr ganz rechts oben in der Ecke mal schauen, welche Region bzw. welches Land ausgewählt ist. Ich empfehle hier &#039;&#039;&#039;Ireland&#039;&#039;&#039; auszuwählen. Dann erscheint bei den Funktionen auch &#039;&#039;&#039;Alexa Smart Home&#039;&#039;&#039;.&#039;&#039;&lt;br /&gt;
# Bei &#039;&#039;Application Id&#039;&#039; den Wert eintragen, dessen Ermittlung unter &#039;&#039;&#039;Skill Kit einrichten&#039;&#039;&#039; in der zusätzlichen Beschreibung beschrieben wird, den Haken bei &#039;&#039;Enable trigger&#039;&#039; setzen und mit &#039;&#039;Next&#039;&#039; bestätigen &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]&lt;br /&gt;
# Auf der Konfigurationsseite bei &#039;&#039;Name&#039;&#039; den Wert FHEM eingeben, bei &#039;&#039;Runtime&#039;&#039; Node.js 4.3. Bei &#039;&#039;Role&#039;&#039; den Wert &#039;&#039;Choose an existing role&#039;&#039; wählen (wenn es noch keine existing role gibt: zuerst Create a custom role -&amp;gt; in dem Popup dann lambda_basic_execution und auf Allow)  und bei &#039;&#039;Existing role&#039;&#039; dann &#039;&#039;x&#039;&#039; wählen. Der Quellcode der Datei lambda.js aus dem Quellpaket wird dann an die Stelle des großen Textfeldes vollständig eingefügt. Dann noch den Hostname im Quellcode an den eigenen anpassen. Anschließend alles mit &#039;&#039;Next&#039;&#039; bestätigen.&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-07-configure_function.png|200px]]&lt;br /&gt;
# Auf der Übersichtsseite dann &#039;&#039;Create function&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-08-review.png|200px]]&lt;br /&gt;
# Klicke dann auf der Übersichtsseite oben links auf &#039;&#039;Function&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-09-go_overview.png|200px]]&lt;br /&gt;
# Wähle dann die angelegte Funktion aus und klicke dann im Menü &#039;&#039;Action&#039;&#039; auf den Punkt &#039;&#039;Show ARN&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]&lt;br /&gt;
# Es wird nun eine ARN Adresse angezeigt, die für den Punkt 6 bei &#039;&#039;&#039;Skill Kit einrichten&#039;&#039;&#039; benötigt wird&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-2-arn.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skill einrichten ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden&lt;br /&gt;
# Auf &#039;&#039;Skills&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Oben rechts &#039;&#039;Meine Skills&#039;&#039;  auswählen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]&lt;br /&gt;
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]&lt;br /&gt;
# Oben Rechts in den Details des Skills auf &#039;&#039;Skill aktivieren&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]&lt;br /&gt;
# In dem neu geöffneten Fenster die Authorisierung bestätigen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]&lt;br /&gt;
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein &amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-06-success.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Geräteeinrichtung ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden&lt;br /&gt;
# Auf &#039;&#039;Smart Home&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Geräte suchen&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-07-Gerätesuche.png|200px]]&lt;br /&gt;
# Wurde soweit alles korrekt eingerichtet, werden nun die gefundenen Geräte angezeigt.&lt;br /&gt;
&lt;br /&gt;
Tip: Es macht Sinn, unter &#039;&#039;Meine Gruppen&#039;&#039; Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. &amp;quot;Licht&amp;quot;) haben.&lt;br /&gt;
&lt;br /&gt;
== Nutzung ==&lt;br /&gt;
=== Sprachkommandos ===&lt;br /&gt;
Nach erfolgreicher Einrichtung sollte Alexa mit den folgenden Befehlen nutzbar sein:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/raum&amp;gt; ein”&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/raum&amp;gt; aus”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/raum&amp;gt; auf &amp;lt;wert&amp;gt; prozent”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/raum&amp;gt; auf &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/raum&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/raum&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/raum&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/raum&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Optimierung ===&lt;br /&gt;
Normalerweise wird von Alexa-Fhem der Wert im Feld &#039;&#039;NAME&#039;&#039; verwendet, mit dem ein Gerät angesprochen werden kann via Alexa. Ist ein anderer &amp;quot;Rufname&amp;quot; gewünscht, kann das Feld &#039;&#039;Alias&#039;&#039; gesetzt werden. Der hier gesetzte Wert wird dann als alternativer Name verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
&lt;br /&gt;
====Allgemeiner Hinweis====&lt;br /&gt;
Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein &#039;&#039;http://&#039;&#039; davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
const PORT=3000;&lt;br /&gt;
const HOST=&#039;mein.host.name&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Freigabe von Port 3000====&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von &amp;lt;b&amp;gt;UnityMedia&amp;lt;/b&amp;gt; z.B. funktionieren derzeit leider nicht. Eine möglicher &amp;quot;Workaround&amp;quot; wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276}}&lt;br /&gt;
&lt;br /&gt;
Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können.&lt;br /&gt;
Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.&lt;br /&gt;
&lt;br /&gt;
Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde. &lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter &#039;&#039;Internet -&amp;gt; Freigaben -&amp;gt; Portfreigaben&#039;&#039; statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: &#039;&#039;https://mein.hostname:3000&#039;&#039;. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.&lt;br /&gt;
&lt;br /&gt;
Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.&lt;br /&gt;
&lt;br /&gt;
====Probleme mit node.js - npm install====&lt;br /&gt;
&lt;br /&gt;
Falls eine Fehlermeldung auftritt, dass &amp;quot;npm&amp;quot; nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: [http://www.fhemwiki.de/wiki/Homebridge_einrichten#NodeJS_installieren NodeJS installieren] sowie [http://www.fhemwiki.de/wiki/Homebridge_einrichten#Python.2C_g.2B.2B.2C_MDNS_installieren Python, g++, MDNS installieren], siehe auch folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
====Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich====&lt;br /&gt;
Wenn man auf der Konsole angemeldet ist, den Befehl&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/source&amp;gt;eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter http://www.fhemwiki.de/wiki/Homebridge_einrichten#NodeJS_installieren nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter http://www.fhemwiki.de/wiki/Alexa-Fhem#Voraussetzungen erfüllt sind! Keine Experimente mit Versionen die darunter liegen.&lt;br /&gt;
&lt;br /&gt;
====Fehlermeldung &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039; Fehler angezeigt beim Start von alexa-fhem====&lt;br /&gt;
Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039;, lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
====Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder====&lt;br /&gt;
Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder. &lt;br /&gt;
&lt;br /&gt;
Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; die folgenden Zeilen rauslöschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;nat-pmp&amp;quot;: &amp;quot;10.0.1.1&amp;quot;,&lt;br /&gt;
        &amp;quot;nat-upnp&amp;quot;: true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn alexa-fhem keine Geräte findet?====&lt;br /&gt;
Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut &#039;&#039;genericDeviceType switch&#039;&#039; hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut &#039;&#039;alias&#039;&#039; eine besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann.&lt;br /&gt;
Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?====&lt;br /&gt;
Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:&lt;br /&gt;
* wenn nichts bei alexa-fhem ankommt: port forwarding prüfen&lt;br /&gt;
* wenn lambda.js nichts los wird: im cloudwatch log nachsehen&lt;br /&gt;
* wenn bei lambda.js nichts ankommt: den trigger prüfen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst sollte man sich unter &#039;&#039;http://aws.amazon.com&#039;&#039; das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger.&lt;br /&gt;
Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf &#039;&#039;Triggers&#039;&#039; klicken und mit &#039;&#039;Add trigger&#039;&#039; erneut einen anlegen. Hier muss, wie in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 7, die &#039;&#039;Application Id&#039;&#039; stehen und der Haken bei &#039;&#039;Enable trigger&#039;&#039; gesetzt sein. Dann alexa-fhem neu starten.&lt;br /&gt;
Wenn ihr Änderugen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&lt;br /&gt;
Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei &#039;&#039;alexa&#039;&#039; muss ausführbar sein. Also z.B. so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
die Datei ausführbar machen. Sofern der User &amp;quot;pi&amp;quot; Eigentümer ist, ist kein sudo erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=15953</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=15953"/>
		<updated>2016-08-03T07:05:15Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: letzten Satz gestrichen, da nicht mehr aktuell&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Unterstützung für CUL-Klon auf Arduino-Basis&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[SIGNALduino]] unterstützt den gleichnamigen Low-Cost Empfänger für digitale Signale, ähnlich einem [[CUL]]. Der SIGNALduino (Hardware) basiert auf einem Arduino. Hauptsächlich wurde er für den [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] entwickelt. Es stehen jedoch auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 Mhz. Wer einen Mikrocontroller mit 8 Mhz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Er wird derzeit über den USB Port angeschlossen. Die Schaltung entspricht der des [[FHEMduino]]. &lt;br /&gt;
&lt;br /&gt;
# Das Modul ist nicht fertig und kann als frühes Release bezeichnet werden.&lt;br /&gt;
# Das Modul gibt bei Bedarf sehr viele Meldungen ins Logfile, in den Normaleinstellungen verhält es sich aber relativ ruhig.&lt;br /&gt;
&lt;br /&gt;
== Was macht dieser SIGNALduino? ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|SIGNAL(FHEM)duino Schaltplan]]  &lt;br /&gt;
Digitale Signale anhand von Mustern erkennen und zum Auswerten an FHEM weitergeben, dort können die Daten dann dekodiert werden.&lt;br /&gt;
Zwischenzeitlich gibt der Arduino alle erkannten Signale an FHEM weiter, dies hilft um vor allem Signale zu finden, die noch nicht bekannt sind.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Arduino mit 433 Mhz Empfänger an einen Fhem Server anschließen und IT Steckdosen empfangen / schalten&lt;br /&gt;
&lt;br /&gt;
Das System ist jedoch nicht auf 433 Mhz beschränkt. Es funktioniert auch mit anderen Frequenzen oder Medien, z.B. auch mit Infrarot oder direkt angebunden via Draht.&lt;br /&gt;
&lt;br /&gt;
== Worin liegt der Vorteil zu einem CUL oder FHEMduino? ==&lt;br /&gt;
Erst mal gibt es noch keinen richtigen Vorteil. Der ergibt sich erst, wenn man in FHEM die Signaldaten entsprechend verarbeitet. Für einige wenige Dinge ist das bereits implementiert, z.B. lassen sich Wettersensoren oder Funksteckdosen damit empfangen.&lt;br /&gt;
Wer Lust hat weitere  Protokolle zu dekodieren, braucht dazu nur ein passendes FHEM Modul entwickeln. Änderungen am Arduino Code sind &amp;quot;eigentlich&amp;quot; nicht notwendig, dadurch skaliert das System gut.&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeit: wer einen Wettersensor dekodieren möchte, muss ja erst mal feststellen, was der Sensor sendet. Dazu kann man den SIGNALduino auch an den Sendeausgang des Sensors anbinden und empfängt die digitalen Signale. Bitte achtet aber auf die passenden Spannungen, bevor ihr eine solche Schaltung vornehmt. Ein Arduino Nano verträgt 5V.&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit eine Unterstützung für den Betrieb mit Fhem. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen wenn der SIGNALduino mal läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochon eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhel HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|FA21RF||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Wie muss der Arduino verkabelt werden?&lt;br /&gt;
Die Verkabelung ist Identisch zum [[FHEMduino]]&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann auch geladen werden. Dazu folgende Befehle in Fhem ausführen:&lt;br /&gt;
&lt;br /&gt;
1. FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
2. SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r32/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen. Im Log File seht ihr, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
&lt;br /&gt;
Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB Anschlusses muss natürlich an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define sduino SIGNALduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der SIGNALduino Firmware ==&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem ist der SIGNALduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware Dateien wechseln.&lt;br /&gt;
 &lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde).&lt;br /&gt;
&lt;br /&gt;
== Daten aus dem Logfile erklärt ==&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird:&lt;br /&gt;
&lt;br /&gt;
Unknown Code, so oder ähnlich bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul existiert, welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MS - Nachricht mit Sync Puls: Es wurde eine Signal empfangen. P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. 15 Bedeutet es wurde ein Signalpegel (1) 395 Mikrosekundenhigh und Anschließend (5) 8916 Mikrosekunden low gemessen. CP=1 ist die Referenz auf den Takt des Signales. Getaktet wird in diesem Fall mit ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MC - Nachricht vom Typ Manchester: Manchester Kodierte Signale, können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht.&lt;br /&gt;
Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist.&lt;br /&gt;
Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mein Gerät wird in FHEM nicht erkannt ==&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ==&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend Notwendig um seine Anforderungen zu erfüllen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Schalter bzw. Sensoren die nur zwei Zustände kennen geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich etwas Senden ==&lt;br /&gt;
Der SIGNALduino kann etwas senden, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert.&lt;br /&gt;
Genannt &amp;quot;raw senden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um in der FHEM Kommandozeile etwas zu senden muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
&lt;br /&gt;
== Es erscheinen viele Logmeldungen für Geräte die ich nicht habe ==&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele dieser Logmeldungen können durch Setzen des &#039;&#039;verbose&#039;&#039; Levels auf den Wert &#039;&#039;3&#039;&#039; unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Dennoch kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;whitelistIDs&#039;&#039; erlaubt es, anzugeben, welche Protokolle vom FHEM Modul berücksichtigt werden. Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=38831|LinkText=Forumsdiskussion zur Weiterentwicklung}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=15737</id>
		<title>FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=15737"/>
		<updated>2016-06-28T07:17:07Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Switch: Data-state zu Data-States geändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Oberfläche für Fhem&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=34233&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=n.a.&lt;br /&gt;
|ModOwner=setstate ({{Link2FU|7023|Forum}})&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:tablet_ui.png|200px|thumb|right|Fhem Tablet UI]]&lt;br /&gt;
FHEM Tablet UI ist ein leichtgewichtiges aber funktionsreiches Framework zum Steuern und Überwachen von in Fhem integrierten Geräten. Zahlreiche Widgets können sehr flexibel und leicht per HTML Code konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird die Installation und Konfiguration des FHEM Tablet UI beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Todo|alle Widgets hier übernehmen, Übersetzung, weitere Beispiele aus dem Forum einfügen (evtl. mit Link!?)}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das User Interface hat sehr wenige Anforderungen für den Betrieb. Es benötigt &amp;lt;u&amp;gt;keine&amp;lt;/u&amp;gt; zusätzliche Frameworks, wie z.B. PHP oder MySQL.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen ist eine Fhem Installation mit HTTPSRV Modul. Das UI kann mit den gängigen Browsern Betriebssystem unabhängig genutzt werden oder mit dem Webviewcontrol.&lt;br /&gt;
Das Interface wird dabei in dem FHEM eigenen Webserver ausgeführt. Mit wenigen Anpassungen ist es auch möglich das UI auf anderen Webservern (Apache, u.a.) zu betreiben, dann kann FHEM und UI auch auf getrennten Systemen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;define TABLETUI HTTPSRV ftui/ ./www/tablet Tablet-UI&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Verzeichnis ./fhem/www/tablet die Datei index-example.html in index.html umbenennen oder eine neue index.html erzeugen und diese index.html wie nachfolgend beschrieben editieren.&lt;br /&gt;
&lt;br /&gt;
Das UI ist über den Link &amp;quot;Tablet-UI&amp;quot; auf der Fhem-Hauptseite oder durch Direktaufruf der URL &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;Fhem-url&amp;gt;:8083/fhem/tablet/index.html&amp;lt;/nowiki&amp;gt;&amp;quot; zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Hinweise zu einer manuellen Installation und weitere Infos sind auf der Projektseite https://github.com/knowthelist/fhem-tablet-ui zu finden.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update des UI durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
kann seit dem 24.12.2015 die URL zum normalen Updatebefehl von FHEM hinzugefügt werden. Mit einen &amp;quot;update check&amp;quot; sieht man dann  gleich alle Updates aus beiden &amp;quot;Welten&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Weitere Widgets ==&lt;br /&gt;
&lt;br /&gt;
=== Widgets for Fhem-tablet-ui ===&lt;br /&gt;
Zusätzlich zu den bei der Installation des Tablet UI direkt zur Verfügung stehenden Widgets, gibt es eine weitere Widget-Quelle von nesges unter https://github.com/nesges/Widgets-for-fhem-tablet-ui. Die Widgets aus dieser Quelle müssen für eine Nutzung separat installiert werden.&lt;br /&gt;
&lt;br /&gt;
Dazu folgenden Befehl in die Fhem-Befehlszeile eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/controls_widgets-for-fhem-tablet-ui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Näheres zur Installation unter [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/Installation Wiki: Installation]. &lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der einzelnen Widgets befindet sich ebenfalls [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki im Github-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&#039;&#039;&#039;META-Parameter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Tablet UI lässt sich über die META-Parameter konfigurieren. Mit den meisten META-Parametern kann das verhalten des UI beeinflusst werden. Diese Parameter befinden sich in der jeweiligen &#039;&#039;&#039;.html&#039;&#039;&#039; Datei (z.B. index.html) im Abschnitt &#039;&#039;&#039;&amp;lt;head&amp;gt;&#039;&#039;&#039;. Nachfolgend sind die verschiedenen Konfigurationsparameter aufgeführt. Die Parameter sind immer gleich aufgebaut.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;&amp;lt;META-Parameter&amp;gt;&amp;quot; content=&amp;quot;&amp;lt;Wert&amp;gt;&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! META-Parameter                                !! Wert / Beispiel                       !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
| longpoll                     || 1 oder 0 || Refresh sofort, alle 15 Minuten ein voller Refresh (shortpoll) statt alle 30 Sekunden ein voller Refresh.&lt;br /&gt;
|-&lt;br /&gt;
| gridster_disable             || 1 oder 0 || Drag&amp;amp;Drop der Gridster-Elemente auf der Seite deaktivieren.&lt;br /&gt;
|-&lt;br /&gt;
| toast                        || 1 oder 0 || Toast messages deaktivieren&lt;br /&gt;
|-&lt;br /&gt;
| fhemweb_url       || http://meinFhemServer:8083/fhem || Wird benötigt wenn der Webserver des TabletUI nicht auf dem FHEM Server läuft.&lt;br /&gt;
|-&lt;br /&gt;
| widget_margin                      || 1 bis 9999 || Abstände der Gridsterelemente verändern.&lt;br /&gt;
|-&lt;br /&gt;
| widget_base_width                      || 1 bis 9999 || Größe des Basis-Rasters (data-sizey=1/data-sizex=1) verändern.&lt;br /&gt;
|-&lt;br /&gt;
| widget_base_height                      || 1 bis 9999 || Größe des Basis-Rasters (data-sizey=1/data-sizex=1) verändern.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CSS-Styles&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Layout und das Aussehen des UI kann durch diverse vorgegebene CSS-Klassen beeinflusst werden. Die verfügbaren Klassen sind im Abschnitt [[#CSS Class description|CSS Class description]] oder [[#Positioning|Positioning]] aufgeführt. Es besteht auch die Möglichkeit eine eigene CSS Datei zu erstellen und darüber Änderungen am aussehen des UI vorzunehmen. Die eigenen CSS Datei würde bei einem Update unverändert bleiben. Daher ist abzuraten ein CSS Datei die mit dem UI Update verteilt wird zu modifizieren. Die eigene CSS Datei ist unter &#039;&#039;&#039;/fhem/tablet/css&#039;&#039;&#039; mit dem Namen &#039;&#039;&#039;fhem-tablet-ui-user.css&#039;&#039;&#039; zu finden. Sollte diese nicht vorhanden sein kann die Datei manuell erstellt werden.&lt;br /&gt;
Wird keine eigene CSS-Datei verwendet empfiehlt es sich den folgenden Eintrag im &amp;lt;head&amp;gt; der jeweiligen .html Datei zu entfernen, bzw. in Kommentar gesetzt werden um Probleme beim Laden der Seite zu verhindern.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/css/fhem-tablet-ui-user.css&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Farbe ==&lt;br /&gt;
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form oder als RGB-Wert anzugeben. Zum Beispiel: Hex: #A3CFA3 RBG: rgb(163, 207, 163).&lt;br /&gt;
&lt;br /&gt;
Knallige Farben wie #ff0000 für Rot oder #00ff00 für Grün sollten vermieden werden. Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.&lt;br /&gt;
&lt;br /&gt;
Hilfreich bei der Suche nach den Farbwerten ist der color picker: http://www.w3schools.com/tags/ref_colorpicker.asp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CSS Class description ==&lt;br /&gt;
&lt;br /&gt;
Not all widgets support all classes&lt;br /&gt;
&lt;br /&gt;
* readonly : changing of state is not allowed&lt;br /&gt;
* wider : 25px extra space for the widget to the top&lt;br /&gt;
* narrow : shorter distant to the widget above&lt;br /&gt;
* w1x, w2x, w3x : set the widget to a fix width: 1x, 2x, 3x width&lt;br /&gt;
* mini : lowest diameter for volume widget&lt;br /&gt;
* small : font 80% size (label), small diameter for volume widget&lt;br /&gt;
* medium : font 120% size&lt;br /&gt;
* large : font 150% size&lt;br /&gt;
* big : font 200% size&lt;br /&gt;
* bigplus : font 270% size&lt;br /&gt;
* bigger : font 320% size&lt;br /&gt;
* bigger.thin : font 450% size&lt;br /&gt;
* grande : font 600% size&lt;br /&gt;
* gigantic: font 144px size + 120px line-height&lt;br /&gt;
* thin : font thin&lt;br /&gt;
* darker : forecolor in gray&lt;br /&gt;
* hue-tick : draw ticks in color range&lt;br /&gt;
* hue-front : draw handle in color range&lt;br /&gt;
* hue-back : draw background in color range&lt;br /&gt;
* dim-tick : draw ticks in brightness range&lt;br /&gt;
* dim-front : draw handle in brightness range&lt;br /&gt;
* dim-back : draw background in brightness range&lt;br /&gt;
* red : foreground color red&lt;br /&gt;
* green : foreground color green&lt;br /&gt;
* blue : foreground color blue&lt;br /&gt;
* doublebox-v : container to place 2 small widgets (e.g. switch) one above the other&lt;br /&gt;
* doublebox-h : container to place 2 small widgets (e.g. switch) side by side&lt;br /&gt;
* timestamp : deliver the date time for the reading instead the value&lt;br /&gt;
* inline : positioning elements in a row, no line break&lt;br /&gt;
* top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
* left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
* right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
* blink : blink animatation for label or symbol widget&lt;br /&gt;
* verticalLine : Vertikale Line am rechten Rand&lt;br /&gt;
&lt;br /&gt;
== Positioning ==&lt;br /&gt;
&lt;br /&gt;
*container : new box or new row&lt;br /&gt;
*col-x-y : new column with x/y of width (col-1-3,col-2-3,col-1-2,col-1-4,col-1-8,col-1-5,col-2-5,col-3-5,col-4-5)&lt;br /&gt;
*inline : positioning elements in a row, no line break&lt;br /&gt;
*top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
*left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
*right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
*top-narrow : -15px closer on top (top-narrow-2x -&amp;gt; -30px; top-narrow-10 -&amp;gt; -10px)&lt;br /&gt;
*centered : horizontal centered&lt;br /&gt;
*left-align : align text left&lt;br /&gt;
*left : floating left&lt;br /&gt;
*right-align : align text right&lt;br /&gt;
*right : floating right&lt;br /&gt;
*wider : 15px extra space for the widget all around&lt;br /&gt;
*narrow : shorter distant to the widget above&lt;br /&gt;
*fullsize : 100% in width and height&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Teilweise dokumentierte Widgets:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/button button]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen Fhem-Befehl absetzen kann.&lt;br /&gt;
* [[#chart|chart]]: chart with similar capabilities as the FHEM plots &lt;br /&gt;
* checkbox:&lt;br /&gt;
* [[#circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des &#039;circle&#039; im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clicksound clicksound]: Mit dem Widget &amp;quot;clicksound&amp;quot; können Sounds an Click-Events von Elementen gebunden werden. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clock clock]: Das Widget &amp;quot;clock&amp;quot; stellt eine einfach Uhr zur verfügung.&lt;br /&gt;
* colorwheel:&lt;br /&gt;
* daytimepicker:&lt;br /&gt;
* departure:&lt;br /&gt;
* [[#dimmer|dimmer]]: toogle button with a setter for on value&lt;br /&gt;
* eventmonitor:&lt;br /&gt;
* highchart:&lt;br /&gt;
* [[#homestatus|homestatus]]: selector for 4 states (1=home, 2=night, 3=away, 4=holiday)&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/iframe iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe. &lt;br /&gt;
* [[#image|image]]: insert an image, the URL is given by a reading&lt;br /&gt;
* input:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/klimatrend klimatrend]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt. &lt;br /&gt;
* Knob:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.&lt;br /&gt;
* [[#label|label]]: STATE als Text anzeigen&lt;br /&gt;
* [[#level|level]]: vertical/horizontal bar to show values between min/max value&lt;br /&gt;
* link:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/multistatebutton multistatebutton]: Variante des push-Widgets das den set-Befehl abhängig vom gelesenen Status ändert.&lt;br /&gt;
* [[#pagetab|pagetab]]: Element to smoothly exchange the whole page with another page&lt;br /&gt;
* pagebutton:&lt;br /&gt;
* [[#playstream|playstream]]: Abspielen eines Webradio-Streams per Button&lt;br /&gt;
* [[#popup|popup]]: a popup dialog which open on click on another widget &lt;br /&gt;
* [[#progress|progress]]: round symbolic display for percent values&lt;br /&gt;
* [[#push|push]]: send any command to Fhem e.g. up / down&lt;br /&gt;
* range:&lt;br /&gt;
* readingsgroup:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads&lt;br /&gt;
* [[#rotor|rotor]]: Umschalten von zwei oder mehr Widgets an einer Position&lt;br /&gt;
* [[#select|select]]: Combobox to provide a list for selection&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: zum anzeigen und einstellen einer Uhrzeit.&lt;br /&gt;
* [[#simplechart|simplechart]]: simple XY line chart for one value (reads directly from Fhem log file) &lt;br /&gt;
* [[#slider|slider]]: vertical slider to select between min/max value&lt;br /&gt;
* spinner:&lt;br /&gt;
* swiper:&lt;br /&gt;
* [[#switch|switch]]: Toggle any command to Fhem (e.g. on / off)&lt;br /&gt;
* [[#symbol|symbol]]: State als Symbol darstellen (z.B. Fenster offen)&lt;br /&gt;
* [[#thermostat|thermostat]]: dial for heater thermostates to set desired value and show current value&lt;br /&gt;
* [[#volume|volume]]: dial to set a single value (e.g. 0-60)&lt;br /&gt;
* [[#weather|weather]]: insert an icon or image, represending a weather literal&lt;br /&gt;
* [https://github.com/svenson08/ftui-weekdaytimer-widget weekdaytimer]: Visualisierung des [[WeekdayTimer]] Modul&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/wind_direction wind_direction]: Zeigt die Windrichtung auf einer Windrose an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Demo der Widgets findet ihr [http://knowthelist.github.io/fhem/tablet/demo_widgets.html Hier].&lt;br /&gt;
----------------------------------&lt;br /&gt;
&lt;br /&gt;
Für alle Widgets gilt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+allgemeine Attribute&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-type&lt;br /&gt;
|Widget-Typ&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-device&lt;br /&gt;
|Fhem-Name des Gerätes (mit dem Befehl &#039;list&#039; bekommt man im Fhem die kpl. Liste)&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|CSS-Klassen für Aussehen und Formatierung des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Daten Empfangen&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Reading Name&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert für den Status on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert für den Status off&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Daten Senden&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|Reading Name&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert für den Status on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert für den Status off&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;chart&amp;quot;&amp;gt;&#039;&#039;&#039;CHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung) or array of names if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log) or or array of names if more than one graph shall be displayed&lt;br /&gt;
|&#039;-&#039; or omitting this data means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;) or or array of columnspecs if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-style&lt;br /&gt;
|name of the graph style to be used (e.g. &#039;SVGplot l0&#039; or &#039;ftui l0dash&#039;) or or array of styles if more than one graph shall be displayed using different stlyes. The standard fhem plot styles can be used furthermore there are some more predefined styles existing (details see css file). Own styles can be specified e.g. in the fhem-table-ui-user.css file.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ptype&lt;br /&gt;
|name of the plot type (e.g. &#039;lines&#039; or &#039;fa-cog&#039;) or or array of plottypes if more than one graph shall be displayed. All fhem plot styles are supported. Additionally it is possible to specify symbols (currently supported are font awesome (&#039;fa-...&#039;), open automation (&#039;oa-...&#039;) and fhem symbols (&#039;fs-...&#039;))&lt;br /&gt;
|&#039;lines&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-uaxis&lt;br /&gt;
|name of the axis to be used (&#039;primary&#039; or &#039;secondary&#039;) or or array of axis&#039; to be used if more than one graph shall be displayed. The &#039;primary&#039; axis is labelled on the left side, the &#039;secondary&#039; axis is labelled on the right side&lt;br /&gt;
|&#039;primary&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-legend&lt;br /&gt;
|caption of the graph (used in the legend and at the cursor) or an array of legend texts if more than one graph shall be displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue_sec&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue_sec&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines (related to primary axis). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically.&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick lines (in minutes). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_start&lt;br /&gt;
|number of days back from now for the start of the plot (0 means the plot starts from today 0:00). Additionally the x-axis start value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;. If the setting ends with &#039;w&#039;, &#039;W&#039;, &#039;m&#039;, &#039;M&#039;, &#039;y&#039;, &#039;Y&#039; the nuber given is interpreted as week, month or year respectively (capital letters mean rounding to full weeks, months years) (e.g. &#039;2Y&#039; means that, if current date is 3.6.2015, the graph will start 1.1.2013).&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_end&lt;br /&gt;
|number of days back from now for the end of the plot (-1 means the plot ends today 24:00). Additionally the x-axis end value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;. If the setting ends with &#039;w&#039;, &#039;W&#039;, &#039;m&#039;, &#039;M&#039;, &#039;y&#039;, &#039;Y&#039; the nuber given is interpreted as week, month or year respectively (capital letters mean rounding to full weeks, months years) (e.g. &#039;2Y&#039; means that, if current date is 3.6.2015, the graph will end 31.12.2013).&lt;br /&gt;
|-1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-timeformat&lt;br /&gt;
|setting for the formatting of the x-tick text. The format can be configured in a quite flexible way. Several format classifiers are supported which are separated by special characters (&#039;-&#039;, &#039;.&#039;, &#039;/&#039;, &#039; &#039;, &#039;:&#039;, &#039;,&#039;, &#039;\&#039;). All characters despite &#039;\&#039; will be displayed in the final output.&lt;br /&gt;
The following is a list of supported classifiers:&lt;br /&gt;
* &#039;LF&#039;enters a linefeed&lt;br /&gt;
* &#039;mm&#039;  - displays minutes as 2 digits&lt;br /&gt;
* &#039;hh&#039;  - displays hours as 2 digits&lt;br /&gt;
* &#039;dd&#039;  - displays day of the month as 2 digits&lt;br /&gt;
* &#039;MM&#039;  - displays months as 2 digits (e.g. 02 for February)&lt;br /&gt;
* &#039;MMM&#039; - displays months as 3 characters (e.g. Dec for December)&lt;br /&gt;
* &#039;MMMM&#039; - displays monhts as full names (e.g. March)&lt;br /&gt;
* &#039;ee&#039;   - displays weekdays as 2 digits (e.g. 00 for Sunday)&lt;br /&gt;
* &#039;eee&#039;  - displays weekdays as 3 characters (e.g. Mon for Monday)&lt;br /&gt;
* &#039;eeee&#039; - displays weekdays as full names (e.g. Tuesday)&lt;br /&gt;
* &#039;yy&#039;   - displays years as 2 digits (e.g. 16 as 2016)&lt;br /&gt;
* &#039;yyyy&#039; - displays years as 4 digits&lt;br /&gt;
For example a string given as &#039;MMM\LF\yyyy&#039; will display &#039;Jan&#039; in one line and &#039;2016&#039; in a second one. A string given as &#039;MM.dd 2016&#039; will display &#039;03.05 2016&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-nofulldays&lt;br /&gt;
|switch to activate/deactivate rounding of the xaxis start and end values to full days (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext&lt;br /&gt;
|text to be shown besides the primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext_sec&lt;br /&gt;
|text to be shown besides the secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks for primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-crosshair&lt;br /&gt;
|switch to activate/deactivate the crosshair cursor (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cursorgroup&lt;br /&gt;
|number to define coupling of the crosshair cursor. The cursors of all charts having the same number are coupled and move together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-scrollgroup&lt;br /&gt;
|number to define coupling of the scrolling (shift and zoom). All charts having the same number are scrolled (shifted and zoomed) together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-showlegend&lt;br /&gt;
|switch to activate/deactivate the initial display of the legend window (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-legendpos&lt;br /&gt;
|array of two values (horizontal and vertical) to set the initial position of the legend window. Allowed values are &amp;quot;left&amp;quot;, &amp;quot;right&amp;quot; or a number giving the position in percent for the first parameter (horizontal position) and &#039;top&#039;, &#039;bottom&#039; or a number giving the position in percent for the second parameter (vertical position). &lt;br /&gt;
|&#039;[&amp;quot;top&amp;quot;,&amp;quot;right&amp;quot;]&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit_sec&lt;br /&gt;
|unit of the value to show beside of each Y ticks for secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixed size for width (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixed size for height (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-graphsshown&lt;br /&gt;
|boolean to define if graphs are activated (shown) initially or an array of booleans if more than one graph shall be displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ddd&lt;br /&gt;
|setting for 3D display. Array with 3 angles for rotation of the 3D chart in x, y, z (z not yet supported) (e.g. &#039;[&amp;quot;40&amp;quot;,&amp;quot;60&amp;quot;,&amp;quot;0&amp;quot;]&#039;). If the array is existing, there will be 2 additional buttons on top for changing rotation in x and y.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-dddspace&lt;br /&gt;
|setting for the space between different graphs in y direction if 3D is activated (space given in pixels).&lt;br /&gt;
|15&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-dddwidth&lt;br /&gt;
|setting for the width of the graphs if 3D is activated (width given in pixels).&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks, nobuttons, small, normal, big&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; can be omitted in this case the default value &amp;quot;-&amp;quot; will be used. This means that the current logfile is going to be used.&lt;br /&gt;
&lt;br /&gt;
There are several buttons that control the dynamic behaviour of the chart. The &amp;lt;-, -&amp;gt;, + and - buttons shift and zoom the displayed data. The &amp;quot;legend&amp;quot; and &amp;quot;cursor&amp;quot; buttons are switching on and off the display of the legend window and the crosshair cursor respectively. If 3D display is activated (see above) 2 more buttons control the rotation in x and y.&lt;br /&gt;
&lt;br /&gt;
When the legend window is displayed, a click on the legend text shows/hides the respective graph. The legend window can be dragged to other positions on desktop browsers (currently not yet working for iOS and Android).&lt;br /&gt;
&lt;br /&gt;
The crosshair cursor currently only works dynamically on desktop browsers. On iOS and Android you have to tap on the screen to set the cursor to a new position.&lt;br /&gt;
&lt;br /&gt;
Three classes define default values for the texts (small, normal, big). Additionally there is a number of css styles that control the visible appearance of the chart. The following classes are supported:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!CSS class name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
!.chart-background&lt;br /&gt;
|Color etc. for the chart background&lt;br /&gt;
|-&lt;br /&gt;
!.text.axes&lt;br /&gt;
|Font and color for the chart axes&lt;br /&gt;
|-&lt;br /&gt;
!.buttons&lt;br /&gt;
|Size and color for the buttons (shift etc.)&lt;br /&gt;
|-&lt;br /&gt;
!.gridlines&lt;br /&gt;
|Size and color for gridlines generally&lt;br /&gt;
|-&lt;br /&gt;
!.xaxis&lt;br /&gt;
|Font, size and color for xaxis&lt;br /&gt;
|-&lt;br /&gt;
!.yaxis&lt;br /&gt;
|Font, size and color for yaxis&lt;br /&gt;
|-&lt;br /&gt;
!.xticks&lt;br /&gt;
|Font, size and color for xticks&lt;br /&gt;
|-&lt;br /&gt;
!.yticks&lt;br /&gt;
|Font, size and color for yticks&lt;br /&gt;
|-&lt;br /&gt;
!.crosshair&lt;br /&gt;
|Font, size and color (foreground/background) for the crosshair cursor&lt;br /&gt;
|-&lt;br /&gt;
!.caption&lt;br /&gt;
|Font, size and color for text buttons for legend and cursor switching&lt;br /&gt;
|-&lt;br /&gt;
!.legend&lt;br /&gt;
|Font, size and background color for legend window&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_chart|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;CIRCLEMENU&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-item-diameter&lt;br /&gt;
|diameter of the circle&lt;br /&gt;
|52&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-circle-radius&lt;br /&gt;
|radius of each item, in pixel&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-direction&lt;br /&gt;
|position of the items in relation to the center&lt;br /&gt;
|&#039;full&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-close-after&lt;br /&gt;
|closing time of the circle-menu&lt;br /&gt;
|(item-count + 1s) or a minimum of 4s&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|keepopen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Optionen für data-direction: top | right | bottom | left | top-right | top-left | bottom-right | bottom-left | top-half | right-half | bottom-half | left-half | full | vertical | horizontal&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_circlemenu|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;DIMMER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|(&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value for ON status to set&lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|value for OFF status to set&lt;br /&gt;
|value of data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-dim&lt;br /&gt;
|name of the reading responsible for dim (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|fa-lightbulb-o&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_dimmer|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;HOMESTATUS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|array of states using for get&lt;br /&gt;
|[&#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039;]&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|array of states using for set.&lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|array of fix names to show only in the UI as an alias to the real states&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the data-get-on array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-version&lt;br /&gt;
|name of the status model e.g. &#039;residents&#039;,&#039;roommate&#039;,&#039;guest&#039; &lt;br /&gt;
|(default NULL)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default version has 4 states: &#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039; The default aliases are &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;; data-version=&#039;residents&#039; or &#039;roommate&#039; or &#039;guest&#039; has 5 states (&#039;home&#039;,&#039;asleep&#039;,&#039;absent&#039;,&#039;gone&#039;,&#039;gotosleep&#039;) They have these aliases &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;,&#039;Retire&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_homestatus|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;image&amp;quot;&amp;gt;&#039;&#039;&#039;IMAGE&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get an URL from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-size&lt;br /&gt;
|width of the image in px or %, the height scales proportionally&lt;br /&gt;
|50%&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the image to show (use data-url or data-device + data-get, not both)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-refresh&lt;br /&gt;
|Interval in seconds for image refresh for usage together with data-url&lt;br /&gt;
|900&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_image|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widget LABEL ===&lt;br /&gt;
&amp;lt;div id=&amp;quot;label&amp;quot;&amp;gt;&#039;&#039;&#039;LABEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem LABEL Widget kann der STATUS eines Device in Textform angezeigt werden. Dabei kann das die Farbe des Anzeigetext abhängig von dessen Wert festgelegt werden. &lt;br /&gt;
&lt;br /&gt;
Neben den &#039;&#039;&#039;allgemeine Attribute&#039;&#039;&#039; besitzt das LABEL-Widget die nachfolgenden Attribute.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get           &lt;br /&gt;
|Name des Readings in FHEM &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fix           &lt;br /&gt;
|Eine bestimmte Anzahl an Dezimalstellen &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; non-numeric &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-part          &lt;br /&gt;
|split position of the space separated value to show or an RegEx &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-color         &lt;br /&gt;
| fix color attribute or DEVICE:READING for dynamic setting of label color &lt;br /&gt;
| &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors        &lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-get    &lt;br /&gt;
|name of the DEVICE:Reading to colorize the label  &lt;br /&gt;
|data-device:data-get &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits        &lt;br /&gt;
|an array of numeric values to affect the colour of the Label &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-part   &lt;br /&gt;
|part number of the space separated value to show or a RegEx &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; all &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-unit          &lt;br /&gt;
|add a unit after a numeric value. use encoded strings e.g. &amp;quot;%B0C%0A&amp;quot; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-substitution  &lt;br /&gt;
|regex-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-hide          &lt;br /&gt;
|string to compare with current value. hide element when it&#039;s value equals data-hide &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-hideparents   &lt;br /&gt;
|jquery selector to hide element&#039;s parents too &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class              &lt;br /&gt;
|small, large, big, bigger, thin, red, green, blue, darker, timestamp, w1x, w2x, w3x, fixedlabel, icon, bg-limit &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit der Class &#039;fixedlabel&#039; kann man Label einbauen, die einen festen Text (direkt im HTML) haben, aber trotzdem die Farbe per Reading Value beeinflusst werden könnte.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;icon&#039; kann man Label einbauen, die wie Icons aussehen. Als Hintergrund gibt es &#039;icon round&#039; (rund), &#039;icon square&#039; (Rechteck mit abgerundeten Ecken) und &#039;icon squareborder&#039; (Rechteck mit abgerundeten Ecken und einem zusätzlichen Rand).&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;bg-limit&#039; wird der Hintergrund des Icon auf grün oder rot gesetzt, passend zum on/off Status des data-limits.&lt;br /&gt;
Use data-color OR data-colors + data-limits, not both.&lt;br /&gt;
&lt;br /&gt;
With class=&amp;quot;bg-limit&amp;quot; it changes the background color not the forecolor according data-limits&lt;br /&gt;
&lt;br /&gt;
class=&amp;quot;icon square&amp;quot; or class=&amp;quot;icon round&amp;quot; forces the label to a fix width and height in icon style&lt;br /&gt;
&lt;br /&gt;
Special layout can be achieved by overwriting of following classes in the fhem-tablet-ui-user.css:&lt;br /&gt;
&lt;br /&gt;
.label-precomma .label-comma .label-aftercomma .label-unit&lt;br /&gt;
&lt;br /&gt;
e.g.: .label-aftercomma{ font-size:40%; left: 4px; top: -25px; position: relative; }&lt;br /&gt;
&lt;br /&gt;
Functions for data-substitution:&lt;br /&gt;
&lt;br /&gt;
Array of replacements&lt;br /&gt;
RegEx-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected&lt;br /&gt;
data-substitution=&amp;quot;weekdayshort&amp;quot;&lt;br /&gt;
JS functions data-substitution=&amp;quot;toDate().ddmm()&amp;quot; - convert to day:month&lt;br /&gt;
data-substitution=&amp;quot;toDate().hhmm()&amp;quot; - convert to hour:minutes&lt;br /&gt;
&lt;br /&gt;
data-substitution=&amp;quot;toDate().hhmmss()&amp;quot; - convert to hour:minutes:secondes&lt;br /&gt;
&lt;br /&gt;
data-substitution=&amp;quot;toDate().eeee()&amp;quot; - convert to name of the week day&lt;br /&gt;
&lt;br /&gt;
data-substitution=&amp;quot;toDate().ago()&amp;quot; - convert to time span&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_label|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widget LEVEL ===&lt;br /&gt;
&amp;lt;div id=&amp;quot;level&amp;quot;&amp;gt;&#039;&#039;&#039;LEVEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|&#039;0&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|&#039;100&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-part&lt;br /&gt;
|part number of the space separated value to show or an RegEx&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|a array of numeric or RegEx values to affect the colour of the label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|mini, horizontal&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_level|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;PAGETAB&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the new page to show&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&#039;fa-power-off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|color of OFF state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|color of Off state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|array of status to assign a special icon-list from data-icons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the a data-get-on array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|warn, activate (as additionals for data-icons)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_pagetab|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;playstream&amp;quot;&amp;gt;&#039;&#039;&#039;PLAYSTREAM&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL des Radio-Streams&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the control state from FHEM&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for PLAY status to get. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for STOP status to get. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-volume&lt;br /&gt;
|name of the reading to get the volume value (0-100) &lt;br /&gt;
|volume&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_playstream|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;popup&amp;quot;&amp;gt;&#039;&#039;&#039;POPUP&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading where to get the alert value from&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value which trigger to open the dialog&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value which trigger to close the dialog &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_popup|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;progress&amp;quot;&amp;gt;&#039;&#039;&#039;PROGRESS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set or name of the reading which helds the max value&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|novalue, percent&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_progress|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;push&amp;quot;&amp;gt;&#039;&#039;&#039;PUSH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
| name of the reading to set on FHEM (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value to send when the the button get pressed oder ein Array zwischen dessen Werten umgeschaltet werden kann&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-doubleclick&lt;br /&gt;
|timeout to wait for a second click or touch. &#039;0&#039; disables the doubleclick feature. &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-countdown&lt;br /&gt;
|secondes for the countdown progress control &lt;br /&gt;
|autodetect from &#039;on-for-timer&#039; command&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|fix color attribute for OFF state or DEVICE:READING for dynamic setting &lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|fix color attribute for Off state or DEVICE:READING for dynamic setting&lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;data-set-on&#039; can also be an array of values to toggle between this values&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_push|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;rotor&amp;quot;&amp;gt;&#039;&#039;&#039;ROTOR&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; | data-delay&lt;br /&gt;
|time in millisecondes to wait until next list item get shown&lt;br /&gt;
|3500&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fade, rotate&lt;br /&gt;
|&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Ohne Angabe von class erfolgt keine Animation.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_rotor|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;select&amp;quot;&amp;gt;&#039;&#039;&#039;SELECT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading that get the selected item of the list&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|name of the reading to set on Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-list&lt;br /&gt;
|name of the reading to get a :-separated list from Fhem&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-items&lt;br /&gt;
|an array of fix items to show in the selection box (alternative if data-list is empty)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|an array of fix names to show only in the selection box as an alias to the real items&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command to send to Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-quote&lt;br /&gt;
|characters to enclose the send value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|wider, w1x, w2x, w3x, large, big&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_select|Link zu einem Beispiel]]&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;simplechart&amp;quot;&amp;gt;&#039;&#039;&#039;SIMPLECHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log)&lt;br /&gt;
|&#039;-&#039; means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY &lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY &lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick line (in Minuten)&lt;br /&gt;
|360 minutes&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago&lt;br /&gt;
|number of days back from now &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-caption&lt;br /&gt;
|name of the chart to show as text &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_simplechart|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; kann man auch weglassen, dann greift der Defaultwert &amp;quot;-&amp;quot;. Damit wird das neuste Logfile gelesen.&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;slider&amp;quot;&amp;gt;&#039;&#039;&#039;SLIDER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-step&lt;br /&gt;
|step value&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-value&lt;br /&gt;
|RegEx to retrieve the value or part number of the space separated input to get the value&lt;br /&gt;
|&#039;-1&#039;: all of the input&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-value&lt;br /&gt;
|Format of the value to send to FHEM&lt;br /&gt;
|&#039;$v&#039;: the value only&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|width for horizontal sliders&lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|height for vertical sliders &lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-color&lt;br /&gt;
|color for quantity range&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-color&lt;br /&gt;
|color for range bar&lt;br /&gt;
|#404040&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|Aussehen/Ausrichtung&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für class steht mini, horizontal und negated (0 liegt oben) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_slider|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;switch&amp;quot;&amp;gt;&#039;&#039;&#039;SWITCH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|Kommando Name (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) &amp;lt;br /&amp;gt;(z.B setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-doubleclick&lt;br /&gt;
|timeout to wait for x millisecondes click or touch. &#039;0&#039; disables the doubleclick feature.&lt;br /&gt;
|&#039;0&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Einstellung bei zwei Werten&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert, bei dem zum Status ON geschaltet werden soll. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert, bei dem zum Status OFF geschaltet werden soll. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf ON geschaltet wurde  &lt;br /&gt;
|Wert von data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf OFF geschaltet wurde &lt;br /&gt;
|Wert von data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des Font-Awesome Icon. &lt;br /&gt;
|&#039;fa-lightbulb-o&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Name des Font-Awesome Hintergrund Icon. &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|Hintergrundfarbe beim Status on oder DEVICE:Reading bei dynamischen Einstellungen&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|Hintergrundfarbe beim Status off oder DEVICE:Reading bei dynamischen Einstellungen&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Widget Farbe beim Status ON &lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Widget Farbe beim Status OFF &lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Einstellung bei mehreren Werten&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-states&lt;br /&gt;
|Array mit Status Angaben &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-state&lt;br /&gt;
|Array mit Status Angaben, die gesetzt werden sollen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|Array Icons zum zuvor definierten Status&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-backgroundicons&lt;br /&gt;
|Array mit Hintergrund Icons zum zuvor definierten Status &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|Array mit Farben zum zuvor definierten Status &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-colors&lt;br /&gt;
|Array mit Hintergrund Farben zum zuvor definierten Status &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class : readonly&lt;br /&gt;
|Es wird nur der Status angezeigt und kann nicht geändert werden&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-get-on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;data-get-off&amp;lt;/code&amp;gt; accept also RegEx values. e.g. data-get-on=&amp;quot;[0-9]{1,3}|on&amp;quot; means set switch on if STATE is a numeric value or &#039;on&#039;. data-get-off=&amp;quot;!on&amp;quot; means accept all but the data-get-on value (negation)&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_switch|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widget SYMBOL ===&lt;br /&gt;
&amp;lt;div id=&amp;quot;symbol&amp;quot;&amp;gt;&#039;&#039;&#039;SYMBOL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem SYMBOL Widget kann der STATUS eines Device dargestellt werden. Dabei kann das angezeigte Symbol und dessen Farbe bestimmt werden. Wie bei anderen Widgets kann das Symbol und die Farbe vom State abhängig konfiguriert werden. Das SYMBOL-Widget dient nur zur Anzeige eines STATUS, es besitzt kein Möglichkeit der Interaktion.&lt;br /&gt;
&lt;br /&gt;
Neben den &#039;&#039;&#039;allgemeine Attribute&#039;&#039;&#039; besitzt das SYMBOL-Widget die nachfolgenden Attribute.&lt;br /&gt;
&lt;br /&gt;
dual state notation&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! HTML Attribut !! Beschreibung !! Default Wert&lt;br /&gt;
|-&lt;br /&gt;
| data-get || Name des Reading, was gelesen werden soll || &#039;STATE&#039; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Einstellung bei zwei Werten&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut !! Beschreibung !! Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get-on&#039;&#039;&#039; ||Wert für on ||&#039;open&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get-off&#039;&#039;&#039; ||Wert für off ||&#039;closed&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-icon&#039;&#039;&#039; ||Name des Symbols  ||&#039;ftui-window&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-background-icon&#039;&#039;&#039; ||Hintergrundsymbol ||&#039;&#039;&#039;leer&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-on-background-color&#039;&#039;&#039; ||Farbe für ON-Zustand. ||&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-off-background-color&#039;&#039;&#039; ||Farbe für OFF-Zustand. ||&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-on-color&#039;&#039;&#039; ||Farbe für ON-Zustand. ||&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-off-color&#039;&#039;&#039; ||Farbe für OFF-Zustand. ||&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Einstellung bei mehreren Werten&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-states&lt;br /&gt;
|Array für states. &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|Array mit Farben zu data-states aArray&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-colors&lt;br /&gt;
|Array mit Hintergrundfarben zu data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
data-get-on,data-get-off and data-states accept also RegEx values. The value for one icon can also contain an additional animatation CSS name, e.g. &amp;quot;fa-exclamation-triangle fa-blink&amp;quot; for a blinking Symbol&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_symbol|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widget THERMOSTAT===&lt;br /&gt;
&amp;lt;div id=&amp;quot;thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;THERMOSTAT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-temp&lt;br /&gt;
|reading for measured temperature of thermostates&lt;br /&gt;
|&#039;measured-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-valve&lt;br /&gt;
|reading for valve position of thermostates&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minColor&lt;br /&gt;
|Farbe des Keises für Min&lt;br /&gt;
| #4477FF&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxColor&lt;br /&gt;
|Farbe des Kreises für Max, zwischen Min und Max wird linear interpoliert &lt;br /&gt;
| #FF0000&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-step&lt;br /&gt;
|step size for value adjustment e.g. 0.5 &lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-bgColor&lt;br /&gt;
|Die Farbe der Kreises zwischen den ticks&lt;br /&gt;
|&#039;transparent&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fgColor&lt;br /&gt;
|Die Farbe der zahl im Kreismittelpunkt&lt;br /&gt;
|#bbbbbb&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-tkColor&lt;br /&gt;
|Die Farbe der ticks&lt;br /&gt;
|#696969&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleOffset&lt;br /&gt;
|Start der ticks im Kreis (in Winkelgraden, 0 = oben)&lt;br /&gt;
| -120&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleArc&lt;br /&gt;
|Bereich der ticks im Kreis (in Winkelgraden)&lt;br /&gt;
|240&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|big, readonly&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_thermostat|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;volume&amp;quot;&amp;gt;&#039;&#039;&#039;VOLUME&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem &lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;rigth&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-value&lt;br /&gt;
|RegEx to retrieve the value or part number of the space separated input to get the value&lt;br /&gt;
|&#039;-1&#039;: all of the input&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-value&lt;br /&gt;
|Format of the value to send to FHEM&lt;br /&gt;
|&#039;$v&#039;: the value only&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-tickstep&lt;br /&gt;
|distance between ticks&lt;br /&gt;
|4|20&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-unit&lt;br /&gt;
|add a unit after the desired value.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|mini, small, big, bigger, hue-tick, hue-front, hue-back, dim-tick ,dim-front, dim-back, readonly&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_volume|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;weather&amp;quot;&amp;gt;&#039;&#039;&#039;WEATHER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the weather literal from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-imageset&lt;br /&gt;
|collection of images to display current weather situation. Possible values: &#039;meteocons&#039;, &#039;kleinklima&#039;&lt;br /&gt;
|&#039;meteocons&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-image-path&lt;br /&gt;
|path to the images of the selected imageset&lt;br /&gt;
|/images/weather/&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_weather|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Beispiele ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_chart&amp;quot;&amp;gt;&#039;&#039;&#039;Chart&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display a chart with similar capabilities as the FHEM plots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div    data-type=&amp;quot;chart&amp;quot;&lt;br /&gt;
	data-logdevice=&#039;[&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Predicted&amp;quot;]&#039;&lt;br /&gt;
	data-columnspec=&#039;[&amp;quot;4:Garden.T:15:&amp;quot;,&amp;quot;10:Garden.T:0:delta-h&amp;quot;,&amp;quot;10:Garden.T:0:delta-d&amp;quot;,&amp;quot;4:predicted.*:15:&amp;quot;]&#039;&lt;br /&gt;
	data-style=&#039;[&amp;quot;ftui l0fill&amp;quot;,&amp;quot;ftui l1fill&amp;quot;,&amp;quot;ftui l2&amp;quot;,&amp;quot;ftui l3dot&amp;quot;]&#039;&lt;br /&gt;
	data-ptype=&#039;[&amp;quot;lines&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;cubic&amp;quot;]&#039;&lt;br /&gt;
	data-uaxis=&#039;[&amp;quot;primary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;primary&amp;quot;]&#039;&lt;br /&gt;
	data-legend=&#039;[&amp;quot;Temperature&amp;quot;,&amp;quot;Rain/hour&amp;quot;,&amp;quot;Rain/day&amp;quot;,&amp;quot;Predicted Temp.&amp;quot;]&#039;&lt;br /&gt;
	data-yunit=&amp;quot;°C&amp;quot;&lt;br /&gt;
	data-ytext=&amp;quot;Temperature&amp;quot;&lt;br /&gt;
	data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-yunit_sec=&amp;quot;mm&amp;quot;&lt;br /&gt;
	data-ytext_sec=&amp;quot;Rain (mm)&amp;quot;&lt;br /&gt;
	data-height=&amp;quot;250&amp;quot;&lt;br /&gt;
	data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
	data-daysago_start=&amp;quot;2013-08-13T00:00:00&amp;quot;&lt;br /&gt;
	data-daysago_end=&amp;quot;2013-08-14T00:00:00&amp;quot;&lt;br /&gt;
	data-cursorgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-scrollgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-xticks=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:chart_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;Circlemenu&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cover a lot of other button behind one single button&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;circlemenu&amp;quot; class=&amp;quot;cell circlemenu&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-icon=&amp;quot;fa-wrench&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -6&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-6&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -2&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level 0&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;0&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +3&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +9&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +C&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;12&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Woofer&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:circlemenu_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;Dimmer&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget Beispiel für Philips Hue&lt;br /&gt;
&lt;br /&gt;
Minimalvariante&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;!off&amp;quot; data-get-off=&amp;quot;off&amp;quot;&lt;br /&gt;
        data-set=&amp;quot;pct&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Anzeige der Dimstufe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
       data-get=&amp;quot;onoff&amp;quot;&lt;br /&gt;
       data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
       data-set=&amp;quot;&amp;quot;&lt;br /&gt;
       data-set-on=&amp;quot;on&amp;quot; data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
       data-dim=&amp;quot;pct&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget für MilightDevice&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot;&lt;br /&gt;
  data-device=&amp;quot;SonstWas&amp;quot;&lt;br /&gt;
  data-get=&amp;quot;brightness&amp;quot;&lt;br /&gt;
  data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-get-on=&amp;quot;[1-9][0-9]*&amp;quot;&lt;br /&gt;
  data-set-on=&amp;quot;on&amp;quot;&lt;br /&gt;
  data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
  data-dim=&amp;quot;dim&amp;quot;&lt;br /&gt;
  data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-max=&amp;quot;100&amp;quot;&lt;br /&gt;
&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;Homestatus&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel rechts im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
       data-get-on=&#039;[&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;]&#039;&lt;br /&gt;
       data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;]&#039;&lt;br /&gt;
       data-icons=&#039;[&amp;quot;fa-home&amp;quot;,&amp;quot;fa-bed&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-suitcase&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel links im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-get-on=&#039;[&amp;quot;home&amp;quot;,&amp;quot;asleep&amp;quot;,&amp;quot;absent&amp;quot;,&amp;quot;gone&amp;quot;,&amp;quot;gotosleep&amp;quot;]&#039;&lt;br /&gt;
        data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;,&amp;quot;Retire&amp;quot;]&#039;&lt;br /&gt;
        data-icons=&#039;[&amp;quot;fa-fire&amp;quot;,&amp;quot;fa-film&amp;quot;,&amp;quot;fa-plus&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-tint&amp;quot;]&#039;&lt;br /&gt;
        data-version=&#039;residents&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:homestatus_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_image&amp;quot;&amp;gt;&#039;&#039;&#039;Image&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erzeugt ein Widget mit einem Bild aus dem www, das alle 5 Sekunden aktualisiert wird (hier eine Wetterkarte vom DWD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot;&lt;br /&gt;
     data-size=&amp;quot;80%&amp;quot;&lt;br /&gt;
     data-url=&amp;quot;http://www.dwd.de/wundk/wetter/de/Deutschland.jpg&amp;quot;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:image_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for how to add an image to the dashboard which its URL is delivered by a Fhem module like PROPLANTA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot; data-device=&amp;quot;Wetter1&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDayIcon&amp;quot; &lt;br /&gt;
     data-size=&amp;quot;40px&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_label&amp;quot;&amp;gt;&#039;&#039;&#039;Label&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
STATE   T: 20.0 H: 61&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;2&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; data-part=&amp;quot;4&amp;quot; &lt;br /&gt;
     data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But the same result can reached by getting single readings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
humidity    58&lt;br /&gt;
temperature 20.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;temperature&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;humidity&amp;quot; data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to influence the color of the label according to value limits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;OutTemp&amp;quot; &lt;br /&gt;
     data-limits=&#039;[-73,10,23]&#039; &lt;br /&gt;
     data-colors=&#039;[&amp;quot;#6699FF&amp;quot;,&amp;quot;#AA6900&amp;quot;,&amp;quot;#FF0000&amp;quot;]&#039; &lt;br /&gt;
     data-unit=&amp;quot;%B0C%0A&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a widget for shutter via push: show state and set up/down&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;wzRollo&amp;quot; &lt;br /&gt;
     data-get-on=&amp;quot;up&amp;quot; &lt;br /&gt;
     data-get-off=&amp;quot;down&amp;quot; &lt;br /&gt;
     data-icon=&amp;quot;fa-bars&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;Rollo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a label for a time value in short format with usage of RegEx.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;(\d\d\.\d\d\.).*&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to show two labels in one line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunrise&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;bis&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunset&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des UV-Indexes und der Abhängigkeit der anzuzeigenden Farbe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc0_uv&amp;quot;&lt;br /&gt;
        data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot; &lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc0_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc1_uv&amp;quot;&lt;br /&gt;
	data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot;&lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc1_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:label_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des Labels als Icon.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon round bg-red cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon square bg-blue cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon squareborder cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;PowerAV_Sw&amp;quot; data-colors=&#039;[&amp;quot;red&amp;quot;,&amp;quot;green&amp;quot;]&#039; data-limits=&#039;[&amp;quot;off&amp;quot;,&amp;quot;on&amp;quot;]&#039; class=&amp;quot;icon round bg-limit cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Label_tabletUI_icon.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;Pagetab&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tab menu to switch smoothly between multiple pages. Multiple pagetabs in a template file: menu.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt;MENU&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index.html&amp;quot;  data-icon=&amp;quot;fa-home&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_2.html&amp;quot; data-icon=&amp;quot;fa-sliders&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_3.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_4.html&amp;quot; data-icon=&amp;quot;fa-hotel&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_5.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_6.html&amp;quot; data-icon=&amp;quot;fa-database&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_7.html&amp;quot; data-icon=&amp;quot;fa-fax&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_playstream&amp;quot;&amp;gt;&#039;&#039;&#039;Playstream&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt einen Knopf zum direkten Abspielen eines Webradio-Streams.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;playstream&amp;quot; data-url=&amp;quot;http://radioeins.de/stream&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Radio eins&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_push&amp;quot;&amp;gt;&#039;&#039;&#039;Push&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a push button widget to trigger all devices on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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=&amp;quot;on&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei horizontale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei quadratische vertikale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_rotor&amp;quot;&amp;gt;&#039;&#039;&#039;Rotor&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a rotor widget, which switches between to days of weather forecast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;rotor&amp;quot; class=&amp;quot;fade&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Heute&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Morgen&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_select&amp;quot;&amp;gt;&#039;&#039;&#039;Select&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt zwei Comboboxen zur Auswahl des Eingang eines 2-Zonen-AV-Receivers. Die Liste für Zone2 ist fest, die Liste für Zone1 wird von Fhem übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell wider&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline wider&amp;quot;&amp;gt;Zone2&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiverZ2&amp;quot; data-items=&#039;[&amp;quot;Airplay&amp;quot;,&amp;quot;Webradio&amp;quot;,&amp;quot;BD/DVD&amp;quot;,&amp;quot;PHONO&amp;quot;]&#039; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;Zone1&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-list=&amp;quot;inputs&amp;quot; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:select_tabeltUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_slider&amp;quot;&amp;gt;&#039;&#039;&#039;Slider&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slider mit einstellbaren Werten von 10 bis 90:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot; &lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;10&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;90&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Light1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Horizontal angeordneter Slider:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;0&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;100&amp;quot; &lt;br /&gt;
     class=&amp;quot;horizontal&amp;quot; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_switch&amp;quot;&amp;gt;&#039;&#039;&#039;Switch&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schalter. Usage of RegEx pattern for state request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; class=&amp;quot;cell&amp;quot; &lt;br /&gt;
            data-device=&amp;quot;MILIGHT_Zone1_Wohnzimmer&amp;quot; &lt;br /&gt;
            data-get-on=&amp;quot;on.*&amp;quot;&lt;br /&gt;
            data-get-off=&amp;quot;off&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine Gruppe von Schaltern, um zwischen vier verschiedenen Werten eines device umzuschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell left&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert1).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert1&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert1&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert2).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert2&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert2&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert3).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert3&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert3&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert4).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert4&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert4&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_symbol&amp;quot;&amp;gt;&#039;&#039;&#039;Symbol&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;wert1&amp;quot;,&amp;quot;wert2&amp;quot;,&amp;quot;wert3&amp;quot;]&#039; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-arrow-up&amp;quot;,&amp;quot;fa-user&amp;quot;,&amp;quot;fa-arrow-down&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;SeaGreen&amp;quot;,&amp;quot;SlateBlue&amp;quot;,&amp;quot;IndianRed&amp;quot;]&#039; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon with blink and spin animation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-exclamation-triangle fa-blink&amp;quot;,&amp;quot;fa-exclamation-circle&amp;quot;,&amp;quot;fa-cog fa-spin&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;Crimson&amp;quot;,&amp;quot;GoldenRod&amp;quot;,&amp;quot;SeaGreen&amp;quot;]&#039; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;Wert1&amp;quot;,&amp;quot;Wert2&amp;quot;,&amp;quot;Wert3&amp;quot;]&#039; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with RegEx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
     data-icons=&#039;[&amp;quot;oa-measure_battery_100&amp;quot;,&amp;quot;oa-measure_battery_75&amp;quot;,&amp;quot;oa-measure_battery_50&amp;quot;,&amp;quot;oa-measure_battery_25&amp;quot;,&amp;quot;oa-measure_battery_0&amp;quot;]&#039;&lt;br /&gt;
     data-get-on=&#039;[&amp;quot;3\\.[0-9]&amp;quot;,&amp;quot;2\\.[789]&amp;quot;,&amp;quot;2\\.[456]&amp;quot;,&amp;quot;2\\.[123]&amp;quot;,&amp;quot;((2\\.0)|([01]\\.[0-9]))&amp;quot;]&#039;&lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with greater-equal compare and 90° rotated symbols&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
    data-icons=&#039;[&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_25 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_50 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_75 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;]&#039;&lt;br /&gt;
    data-get-on=&#039;[&amp;quot;0&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;2.4&amp;quot;,&amp;quot;2.7&amp;quot;,&amp;quot;3.0&amp;quot;]&#039;&lt;br /&gt;
    data-on-colors=&#039;[&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;Thermostat&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure as data-device=&#039;...&#039; that item which delivers temp and desired-temp as reading.&lt;br /&gt;
&lt;br /&gt;
Default parameters are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data-get=&amp;quot;desired-temp&amp;quot; data-temp=&amp;quot;measured-temp&amp;quot; data-set=&amp;quot;desired-temp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefor for HomaMatic HM-CC-RT-DN this is sufficient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&#039;KH_Clima&#039; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The long format looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;KH_Clima&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;desired-temp&amp;quot; &lt;br /&gt;
     data-temp=&amp;quot;measured-temp&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for MAX!:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&amp;quot;HZ_Tuer&amp;quot; &lt;br /&gt;
    data-valve=&amp;quot;valveposition&amp;quot; &lt;br /&gt;
    data-get=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    data-temp=&amp;quot;temperature&amp;quot; &lt;br /&gt;
    data-set=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The wigets will show the valve value only in case of a valid data-valve attribute. The default for data-valve ist null. That means, a empty data-valve attribute hides the valve label for the widget.&lt;br /&gt;
&lt;br /&gt;
[[Datei:thermostat.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_weather&amp;quot;&amp;gt;&#039;&#039;&#039;Weather&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Widget fügt ein dem Wetter entsprechendes Bild ein. Die Daten können durch Fhem-Module wie [[PROPLANTA]], [[OPENWEATHER]] und [[Weather]] bereitgestellt werden. &lt;br /&gt;
Add &#039;big&#039; or &#039;bigger&#039; to CSS class to get a bigger weather icon.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;weather&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;Weather&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDay&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:weather.png]]&lt;br /&gt;
&lt;br /&gt;
== Icon-Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* Eingebaute Icons: Diese haben das ftui-Präfix. Zurzeit sind folgende verfügbar: ftui-window, ftui-door&lt;br /&gt;
&lt;br /&gt;
* Mehr als 500 Icons von &amp;quot;http://fortawesome.github.io/Font-Awesome/icons&amp;quot; verfügbar. Einfach den Icon-Namen angeben (Präfix &amp;quot;fa-&amp;quot; nicht vergessen, Z.B. &amp;lt;code&amp;gt;data-icon=&amp;quot;fa-volume-up&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Es stehen auch Openautomation Font-Files zur Verfügung. Wer sie nutzen möchte, muss folgende Stylesheets in die index.html hinzufügen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/openautomation.css&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/fhemSVG.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese font icons haben das Präfix &#039;fs-&#039; bzw. &#039;oa-&#039;.&lt;br /&gt;
&lt;br /&gt;
Beispiel bei einem Schalter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&#039;dummy1&#039; data-icon=&amp;quot;oa-secur_locked&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und so als großes Symbol:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-icon=&amp;quot;oa-status_frost&amp;quot;&lt;br /&gt;
        data-on-color=&amp;quot;#bb3232&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;on&amp;quot;&lt;br /&gt;
        data-get-off=&amp;quot;!on&amp;quot;&lt;br /&gt;
        class=&amp;quot;bigger&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Icons kann man auch etwas dicker darstellen mit den Zusatz bold: &amp;lt;code&amp;gt;data-icon=&amp;quot;oa-secur_locked bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Namen der verfügbaren Icons findet man auch in den CSS Files (openautomation.css / fhemSVG.css)&lt;br /&gt;
&lt;br /&gt;
== Spezial ==&lt;br /&gt;
Folgender Befehl setzt einen direkten Befehl an Fhem ab (&amp;lt;code&amp;gt;set dummy1 off&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div onclick=&amp;quot;setFhemStatus(&#039;set dummy1 off&#039;)&amp;quot;&amp;gt;All off!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM_Tablet_UI/FAQ|FHEM Tablet UI FAQ]] zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,34233.0.html Forums-Beitrag]&lt;br /&gt;
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,37378.0.html User-Demos]&lt;br /&gt;
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14721</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14721"/>
		<updated>2016-03-18T04:13:51Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Pushover Einbindung angefangen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FHEM Überwachen]] ist ein Art, wie man z.B. auf einem Raspberry Pi seine FHEM installation überwachen kann. Die Überwachung spiegelt sich in diesem Sinne wieder, dass der FHEM Prozess automatisch neu gestartet wird, sobald er sich aufgehängt hat oder nicht mehr meldet. Für diese Überwachung gibt es verschiedene Methoden. Hier wird eine mittels eines [[FileLog]] und des Programms [https://wiki.ubuntuusers.de/Monit Monit] dargestellt.   &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ziel ist es, dass FHEM automatisch neu gestartet wird, sobald es sich aufgehängt hat.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
Zuerst muss das Programm Monit installiert und konfiguriert werden. Wie ihr das macht, steht [https://wiki.ubuntuusers.de/Monit Hier].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration in FHEM ==&lt;br /&gt;
=== Dummy anlegen ===&lt;br /&gt;
Wir legen uns einen Dummy mit dem Namen &amp;quot;Monit_timer&amp;quot; an. Dieser Timer wird später durch ein at immer wieder getriggert und der Dummy triggert daraufhin ein Filelog. Den Dummy legen wir uns wie folgt an:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Monit_timer dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wichtig, der Dummy darf NICHT das Attribut event-on-change-reading oder event-on-update-reading haben!&lt;br /&gt;
&lt;br /&gt;
=== Filelog anlegen ===&lt;br /&gt;
Nun legen wir uns ein FileLog an, in welches später von FHEM immer wieder durch den Dummy eine Lebenzeichen eingetragen wird. Dies machen wir wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;define FileLog_WD_Monit FileLog ./log/Monit_timer.log Monit_timer*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== At anlegen ===&lt;br /&gt;
Jetzt legen wir uns ein at an, welches alle 3 Minuten dem Dummy den Status 1 gibt:&lt;br /&gt;
&amp;lt;pre&amp;gt;Monit_exec at +*00:03:00 set Monit_timer 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notfiy bei Neustart ===&lt;br /&gt;
Nun noch ein Notify anlegen, welches uns den Dummy auf den Wert 2 setzt beim Start von FHEM. Dies würde wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;define FHEM_start notify global:INITIALIZED set Monit_timer 2&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hintergrund ist, dass so das FileLog direkt nach dem Start etwas schreibt und nicht erst nach 3 Minuten. &lt;br /&gt;
&lt;br /&gt;
=== Leeren der des LogFile === &lt;br /&gt;
Zuletzt definieren wir uns noch ein at, welches uns das Logfile jede Nacht, bis auf die letzten beiden Einträge leert. Das Logfile würde sonst unglaublich groß werden und das muss ja nicht sein.&lt;br /&gt;
&amp;lt;pre&amp;gt;define Monit_Log_leeren at *00:01:00 {system (&amp;quot;sudo tail -n 2 /opt/fhem/log/Monit_timer.log &amp;gt; /opt/fhem/log/Monit_timer_Dummy.log&amp;quot;);; system (&amp;quot;sudo cp /opt/fhem/log/Monit_timer_Dummy.log /opt/fhem/log/Monit_timer.log&amp;quot;);; system (&amp;quot;sudo rm /opt/fhem/log/Monit_timer_Dummy.log&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig, FHEM muss den Befehl &amp;quot;sudo&amp;quot; ausführen können. Mehr dazu findet ihr im Forum &lt;br /&gt;
&lt;br /&gt;
== Konfiguration von Monit ==&lt;br /&gt;
Ans Ende der Datei Monitrc, welche normal unter /etc/monit/monitrc zufinden ist, tragen wir folgendes ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
check file fhem with path /opt/fhem/log/Monit_timer.log&lt;br /&gt;
                start program &amp;quot;/etc/init.d/fhem start&amp;quot;&lt;br /&gt;
                stop program &amp;quot;/etc/init.d/fhem stop&amp;quot;&lt;br /&gt;
                if timestamp &amp;gt; 5 minute then restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;set daemon 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dies sollte so gelassen werden, das heißt, dass Monit alle 2 Minuten die Datein checkt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der Ablauf ==&lt;br /&gt;
FHEM schreibt alle 3 Minuten ins Filelog den Status 1. Nach einem Restart den Status 2. &lt;br /&gt;
Monit überwacht alle 2 Minuten, ob das Filelog länger als 5 Minuten nicht bearbeitet wurde, ist dies der Fall wird FHEM neugestartet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Meldung per Pushover ==&lt;br /&gt;
Wir können uns noch eine Mitteilung über Pushover senden lassen. Dies stellen wir wie folgt an:&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14720</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14720"/>
		<updated>2016-03-17T22:52:30Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Änderung zu FHEM Überwachung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FHEM Überwachen]] ist ein Art, wie man z.B. auf einem Raspberry Pi seine FHEM installation überwachen kann. Die Überwachung spiegelt sich in diesem Sinne wieder, dass der FHEM Prozess automatisch neu gestartet wird, sobald er sich aufgehängt hat oder nicht mehr meldet. Für diese Überwachung gibt es verschiedene Methoden. Hier wird eine mittels eines [[FileLog]] und des Programms [https://wiki.ubuntuusers.de/Monit Monit] dargestellt.   &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ziel ist es, dass FHEM automatisch neu gestartet wird, sobald es sich aufgehängt hat.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
Zuerst muss das Programm Monit installiert und konfiguriert werden. Wie ihr das macht, steht [https://wiki.ubuntuusers.de/Monit Hier].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration in FHEM ==&lt;br /&gt;
=== Dummy anlegen ===&lt;br /&gt;
Wir legen uns einen Dummy mit dem Namen &amp;quot;Monit_timer&amp;quot; an. Dieser Timer wird später durch ein at immer wieder getriggert und der Dummy triggert daraufhin ein Filelog. Den Dummy legen wir uns wie folgt an:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Monit_timer dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wichtig, der Dummy darf NICHT das Attribut event-on-change-reading oder event-on-update-reading haben!&lt;br /&gt;
&lt;br /&gt;
=== Filelog anlegen ===&lt;br /&gt;
Nun legen wir uns ein FileLog an, in welches später von FHEM immer wieder durch den Dummy eine Lebenzeichen eingetragen wird. Dies machen wir wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;define FileLog_WD_Monit FileLog ./log/Monit_timer.log Monit_timer*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== At anlegen ===&lt;br /&gt;
Jetzt legen wir uns ein at an, welches alle 3 Minuten dem Dummy den Status 1 gibt:&lt;br /&gt;
&amp;lt;pre&amp;gt;Monit_exec at +*00:03:00 set Monit_timer 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notfiy bei Neustart ===&lt;br /&gt;
Nun noch ein Notify anlegen, welches uns den Dummy auf den Wert 2 setzt beim Start von FHEM. Dies würde wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;define FHEM_start notify global:INITIALIZED set Monit_timer 2&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hintergrund ist, dass so das FileLog direkt nach dem Start etwas schreibt und nicht erst nach 3 Minuten. &lt;br /&gt;
&lt;br /&gt;
=== Leeren der des LogFile === &lt;br /&gt;
Zuletzt definieren wir uns noch ein at, welches uns das Logfile jede Nacht, bis auf die letzten beiden Einträge leert. Das Logfile würde sonst unglaublich groß werden und das muss ja nicht sein.&lt;br /&gt;
&amp;lt;pre&amp;gt;define Monit_Log_leeren at *00:01:00 {system (&amp;quot;sudo tail -n 2 /opt/fhem/log/Monit_timer.log &amp;gt; /opt/fhem/log/Monit_timer_Dummy.log&amp;quot;);; system (&amp;quot;sudo cp /opt/fhem/log/Monit_timer_Dummy.log /opt/fhem/log/Monit_timer.log&amp;quot;);; system (&amp;quot;sudo rm /opt/fhem/log/Monit_timer_Dummy.log&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig, FHEM muss den Befehl &amp;quot;sudo&amp;quot; ausführen können. Mehr dazu findet ihr im Forum &lt;br /&gt;
&lt;br /&gt;
== Konfiguration von Monit ==&lt;br /&gt;
In der Datei Monitrc, welche normal unter /etc/monit/monitrc zufinden ist, tragen wir folgendes ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
check file fhem with path /opt/fhem/log/Monit_timer.log&lt;br /&gt;
                start program &amp;quot;/etc/init.d/fhem start&amp;quot;&lt;br /&gt;
                stop program &amp;quot;/etc/init.d/fhem stop&amp;quot;&lt;br /&gt;
                if timestamp &amp;gt; 5 minute then restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Denon_AV-Receiver&amp;diff=14715</id>
		<title>Denon AV-Receiver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Denon_AV-Receiver&amp;diff=14715"/>
		<updated>2016-03-17T13:29:34Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Update Force hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:DENON_AVR}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung Denon und Marantz AV-Receiver&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=11338&lt;br /&gt;
|ModCmdRef=DENON_AVR&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=71_DENON_AVR.pm&lt;br /&gt;
|ModOwner={{Link2FU|5244|xusader}}&lt;br /&gt;
}}&lt;br /&gt;
== Features / Funktionen ... ==&lt;br /&gt;
&lt;br /&gt;
Für AV-Receiver des Herstellers D&amp;amp;M Holding (Marken Denon und Marantz) gibt es ein Fhem-Modul, welches allerdings aktuell noch nicht offiziell aufgenommen wurde. Es gibt entsprechend auch noch keinen Eintrag in der CommandRef. Dieser Wiki-Eintrag enthält daher das Wichtigste zum Einstieg in die Nutzung.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
&lt;br /&gt;
===Voraussetzungen AVR===&lt;br /&gt;
&lt;br /&gt;
Der zu steuernde AVR sollte so eingestellt sein, dass er auch im Stand-by eine Netzwerkverbindung hat (s. jeweilige Anleitung). Außerdem muss die IP des AVR bekannt sein; hierzu dem AVR entweder direkt oder über den DHCP-Server eine feste IP zuordnen.&lt;br /&gt;
Des Weiteren ist auch der Anschluss von AVRs über die serielle Schnittstelle (z.B. per RS232 auf USB-Kabel) direkt möglich sofern sie das gleich Protokoll sprechen, was aber bei den meisten AVRs der Fall sein dürfte.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
Das Modul von [https://github.com/xusader/fhem-denon/raw/master/FHEM/71_DENON_AVR.pm github] laden, im Modules-Verzeichnis speichern (Rechte beachten!) und durch&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;reload 71_DENON_AVR.pm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in Fhem laden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alternativ mittels des Befehls &lt;br /&gt;
&amp;lt;pre&amp;gt;update force https://raw.githubusercontent.com/xusader/fhem-denon/master/controls_denon.txt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
installieren.&lt;br /&gt;
&lt;br /&gt;
===Einrichten===&lt;br /&gt;
====IP-basiert====&lt;br /&gt;
 &amp;lt;code&amp;gt;define &amp;lt;gewählter_Gerätename&amp;gt; DENON_AVR &amp;lt;IP_des_Gerätes&amp;gt;:&amp;lt;Port_des_Gerätes&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel also:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;define Marantz DENON_AVR 192.168.1.22:23&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Port_des_Gerätes&amp;gt; ist in der Regel die 23, da es sich um eine Telnet-Verbindung handelt&lt;br /&gt;
&lt;br /&gt;
====serielle Verbindung====&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;gewählter_Gerätename&amp;gt; DENON_AVR &amp;lt;serielle_Schnittstelle&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel also:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;define Denon DENON_AVR /dev/ttyUSB0@9600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Readings===&lt;br /&gt;
&lt;br /&gt;
Zur Nutzung in Fhem können die folgenden Readings (Beispiel) ausgewertet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&lt;br /&gt;
     2015-02-06 13:15:05   input           MPLAY &lt;br /&gt;
     2015-02-06 13:15:05   mute            off &lt;br /&gt;
     2015-02-06 13:50:10   power           =2 &lt;br /&gt;
     2015-02-06 13:16:08   sound           STEREO &lt;br /&gt;
     2015-02-06 13:15:04   state           opened &lt;br /&gt;
     2015-02-06 13:16:08   volume          40 &lt;br /&gt;
     2015-02-06 13:16:08   volumeStraight  -40 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;volumeStraight&amp;lt;/code&amp;gt; entspricht dabei der Lautstärkeangabe in dB.&lt;br /&gt;
&lt;br /&gt;
Das Reading &amp;lt;code&amp;gt;power&amp;lt;/code&amp;gt; scheint gerätespezifisch mehr als an oder aus auszugeben. Bei einem Maratz SR7008 z.B. ist &amp;quot;1&amp;quot; aus, &amp;quot;2&amp;quot; an. Davor steht teilweise &amp;quot;=&amp;quot;, teilweise &amp;quot;r:&amp;quot;, bisher ohne erkennbare Systematik. &lt;br /&gt;
&lt;br /&gt;
===Ein-/Ausschalten===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;set &amp;lt;gewählter_Gerätename&amp;gt; [on|off]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stumm an/aus===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;set &amp;lt;gewähler_Gerätename&amp;gt; mute [on|off]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quellenwahl===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;set &amp;lt;gewählter_Gerätename&amp;gt; input &amp;lt;Quelle&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Quelle&amp;gt; hängt dabei vom jeweiligen AVR ab. Eine Übersicht über mögliche Quellen sind z.B. in der am Ende dieses Artikels verlinkten Übersicht über Command-Codes für viele Geräte abrufbar.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel für die Quelle &amp;quot;Media Player&amp;quot; bei Marantz:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;set Marantz input MPLAY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
Beim Neustart von Fhem oder beim Einschalten des Stroms für den AVR ist der Status des Moduls &amp;quot;disconnected&amp;quot;. Das lässt sich nur über die Neuinstallation des Moduls oder über ein &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;modify &amp;lt;gewählter_Gerätename&amp;gt; &amp;lt;IP_des_Gerätes&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
beheben. Läuft der AVR an einer von Fhem ansteuerbaren Steckdose, lässt sich das für das Einschalten des AVR auch automatisieren, z.B.:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;define Poweron notify FS20Schalter:on sleep 75;;modify &amp;lt;gewählter_Gerätename&amp;gt; &amp;lt;IP&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* {{Link2Forum|Topic=11338}} im Fhem-Forum&lt;br /&gt;
* [http://www.denon.de/ Herstellerseite zur Marke Denon]&lt;br /&gt;
* [http://www.marantz.de/ Herstellerseite zur Marke Marantz]&lt;br /&gt;
* [http://www.awe-europe.com/ir_232.html Seite, auf der die Command-Codes für viele Geräte abrufbar sind]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Pushover&amp;diff=14714</id>
		<title>Pushover</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Pushover&amp;diff=14714"/>
		<updated>2016-03-17T12:51:09Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Anpassung der Syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden von sogenannten Push-Nachrichten auf Tablets oder Smartphones&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef=   wird automatisch generiert --&amp;gt;&lt;br /&gt;
|ModTechName=70_Pushover.pm&lt;br /&gt;
|ModOwner=Johannes B&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Pushover]] ist ein Dienst, mit dem es möglich ist, sogenannte Push-Nachrichten auf ein Apple- oder Android-Gerät zu schicken (Link zum Dienst: [https://pushover.net pushover.net]).&lt;br /&gt;
Um die Push-Nachrichten zu empfangen, muss die dazu passende App installiert werden (siehe unten). Der Dienst ist grundlegend kostenlos. Die App-Nutzung ist einmalig zu bezahlen. Es fallen keine Abo-Gebühren an (Stand 08.10.2015).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Es muss zwingend ein Pushover-Account erstellt werden. Anschließend ist auf der Pushover-Website eine Application zu hinterlegen (auf der Pushover-Website zu &#039;&#039;Apps &amp;amp; Plugins&#039;&#039; navigieren, Punkt &#039;&#039;Create a New Application&#039;&#039; wählen).&lt;br /&gt;
Die Application dient dazu, die Nachrichten Fhem zuzuweisen und sie leichter erkennbar zu machen. Für die Application wird von Pushover automatisch ein Token generiert (siehe Abschnitt &#039;&#039;API Token/Key&#039;&#039; auf der Pushover-Website).&lt;br /&gt;
&lt;br /&gt;
Nach Erstellung der Application müssen (nach erfolgter Registrierung auf der Webseite) die einzelnen Geräte, auf denen Nachrichten gesendet werden sollen, registriert werden.&lt;br /&gt;
Die Registrierung der Geräte erfolgt nach dem Anmelden in der App auf dem Endgerät automatisch.&lt;br /&gt;
&lt;br /&gt;
Auf dem Endgerät muss die Pushover-App installiert werden. Dies geschieht z. B. bei Apple-Geräten mit Hilfe des AppStores. Stand 08.10.2015 kostet diese Anwendung nach einer 7-tägigen kostenlosen Probephase 4,99 Euro (In-App-Kauf).&lt;br /&gt;
* Apple-Geräte: [https://itunes.apple.com/de/app/pushover-notifications/id506088175?mt=8 Pushover-App im Apple Store]&lt;br /&gt;
* Android-Geräte: [https://play.google.com/store/apps/details?id=net.superblock.pushover&amp;amp;hl=de Pushover-App im Google Playstore]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig für Debian-Nutzer&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Für das Modul ist noch eine Library notwendig:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install libio-socket-ssl-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbinden des Dienstes in Fhem ==&lt;br /&gt;
Das Modul wird mit dem folgenden Befehl in Fhem definiert:&lt;br /&gt;
:&amp;lt;code&amp;gt;define pushmsg Pushover &amp;lt;TOKEN&amp;gt; &amp;lt;USER&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Token werden der Pushover-Seite entnommen.&amp;lt;br /&amp;gt;&lt;br /&gt;
TOKEN = API Token/Key (zu finden unter der angelegten Application)&amp;lt;br /&amp;gt;&lt;br /&gt;
USER = Your User Key (wird direkt nach dem Einloggen angezeigt)&lt;br /&gt;
&lt;br /&gt;
== Senden einer Nachricht mit Fhem ==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;pre&amp;gt;You can send messages via the following command:&lt;br /&gt;
# set &amp;lt;Pushover_device&amp;gt; msg [&#039;&amp;lt;title&amp;gt;&#039;] &#039;&amp;lt;msg&amp;gt;&#039; [&#039;&amp;lt;device&amp;gt;&#039; &amp;lt;priority&amp;gt; &#039;&amp;lt;sound&amp;gt;&#039; [&amp;lt;retry&amp;gt; &amp;lt;expire&amp;gt; [&#039;&amp;lt;url_title&amp;gt;&#039; &#039;&amp;lt;action&amp;gt;&#039;]]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;fhem(&amp;quot;set pushmsg msg &#039;fhem&#039; &#039;Das Fenster wurde geschlossen!&#039; &#039;&#039; 0 &#039;&#039;&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nachricht, sobald Fhem neu geladen wurde, mit Hilfe einer [[Notify]]-Anweisung:&lt;br /&gt;
&amp;lt;pre&amp;gt;define notify_fhem_reload notify global:INITIALIZED set pushmsg msg &#039;fhem&#039; &#039;Ich wurde neu geladen! - $EVENT&#039; &#039;&#039; 0 &#039;&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erinnerungsfunktion mit Hilfe des Kalendermoduls ==&lt;br /&gt;
Zuerst wird eine Textdatei mit den Daten für die Erinnerung im Fhem-Hauptverzeichnis erzeugt. Hier folgt ein Beispiel für den Fall, dass Fhem auf einer Fritzbox läuft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
telnet fritz.box&lt;br /&gt;
cd /var/media/ftp/fhem/opt/fhem/FHEM/&lt;br /&gt;
vi events.holiday&lt;br /&gt;
&lt;br /&gt;
# ESC-i drücken um in den vi-Editmodus zu gelangen&lt;br /&gt;
&lt;br /&gt;
# Format fur einzelne Tage: 1 MM-DD &amp;lt;Text&amp;gt;&lt;br /&gt;
1 03-23 Schwarze Tonne rausstellen&lt;br /&gt;
1 03-24 Gelbe Tonne rausstellen&lt;br /&gt;
&lt;br /&gt;
# mit ESC:wq die Datei speichern&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Datei:Define_events_holiday.png|mini|400px|rechts|Details des definierten Kalenders]]&lt;br /&gt;
In Fhem muss der Kalender folgendermaßen definiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define events holiday&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das im Bild gezeigte &#039;&#039;Device&#039;&#039; sollte erscheinen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl für die Zeitsteuerung wird mit dem folgenden [[at]] definiert (dieser Befehl muss ohne Zeilenumbrüche in die [[Konfiguration]] übernommen werden, vorzugsweise durch Eingabe in das Befehlsfeld):&lt;br /&gt;
:&amp;lt;code&amp;gt;define CheckEventToday at *20:15:00 {my $Eventname;;my $EventHeute;;$EventHeute=fhem(&amp;quot;get events today&amp;quot;);;print $EventHeute;;if ($EventHeute ne &amp;quot;none&amp;quot;){ $Eventname=&amp;quot;Ereignis: $EventHeute&amp;quot;;;fhem(&amp;quot;set pushmsg msg &#039;fhem&#039; &#039;Erinnerung an: $Eventname&#039; &#039;&#039; 0 &#039;&#039;&amp;quot;);;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Fhem-Commandref [http://fhem.de/commandref_DE.html#Pushover Pushover]&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php/topic,16215.0.html Fhem-Forum]&lt;br /&gt;
* Pushover-API [https://pushover.net/api https://pushover.net/api]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RFHEM&amp;diff=14697</id>
		<title>RFHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RFHEM&amp;diff=14697"/>
		<updated>2016-03-14T23:27:16Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Die Seite wurde neu angelegt: „{{SEITENTITEL:RFHEM}} {{Infobox Modul |ModPurpose=Ausführung von Befehlen auf anderer Instanz |ModType=x |ModForumArea=Automatisierung |ModFTopic=23638 |ModTe…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:RFHEM}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Befehlen auf anderer Instanz&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModFTopic=23638&lt;br /&gt;
|ModTechName=93_RFHEM.pm&lt;br /&gt;
|ModOwner=chris1284 ({{Link2FU|5217|Forum}})&lt;br /&gt;
|Modulname=93_RFHEM.pm&lt;br /&gt;
}}&lt;br /&gt;
[[RFHEM]] ist ein Modul um zwischen verschiedenen FHEM Instanzen Befehle abzusetzen. Das Modul wird nicht supported und ist somit auch nicht offiziell per Update installiert.  &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ziel des Moduls ist es Befehle auf einer anderen Instanz abzusetzen. Verwirklich wird das ganze per Telnet. Das Modul ist angelehnt an [[FHEM2FHEM]]. Der Unterschied ist, dass hier quasi alle Devices, auch die von FHEM2FHEM nicht unterstützten, gesteuert werden können.  &lt;br /&gt;
&lt;br /&gt;
== Herunterladen des Moduls ==&lt;br /&gt;
Das Modul selbst bekommen wir in {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Forums Beitrag. Nochmal, das Modul wird aktuell nicht supported und ist dem entsprechend alt. &lt;br /&gt;
&lt;br /&gt;
Wir laden das Modul in den Ordern ./FHEMInstallation/FHEM/. Bei einem PI wäre das dann /opt/fhem/FHEM. Danach starten wir FHEM neu. &lt;br /&gt;
&lt;br /&gt;
== Definieren des Device ==&lt;br /&gt;
Nun müssen wir uns ein Device anlegen. Dies machen wir klassisch in der Kommandozeile mittels&lt;br /&gt;
&amp;lt;pre&amp;gt;define Name RFHEM hostip [:port] [pw]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte eure zweite Instanz auf der gleichen Hardware laufen, den Port 7073 (Standard ist 7072 bei fhem und auch beim Modul, wenn keiner angegeben wird) und kein Passwort besitzen, wäre die Definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;define FHEM2 RFHEM 127.0.0.1:7073&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Befehle senden ==&lt;br /&gt;
Mittels &lt;br /&gt;
&amp;lt;pre&amp;gt;set &amp;lt;name&amp;gt; cmd &amp;lt;befehl&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
setzt ihr eure Befehle ab, welche in der zweiten Instanz ausgeführt werden. Wollen wir zum Beispiel die Lampe1 anschalten, müssen wir folgendes in die Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd set Lampe1 on&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Log der sendenden Instanz erscheint der Hinweis &amp;quot;command executed&amp;quot; und die zweite Instanz sollte die Lampe1 eingeschaltet haben.&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
=== Einfache Befehle ===&lt;br /&gt;
Einfache Befehle können auf der zweiten Instanz ausgeführt werden. Beispiele:&lt;br /&gt;
&lt;br /&gt;
Dummy schalten:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd setreading Dummy1 Reading1 &#039;Test 1 2 3&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dummy definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd define Dummy1 dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notifys erstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;set RemotePI cmd define b3lampV1 notify btn3 set lamp on&lt;br /&gt;
set RemotePI cmd define b3lampV1 notify btn3 {}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Perlcode ===&lt;br /&gt;
Was nicht funktioniert ist einen Perlcode auf der zweiten Instanz auszuführen. FHEM bezieht den Perlcode auf die erste Instanz. Somit würde zum Beispiel folgender Befehl nicht funktionieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;set RemotePI cmd define a1 at 17:00:00 {fhem(&amp;quot;set xyz on&amp;quot;);}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Instanz, auf welcher der Befehl abgesetzt wurde, würde selbst den Code &amp;quot;{fhem (&amp;quot;set xyz on&amp;quot;);}&amp;quot; ausführen wollen. &lt;br /&gt;
&lt;br /&gt;
=== SSL Auth ===&lt;br /&gt;
SSL Auth ist leider auch nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Nicht funktionierende Befehle ===&lt;br /&gt;
Bisher sind keine Befehle bekannt. Solltet jemand einen oder mehrere finden, so möge er diese bitte {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Thread posten. Vielleicht findet sich ja noch jemand, der den Befehl korrigieren kann. &lt;br /&gt;
&lt;br /&gt;
== Nützliche Hilfen ==&lt;br /&gt;
Typischer Fall, wie dieses Modul genutzt werden kann ist folgender. Man hat auf der gleichen, oder einer anderen, Hardware eine zweite FHEM Instanz. Der Grund mag sein, dass man blockierende Module auslagert (gleiche Hardware) oder Empfangslücken überbrücken möchte (andere Hardware).&lt;br /&gt;
&lt;br /&gt;
Wir nennen unsere Hauptinstanz MASTER und unsere zweite Instanz SLAVE. Auf SLAVE haben wir ein blockierendes Modul installiert, dessen Daten wir aber regelmäßig in MASTER haben möchten. Das Modul heißt TEST-Modul und hat die Readings TEST-Modul-R1 und TEST-Modul-R2. &lt;br /&gt;
&lt;br /&gt;
Wir installieren auf SLAVE das hier beschriebene Modul RFHEM und nennen es &amp;quot;Daten.Senden&amp;quot;. Auf SLAVE muss also regelmäßig, am besten bei einem Update der Readings, die Daten an MASTER gesendet werden. Dies lässt sich am einfachsten mittels eines [[notify]]. MASTER muss jedoch auch die Daten empfangen können. Hierfür bietet sich ein Dummy an. Den Dummy definieren wir auf Master wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Dummy.Empfang dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sendende Notify, wird auf SLAVE wie folgt definiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Daten.Senden.Notify notify Test-Modul.* set Daten.Senden cmd setreading Dummy.Empfang $EVENT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun schreibt der SLAVE bei jedem Update eines Readings in den Dummy des MASTERS die Werte. Auf dem Master können wir diese Veränderung nun auch abgreifen, wie bei jedem normalen Modul. Grafisch würde das ganze so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SLAVE: Readings Update an Test-Modul --&amp;gt; Meldung an Notify --&amp;gt; Meldung an MASTER --&amp;gt; Empfang der Daten im Dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doppelpunkte im Reading beim Dummy ==&lt;br /&gt;
Es kann vorkommen, dass die Readings im Dummy einen Doppelpunkt haben. In unserem Fall würde dann im Dummy &amp;quot;Dummy.Empfang&amp;quot; das Reading eins wie folgt stehen &amp;quot;Test-Modul-R1:&amp;quot;. Doppelpunkte sollte es zum Einen in Readings nicht geben, deswegen gibt es auch einen Hinweis im Log, wenn ihr FHEM startet und dies der Fall ist. Zum Zweiten kann es zu Problemen auf der MASTER Instanz kommen, wenn man zB ein [[DOIF]] auf die Readings des Dummy lauschen lässt. &lt;br /&gt;
&lt;br /&gt;
Aktuell muss man sich bei der Lösung des Problems noch selbst helfen, da es keinen Maintainer des Moduls gibt. Die Lösung hierzu könnte wie folgt aussehen. Wir erstellen uns eine Sub in der MyUtils ([[99_myUtils_anlegen]]) an, welche für uns die Doppelpunkte löscht. Diese Sub könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub anzahl_evtparts($$)&lt;br /&gt;
{&lt;br /&gt;
 my ($EVENT, $Device) = @_;&lt;br /&gt;
 my @eingabe = split(/ /,$EVENT);&lt;br /&gt;
 my $anzahl = scalar @eingabe;&lt;br /&gt;
 my $value = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 my $reading = substr($eingabe[0],0,length($eingabe[0])-1);&lt;br /&gt;
 &lt;br /&gt;
 foreach (my $i=1; $i&amp;lt;$anzahl;$i++)&lt;br /&gt;
 {&lt;br /&gt;
  $value = $value.$eingabe[$i].&amp;quot; &amp;quot;; &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $value = substr($value,0,length($value)-1);&lt;br /&gt;
 	 &lt;br /&gt;
 fhem (&amp;quot;set FHEM1 cmd setreading $Device $reading $value&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das dazu gehörige Notify, welches auf den die Statusänderung lauscht und die Nötigen Daten weitergibt, würde wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;NameDevice&amp;gt;.* {anzahl_evtparts($EVENT,$NAME)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Command executed ausschalten ==&lt;br /&gt;
Sollte man viele Befehle mittels RFHEM senden, empfiehlt es sich das Attribut &amp;quot;Verbose&amp;quot; auf 0 zu setzen. Dies führt zwar dazu, dass keine Fehler mehr angezeigt werden, aber es führt auch dazu, dass nicht bei jeder Befehlsausführung das Log voll geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
== Hinweis ==&lt;br /&gt;
Es sei nochmals ausdrücklich darauf hingewiesen, dass das Modul kein offizielles Modul ist. Es hat sich bisher niemand gefunden, der dieses Modul supporten möchte. Der Artikel wurde von jemanden erstellt, der das Modul nutzt, aber selbst nicht erstellt hat.&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14696</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14696"/>
		<updated>2016-03-14T23:26:36Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:RFHEM}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Befehlen auf anderer Instanz&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModFTopic=23638&lt;br /&gt;
|ModTechName=93_RFHEM.pm&lt;br /&gt;
|ModOwner=chris1284 ({{Link2FU|5217|Forum}})&lt;br /&gt;
|Modulname=93_RFHEM.pm&lt;br /&gt;
}}&lt;br /&gt;
[[RFHEM]] ist ein Modul um zwischen verschiedenen FHEM Instanzen Befehle abzusetzen. Das Modul wird nicht supported und ist somit auch nicht offiziell per Update installiert.  &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ziel des Moduls ist es Befehle auf einer anderen Instanz abzusetzen. Verwirklich wird das ganze per Telnet. Das Modul ist angelehnt an [[FHEM2FHEM]]. Der Unterschied ist, dass hier quasi alle Devices, auch die von FHEM2FHEM nicht unterstützten, gesteuert werden können.  &lt;br /&gt;
&lt;br /&gt;
== Herunterladen des Moduls ==&lt;br /&gt;
Das Modul selbst bekommen wir in {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Forums Beitrag. Nochmal, das Modul wird aktuell nicht supported und ist dem entsprechend alt. &lt;br /&gt;
&lt;br /&gt;
Wir laden das Modul in den Ordern ./FHEMInstallation/FHEM/. Bei einem PI wäre das dann /opt/fhem/FHEM. Danach starten wir FHEM neu. &lt;br /&gt;
&lt;br /&gt;
== Definieren des Device ==&lt;br /&gt;
Nun müssen wir uns ein Device anlegen. Dies machen wir klassisch in der Kommandozeile mittels&lt;br /&gt;
&amp;lt;pre&amp;gt;define Name RFHEM hostip [:port] [pw]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte eure zweite Instanz auf der gleichen Hardware laufen, den Port 7073 (Standard ist 7072 bei fhem und auch beim Modul, wenn keiner angegeben wird) und kein Passwort besitzen, wäre die Definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;define FHEM2 RFHEM 127.0.0.1:7073&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Befehle senden ==&lt;br /&gt;
Mittels &lt;br /&gt;
&amp;lt;pre&amp;gt;set &amp;lt;name&amp;gt; cmd &amp;lt;befehl&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
setzt ihr eure Befehle ab, welche in der zweiten Instanz ausgeführt werden. Wollen wir zum Beispiel die Lampe1 anschalten, müssen wir folgendes in die Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd set Lampe1 on&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Log der sendenden Instanz erscheint der Hinweis &amp;quot;command executed&amp;quot; und die zweite Instanz sollte die Lampe1 eingeschaltet haben.&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
=== Einfache Befehle ===&lt;br /&gt;
Einfache Befehle können auf der zweiten Instanz ausgeführt werden. Beispiele:&lt;br /&gt;
&lt;br /&gt;
Dummy schalten:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd setreading Dummy1 Reading1 &#039;Test 1 2 3&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dummy definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd define Dummy1 dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notifys erstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;set RemotePI cmd define b3lampV1 notify btn3 set lamp on&lt;br /&gt;
set RemotePI cmd define b3lampV1 notify btn3 {}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Perlcode ===&lt;br /&gt;
Was nicht funktioniert ist einen Perlcode auf der zweiten Instanz auszuführen. FHEM bezieht den Perlcode auf die erste Instanz. Somit würde zum Beispiel folgender Befehl nicht funktionieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;set RemotePI cmd define a1 at 17:00:00 {fhem(&amp;quot;set xyz on&amp;quot;);}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Instanz, auf welcher der Befehl abgesetzt wurde, würde selbst den Code &amp;quot;{fhem (&amp;quot;set xyz on&amp;quot;);}&amp;quot; ausführen wollen. &lt;br /&gt;
&lt;br /&gt;
=== SSL Auth ===&lt;br /&gt;
SSL Auth ist leider auch nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Nicht funktionierende Befehle ===&lt;br /&gt;
Bisher sind keine Befehle bekannt. Solltet jemand einen oder mehrere finden, so möge er diese bitte {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Thread posten. Vielleicht findet sich ja noch jemand, der den Befehl korrigieren kann. &lt;br /&gt;
&lt;br /&gt;
== Nützliche Hilfen ==&lt;br /&gt;
Typischer Fall, wie dieses Modul genutzt werden kann ist folgender. Man hat auf der gleichen, oder einer anderen, Hardware eine zweite FHEM Instanz. Der Grund mag sein, dass man blockierende Module auslagert (gleiche Hardware) oder Empfangslücken überbrücken möchte (andere Hardware).&lt;br /&gt;
&lt;br /&gt;
Wir nennen unsere Hauptinstanz MASTER und unsere zweite Instanz SLAVE. Auf SLAVE haben wir ein blockierendes Modul installiert, dessen Daten wir aber regelmäßig in MASTER haben möchten. Das Modul heißt TEST-Modul und hat die Readings TEST-Modul-R1 und TEST-Modul-R2. &lt;br /&gt;
&lt;br /&gt;
Wir installieren auf SLAVE das hier beschriebene Modul RFHEM und nennen es &amp;quot;Daten.Senden&amp;quot;. Auf SLAVE muss also regelmäßig, am besten bei einem Update der Readings, die Daten an MASTER gesendet werden. Dies lässt sich am einfachsten mittels eines [[notify]]. MASTER muss jedoch auch die Daten empfangen können. Hierfür bietet sich ein Dummy an. Den Dummy definieren wir auf Master wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Dummy.Empfang dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sendende Notify, wird auf SLAVE wie folgt definiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Daten.Senden.Notify notify Test-Modul.* set Daten.Senden cmd setreading Dummy.Empfang $EVENT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun schreibt der SLAVE bei jedem Update eines Readings in den Dummy des MASTERS die Werte. Auf dem Master können wir diese Veränderung nun auch abgreifen, wie bei jedem normalen Modul. Grafisch würde das ganze so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SLAVE: Readings Update an Test-Modul --&amp;gt; Meldung an Notify --&amp;gt; Meldung an MASTER --&amp;gt; Empfang der Daten im Dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doppelpunkte im Reading beim Dummy ==&lt;br /&gt;
Es kann vorkommen, dass die Readings im Dummy einen Doppelpunkt haben. In unserem Fall würde dann im Dummy &amp;quot;Dummy.Empfang&amp;quot; das Reading eins wie folgt stehen &amp;quot;Test-Modul-R1:&amp;quot;. Doppelpunkte sollte es zum Einen in Readings nicht geben, deswegen gibt es auch einen Hinweis im Log, wenn ihr FHEM startet und dies der Fall ist. Zum Zweiten kann es zu Problemen auf der MASTER Instanz kommen, wenn man zB ein [[DOIF]] auf die Readings des Dummy lauschen lässt. &lt;br /&gt;
&lt;br /&gt;
Aktuell muss man sich bei der Lösung des Problems noch selbst helfen, da es keinen Maintainer des Moduls gibt. Die Lösung hierzu könnte wie folgt aussehen. Wir erstellen uns eine Sub in der MyUtils ([[99_myUtils_anlegen]]) an, welche für uns die Doppelpunkte löscht. Diese Sub könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub anzahl_evtparts($$)&lt;br /&gt;
{&lt;br /&gt;
 my ($EVENT, $Device) = @_;&lt;br /&gt;
 my @eingabe = split(/ /,$EVENT);&lt;br /&gt;
 my $anzahl = scalar @eingabe;&lt;br /&gt;
 my $value = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 my $reading = substr($eingabe[0],0,length($eingabe[0])-1);&lt;br /&gt;
 &lt;br /&gt;
 foreach (my $i=1; $i&amp;lt;$anzahl;$i++)&lt;br /&gt;
 {&lt;br /&gt;
  $value = $value.$eingabe[$i].&amp;quot; &amp;quot;; &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $value = substr($value,0,length($value)-1);&lt;br /&gt;
 	 &lt;br /&gt;
 fhem (&amp;quot;set FHEM1 cmd setreading $Device $reading $value&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das dazu gehörige Notify, welches auf den die Statusänderung lauscht und die Nötigen Daten weitergibt, würde wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;NameDevice&amp;gt;.* {anzahl_evtparts($EVENT,$NAME)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Command executed ausschalten ==&lt;br /&gt;
Sollte man viele Befehle mittels RFHEM senden, empfiehlt es sich das Attribut &amp;quot;Verbose&amp;quot; auf 0 zu setzen. Dies führt zwar dazu, dass keine Fehler mehr angezeigt werden, aber es führt auch dazu, dass nicht bei jeder Befehlsausführung das Log voll geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
== Hinweis ==&lt;br /&gt;
Es sei nochmals ausdrücklich darauf hingewiesen, dass das Modul kein offizielles Modul ist. Es hat sich bisher niemand gefunden, der dieses Modul supporten möchte. Der Artikel wurde von jemanden erstellt, der das Modul nutzt, aber selbst nicht erstellt hat.&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14691</id>
		<title>Benutzer:Amenophis86/Artikelentwurf</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Amenophis86/Artikelentwurf&amp;diff=14691"/>
		<updated>2016-03-14T04:02:21Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:RFHEM}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Ausführung von Befehlen auf anderer Instanz&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=93_RFHEM.pm&lt;br /&gt;
|ModOwner=chris1284 ({{Link2FU|5217|Forum}})&lt;br /&gt;
}}&lt;br /&gt;
[[RFHEM]] ist ein Modul um zwischen verschiedenen FHEM Instanzen Befehle abzusetzen. Das Modul wird nicht supported und ist somit auch nicht offiziell per Update installiert.  &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ziel des Moduls ist es Befehle auf einer anderen Instanz abzusetzen. Verwirklich wird das ganze per Telnet. Das Modul ist angelehnt an [[FHEM2FHEM]]. Der Unterschied ist, dass hier quasi alle Devices, auch die von FHEM2FHEM nicht unterstützten, gesteuert werden können.  &lt;br /&gt;
&lt;br /&gt;
== Herunterladen des Moduls ==&lt;br /&gt;
Das Modul selbst bekommen wir in {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Forums Beitrag. Nochmal, das Modul wird aktuell nicht supported und ist dem entsprechend alt. &lt;br /&gt;
&lt;br /&gt;
Wir laden das Modul in den Ordern ./FHEMInstallation/FHEM/. Bei einem PI wäre das dann /opt/fhem/FHEM. Danach starten wir FHEM neu. &lt;br /&gt;
&lt;br /&gt;
== Definieren des Device ==&lt;br /&gt;
Nun müssen wir uns ein Device anlegen. Dies machen wir klassisch in der Kommandozeile mittels&lt;br /&gt;
&amp;lt;pre&amp;gt;define Name RFHEM hostip [:port] [pw]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte eure zweite Instanz auf der gleichen Hardware laufen, den Port 7073 (Standard ist 7072 bei fhem und auch beim Modul, wenn keiner angegeben wird) und kein Passwort besitzen, wäre die Definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;define FHEM2 RFHEM 127.0.0.1:7073&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Befehle senden ==&lt;br /&gt;
Mittels &lt;br /&gt;
&amp;lt;pre&amp;gt;set &amp;lt;name&amp;gt; cmd &amp;lt;befehl&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
setzt ihr eure Befehle ab, welche in der zweiten Instanz ausgeführt werden. Wollen wir zum Beispiel die Lampe1 anschalten, müssen wir folgendes in die Kommandozeile eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd set Lampe1 on&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Log der sendenden Instanz erscheint der Hinweis &amp;quot;command executed&amp;quot; und die zweite Instanz sollte die Lampe1 eingeschaltet haben.&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
=== Einfache Befehle ===&lt;br /&gt;
Einfache Befehle können auf der zweiten Instanz ausgeführt werden. Beispiele:&lt;br /&gt;
&lt;br /&gt;
Dummy schalten:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd setreading Dummy1 Reading1 &#039;Test 1 2 3&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dummy definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;set FHEM2 cmd define Dummy1 dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notifys erstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;set RemotePI cmd define b3lampV1 notify btn3 set lamp on&lt;br /&gt;
set RemotePI cmd define b3lampV1 notify btn3 {}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Perlcode ===&lt;br /&gt;
Was nicht funktioniert ist einen Perlcode auf der zweiten Instanz auszuführen. FHEM bezieht den Perlcode auf die erste Instanz. Somit würde zum Beispiel folgender Befehl nicht funktionieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;set RemotePI cmd define a1 at 17:00:00 {fhem(&amp;quot;set xyz on&amp;quot;);}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Instanz, auf welcher der Befehl abgesetzt wurde, würde selbst den Code &amp;quot;{fhem (&amp;quot;set xyz on&amp;quot;);}&amp;quot; ausführen wollen. &lt;br /&gt;
&lt;br /&gt;
=== SSL Auth ===&lt;br /&gt;
SSL Auth ist leider auch nicht möglich.&lt;br /&gt;
&lt;br /&gt;
=== Nicht funktionierende Befehle ===&lt;br /&gt;
Bisher sind keine Befehle bekannt. Solltet jemand einen oder mehrere finden, so möge er diese bitte {{Link2Forum|Topic=23638|Message=169011|LinkText=diesem}} Thread posten. Vielleicht findet sich ja noch jemand, der den Befehl korrigieren kann. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nützliche Hilfen ==&lt;br /&gt;
Typischer Fall, wie dieses Modul genutzt werden kann ist folgender. Man hat auf der gleichen, oder einer anderen, Hardware eine zweite FHEM Instanz. Der Grund mag sein, dass man blockierende Module auslagert (gleiche Hardware) oder Empfangslücken überbrücken möchte (andere Hardware).&lt;br /&gt;
&lt;br /&gt;
Wir nennen unsere Hauptinstanz MASTER und unsere zweite Instanz SLAVE. Auf SLAVE haben wir ein blockierendes Modul installiert, dessen Daten wir aber regelmäßig in MASTER haben möchten. Das Modul heißt TEST-Modul und hat die Readings TEST-Modul-R1 und TEST-Modul-R2. &lt;br /&gt;
&lt;br /&gt;
Wir installieren auf SLAVE das hier beschriebene Modul RFHEM und nennen es &amp;quot;Daten.Senden&amp;quot;. Auf SLAVE muss also regelmäßig, am besten bei einem Update der Readings, die Daten an MASTER gesendet werden. Dies lässt sich am einfachsten mittels eines [[notify]]. MASTER muss jedoch auch die Daten empfangen können. Hierfür bietet sich ein Dummy an. Den Dummy definieren wir auf Master wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Dummy.Empfang dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sendende Notify, wird auf SLAVE wie folgt definiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Daten.Senden.Notify notify Test-Modul.* set Daten.Senden cmd setreading Dummy.Empfang $EVENT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun schreibt der SLAVE bei jedem Update eines Readings in den Dummy des MASTERS die Werte. Auf dem Master können wir diese Veränderung nun auch abgreifen, wie bei jedem normalen Modul. Grafisch würde das ganze so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SLAVE: Readings Update an Test-Modul --&amp;gt; Meldung an Notify --&amp;gt; Meldung an MASTER --&amp;gt; Empfang der Daten im Dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Doppelpunkte im Reading beim Dummy ==&lt;br /&gt;
Es kann vorkommen, dass die Readings im Dummy einen Doppelpunkt haben. In unserem Fall würde dann im Dummy &amp;quot;Dummy.Empfang&amp;quot; das Reading eins wie folgt stehen &amp;quot;Test-Modul-R1:&amp;quot;. Doppelpunkte sollte es zum Einen in Readings nicht geben, deswegen gibt es auch einen Hinweis im Log, wenn ihr FHEM startet und dies der Fall ist. Zum Zweiten kann es zu Problemen auf der MASTER Instanz kommen, wenn man zB ein [[DOIF]] auf die Readings des Dummy lauschen lässt. &lt;br /&gt;
&lt;br /&gt;
Aktuell muss man sich bei der Lösung des Problems noch selbst helfen, da es keinen Maintainer des Moduls gibt. Die Lösung hierzu könnte wie folgt aussehen. Wir erstellen uns eine Sub in der MyUtils ([[99_myUtils_anlegen]]) an, welche für uns die Doppelpunkte löscht. Diese Sub könnte wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Command executed ausschalten ==&lt;br /&gt;
Sollte man viele Befehle mittels RFHEM senden, empfiehlt es sich das Attribut &amp;quot;Verbose&amp;quot; auf 0 zu setzen. Dies führt zwar dazu, dass keine Fehler mehr angezeigt werden, aber es führt auch dazu, dass nicht bei jeder Befehlsausführung das Log voll geschrieben wird.&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14627</id>
		<title>FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14627"/>
		<updated>2016-03-10T04:17:44Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Update mancher Widgets, Hinzufügen fehlender&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Oberfläche für Fhem&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=34233&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=n.a.&lt;br /&gt;
|ModOwner=setstate ({{Link2FU|7023|Forum}})&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:tablet_ui.png|200px|thumb|right|Fhem Tablet UI]]&lt;br /&gt;
FHEM Tablet UI ist ein leichtgewichtiges aber funktionsreiches Framework zum Steuern und Überwachen von in Fhem integrierten Geräten. Zahlreiche Widgets können sehr flexibel und leicht per HTML Code konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird die Installation und Konfiguration des FHEM Tablet UI beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Todo|alle Widgets hier übernehmen, Übersetzung, weitere Beispiele aus dem Forum einfügen (evtl. mit Link!?)}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Das User Interface hat sehr wenige Anforderungen für den Betrieb. Es benötigt &amp;lt;u&amp;gt;keine&amp;lt;/u&amp;gt; zusätzliche Frameworks, wie z.B. PHP oder MySQL.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen ist eine Fhem Installation mit HTTPSRV Modul. Das UI kann mit den gängigen Browsern Betriebssystem unabhängig genutzt werden oder mit dem Webviewcontrol.&lt;br /&gt;
Das Interface wird dabei in dem FHEM eigenen Webserver ausgeführt. Mit wenigen Anpassungen ist es auch möglich das UI auf anderen Webservern (Apache, u.a.) zu betreiben, dann kann FHEM und UI auch auf getrennten Systemen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;define TABLETUI HTTPSRV ftui/ ./www/tablet Tablet-UI&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Verzeichnis ./fhem/www/tablet die Datei index-example.html in index.html umbenennen oder eine neue index.html erzeugen und diese index.html wie nachfolgend beschrieben editieren.&lt;br /&gt;
&lt;br /&gt;
Das UI ist über den Link &amp;quot;Tablet-UI&amp;quot; auf der Fhem-Hauptseite oder durch Direktaufruf der URL &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;Fhem-url&amp;gt;:8083/fhem/tablet/index.html&amp;lt;/nowiki&amp;gt;&amp;quot; zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Hinweise zu einer manuellen Installation und weitere Infos sind auf der Projektseite https://github.com/knowthelist/fhem-tablet-ui zu finden.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update des UI durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
kann seit dem 24.12.2015 die URL zum normalen Updatebefehl von FHEM hinzugefügt werden. Mit einen &amp;quot;update check&amp;quot; sieht man dann  gleich alle Updates aus beiden &amp;quot;Welten&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Weitere Widgets ==&lt;br /&gt;
&lt;br /&gt;
=== Widgets for Fhem-tablet-ui ===&lt;br /&gt;
Zusätzlich zu den bei der Installation des Tablet UI direkt zur Verfügung stehenden Widgets, gibt es eine weitere Widget-Quelle von nesges unter https://github.com/nesges/Widgets-for-fhem-tablet-ui. Die Widgets aus dieser Quelle müssen für eine Nutzung separat installiert werden.&lt;br /&gt;
&lt;br /&gt;
Dazu folgenden Befehl in die Fhem-Befehlszeile eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/controls_widgets-for-fhem-tablet-ui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Näheres zur Installation unter [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/Installation Wiki: Installation]. &lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der einzelnen Widgets befindet sich ebenfalls [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki im Github-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&#039;&#039;&#039;META-Parameter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Tablet UI lässt sich über die META-Parameter konfigurieren. Mit den meisten META-Parametern kann das verhalten des UI beeinflusst werden. Diese Parameter befinden sich in der jeweiligen &#039;&#039;&#039;.html&#039;&#039;&#039; Datei (z.B. index.html) im Abschnitt &#039;&#039;&#039;&amp;lt;head&amp;gt;&#039;&#039;&#039;. Nachfolgend sind die verschiedenen Konfigurationsparameter aufgeführt. Die Parameter sind immer gleich aufgebaut.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;&amp;lt;META-Parameter&amp;gt;&amp;quot; content=&amp;quot;&amp;lt;Wert&amp;gt;&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! META-Parameter                                !! Wert / Beispiel                       !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
| longpoll                     || 1 oder 0 || Refresh sofort, alle 15 Minuten ein voller Refresh (shortpoll) statt alle 30 Sekunden ein voller Refresh.&lt;br /&gt;
|-&lt;br /&gt;
| gridster_disable             || 1 oder 0 || Drag&amp;amp;Drop der Gridster-Elemente auf der Seite deaktivieren.&lt;br /&gt;
|-&lt;br /&gt;
| toast                        || 1 oder 0 || Toast messages deaktivieren&lt;br /&gt;
|-&lt;br /&gt;
| fhemweb_url       || http://meinFhemServer:8083/fhem || Wird benötigt wenn der Webserver des TabletUI nicht auf dem FHEM Server läuft.&lt;br /&gt;
|-&lt;br /&gt;
| widget_margin                      || 1 bis 9999 || Abstände der Gridsterelemente verändern.&lt;br /&gt;
|-&lt;br /&gt;
| widget_base_width                      || 1 bis 9999 || Größe des Basis-Rasters (data-sizey=1/data-sizex=1) verändern.&lt;br /&gt;
|-&lt;br /&gt;
| widget_base_height                      || 1 bis 9999 || Größe des Basis-Rasters (data-sizey=1/data-sizex=1) verändern.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CSS-Styles&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Layout und das Aussehen des UI kann durch diverse vorgegebene CSS-Klassen beeinflusst werden. Die verfügbaren Klassen sind im Abschnitt [[#CSS Class description|CSS Class description]] oder [[#Positioning|Positioning]] aufgeführt. Es besteht auch die Möglichkeit eine eigene CSS Datei zu erstellen und darüber Änderungen am aussehen des UI vorzunehmen. Die eigenen CSS Datei würde bei einem Update unverändert bleiben. Daher ist abzuraten ein CSS Datei die mit dem UI Update verteilt wird zu modifizieren. Die eigene CSS Datei ist unter &#039;&#039;&#039;/fhem/tablet/css&#039;&#039;&#039; mit dem Namen &#039;&#039;&#039;fhem-tablet-ui-user.css&#039;&#039;&#039; zu finden. Sollte diese nicht vorhanden sein kann die Datei manuell erstellt werden.&lt;br /&gt;
Wird keine eigene CSS-Datei verwendet empfiehlt es sich den folgenden Eintrag im &amp;lt;head&amp;gt; der jeweiligen .html Datei zu entfernen, bzw. in Kommentar gesetzt werden um Probleme beim Laden der Seite zu verhindern.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/css/fhem-tablet-ui-user.css&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Farbe ==&lt;br /&gt;
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form oder als RGB-Wert anzugeben. Zum Beispiel: Hex: #A3CFA3 RBG: rgb(163, 207, 163).&lt;br /&gt;
&lt;br /&gt;
Knallige Farben wie #ff0000 für Rot oder #00ff00 für Grün sollten vermieden werden. Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.&lt;br /&gt;
&lt;br /&gt;
Hilfreich bei der Suche nach den Farbwerten ist der color picker: http://www.w3schools.com/tags/ref_colorpicker.asp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CSS Class description ==&lt;br /&gt;
&lt;br /&gt;
Not all widgets support all classes&lt;br /&gt;
&lt;br /&gt;
* readonly : changing of state is not allowed&lt;br /&gt;
* wider : 25px extra space for the widget to the top&lt;br /&gt;
* narrow : shorter distant to the widget above&lt;br /&gt;
* w1x, w2x, w3x : set the widget to a fix width: 1x, 2x, 3x width&lt;br /&gt;
* mini : lowest diameter for volume widget&lt;br /&gt;
* small : font 80% size (label), small diameter for volume widget&lt;br /&gt;
* medium : font 120% size&lt;br /&gt;
* large : font 150% size&lt;br /&gt;
* big : font 200% size&lt;br /&gt;
* bigplus : font 270% size&lt;br /&gt;
* bigger : font 320% size&lt;br /&gt;
* bigger.thin : font 450% size&lt;br /&gt;
* grande : font 600% size&lt;br /&gt;
* gigantic: font 144px size + 120px line-height&lt;br /&gt;
* thin : font thin&lt;br /&gt;
* darker : forecolor in gray&lt;br /&gt;
* hue-tick : draw ticks in color range&lt;br /&gt;
* hue-front : draw handle in color range&lt;br /&gt;
* hue-back : draw background in color range&lt;br /&gt;
* dim-tick : draw ticks in brightness range&lt;br /&gt;
* dim-front : draw handle in brightness range&lt;br /&gt;
* dim-back : draw background in brightness range&lt;br /&gt;
* red : foreground color red&lt;br /&gt;
* green : foreground color green&lt;br /&gt;
* blue : foreground color blue&lt;br /&gt;
* doublebox-v : container to place 2 small widgets (e.g. switch) one above the other&lt;br /&gt;
* doublebox-h : container to place 2 small widgets (e.g. switch) side by side&lt;br /&gt;
* timestamp : deliver the date time for the reading instead the value&lt;br /&gt;
* inline : positioning elements in a row, no line break&lt;br /&gt;
* top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
* left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
* right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
* blink : blink animatation for label or symbol widget&lt;br /&gt;
* verticalLine : Vertikale Line am rechten Rand&lt;br /&gt;
&lt;br /&gt;
== Positioning ==&lt;br /&gt;
&lt;br /&gt;
*container : new box or new row&lt;br /&gt;
*col-x-y : new column with x/y of width (col-1-3,col-2-3,col-1-2,col-1-4,col-1-8,col-1-5,col-2-5,col-3-5,col-4-5)&lt;br /&gt;
*inline : positioning elements in a row, no line break&lt;br /&gt;
*top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
*left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
*right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
*top-narrow : -15px closer on top (top-narrow-2x -&amp;gt; -30px; top-narrow-10 -&amp;gt; -10px)&lt;br /&gt;
*centered : horizontal centered&lt;br /&gt;
*left-align : align text left&lt;br /&gt;
*left : floating left&lt;br /&gt;
*right-align : align text right&lt;br /&gt;
*right : floating right&lt;br /&gt;
*wider : 15px extra space for the widget all around&lt;br /&gt;
*narrow : shorter distant to the widget above&lt;br /&gt;
*fullsize : 100% in width and height&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Teilweise dokumentierte Widgets:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/button button]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen Fhem-Befehl absetzen kann.&lt;br /&gt;
* [[#chart|chart]]: chart with similar capabilities as the FHEM plots &lt;br /&gt;
* checkbox:&lt;br /&gt;
* [[#circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des &#039;circle&#039; im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clicksound clicksound]: Mit dem Widget &amp;quot;clicksound&amp;quot; können Sounds an Click-Events von Elementen gebunden werden. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clock clock]: Das Widget &amp;quot;clock&amp;quot; stellt eine einfach Uhr zur verfügung.&lt;br /&gt;
* colorwheel:&lt;br /&gt;
* daytimepicker:&lt;br /&gt;
* departure:&lt;br /&gt;
* [[#dimmer|dimmer]]: toogle button with a setter for on value&lt;br /&gt;
* eventmonitor:&lt;br /&gt;
* highchart:&lt;br /&gt;
* [[#homestatus|homestatus]]: selector for 4 states (1=home, 2=night, 3=away, 4=holiday)&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/iframe iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe. &lt;br /&gt;
* [[#image|image]]: insert an image, the URL is given by a reading&lt;br /&gt;
* input:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/klimatrend klimatrend]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt. &lt;br /&gt;
* Knob:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.&lt;br /&gt;
* [[#label|label]]: STATE als Text anzeigen&lt;br /&gt;
* [[#level|level]]: vertical/horizontal bar to show values between min/max value&lt;br /&gt;
* link:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/multistatebutton multistatebutton]: Variante des push-Widgets das den set-Befehl abhängig vom gelesenen Status ändert.&lt;br /&gt;
* [[#pagetab|pagetab]]: Element to smoothly exchange the whole page with another page&lt;br /&gt;
* pagebutton:&lt;br /&gt;
* [[#playstream|playstream]]: Abspielen eines Webradio-Streams per Button&lt;br /&gt;
* [[#popup|popup]]: a popup dialog which open on click on another widget &lt;br /&gt;
* [[#progress|progress]]: round symbolic display for percent values&lt;br /&gt;
* [[#push|push]]: send any command to Fhem e.g. up / down&lt;br /&gt;
* range:&lt;br /&gt;
* readingsgroup:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads&lt;br /&gt;
* [[#rotor|rotor]]: Umschalten von zwei oder mehr Widgets an einer Position&lt;br /&gt;
* [[#select|select]]: Combobox to provide a list for selection&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: zum anzeigen und einstellen einer Uhrzeit.&lt;br /&gt;
* [[#simplechart|simplechart]]: simple XY line chart for one value (reads directly from Fhem log file) &lt;br /&gt;
* [[#slider|slider]]: vertical slider to select between min/max value&lt;br /&gt;
* spinner:&lt;br /&gt;
* swiper:&lt;br /&gt;
* [[#switch|switch]]: Toggle any command to Fhem (e.g. on / off)&lt;br /&gt;
* [[#symbol|symbol]]: State als Symbol darstellen (z.B. Fenster offen)&lt;br /&gt;
* [[#thermostat|thermostat]]: dial for heater thermostates to set desired value and show current value&lt;br /&gt;
* [[#volume|volume]]: dial to set a single value (e.g. 0-60)&lt;br /&gt;
* [[#weather|weather]]: insert an icon or image, represending a weather literal&lt;br /&gt;
* [https://github.com/svenson08/ftui-weekdaytimer-widget weekdaytimer]: Visualisierung des [[WeekdayTimer]] Modul&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/wind_direction wind_direction]: Zeigt die Windrichtung auf einer Windrose an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Demo der Widgets findet ihr [http://knowthelist.github.io/fhem/tablet/demo_widgets.html Hier].&lt;br /&gt;
----------------------------------&lt;br /&gt;
&lt;br /&gt;
Für alle Widgets gilt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+allgemeine Attribute&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-type&lt;br /&gt;
|Widget-Typ&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-device&lt;br /&gt;
|Fhem-Name des Gerätes (mit dem Befehl &#039;list&#039; bekommt man im Fhem die kpl. Liste)&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|CSS-Klassen für Aussehen und Formatierung des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Daten Empfangen&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Reading Name&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert für den Status on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert für den Status off&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Daten Senden&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|Reading Name&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert für den Status on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert für den Status off&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;chart&amp;quot;&amp;gt;&#039;&#039;&#039;CHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung) or array of names if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log) or or array of names if more than one graph shall be displayed&lt;br /&gt;
|&#039;-&#039; or omitting this data means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;) or or array of columnspecs if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-style&lt;br /&gt;
|name of the graph style to be used (e.g. &#039;SVGplot l0&#039; or &#039;ftui l0dash&#039;) or or array of styles if more than one graph shall be displayed using different stlyes. The standard fhem plot styles can be used furthermore there are some more predefined styles existing (details see css file). Own styles can be specified e.g. in the fhem-table-ui-user.css file.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ptype&lt;br /&gt;
|name of the plot type (e.g. &#039;lines&#039; or &#039;fa-cog&#039;) or or array of plottypes if more than one graph shall be displayed. All fhem plot styles are supported. Additionally it is possible to specify symbols (currently supported are font awesome (&#039;fa-...&#039;), open automation (&#039;oa-...&#039;) and fhem symbols (&#039;fs-...&#039;))&lt;br /&gt;
|&#039;lines&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-uaxis&lt;br /&gt;
|name of the axis to be used (&#039;primary&#039; or &#039;secondary&#039;) or or array of axis&#039; to be used if more than one graph shall be displayed. The &#039;primary&#039; axis is labelled on the left side, the &#039;secondary&#039; axis is labelled on the right side&lt;br /&gt;
|&#039;primary&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-legend&lt;br /&gt;
|caption of the graph (used in the legend and at the cursor) or an array of legend texts if more than one graph shall be displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue_sec&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue_sec&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines (related to primary axis). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically.&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick lines (in minutes). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_start&lt;br /&gt;
|number of days back from now for the start of the plot (0 means the plot starts from today 0:00). Additionally the x-axis start value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_end&lt;br /&gt;
|number of days back from now for the end of the plot (-1 means the plot ends today 24:00). Additionally the x-axis end value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|-1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-nofulldays&lt;br /&gt;
|switch to activate/deactivate rounding of the xaxis start and end values to full days (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext&lt;br /&gt;
|text to be shown besides the primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext_sec&lt;br /&gt;
|text to be shown besides the secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks for primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-crosshair&lt;br /&gt;
|switch to activate/deactivate the crosshair cursor (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cursorgroup&lt;br /&gt;
|number to define coupling of the crosshair cursor. The cursors of all charts having the same number are coupled and move together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-scrollgroup&lt;br /&gt;
|number to define coupling of the scrolling (shift and zoom). All charts having the same number are scrolled (shifted and zoomed) together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-showlegend&lt;br /&gt;
|switch to activate/deactivate the initial display of the legend window (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit_sec&lt;br /&gt;
|unit of the value to show beside of each Y ticks for secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixed size for width (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixed size for height (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks, nobuttons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; can be omitted in this case the default value &amp;quot;-&amp;quot; will be used. This means that the current logfile is going to be used.&lt;br /&gt;
&lt;br /&gt;
There are several buttons that control the dynamic behaviour of the chart. The &amp;lt;-, -&amp;gt;, + and - buttons shift and zoom the displayed data. The &amp;quot;legend&amp;quot; and &amp;quot;cursor&amp;quot; buttons are switching on and off the display of the legend window and the crosshair cursor respectively.&lt;br /&gt;
&lt;br /&gt;
When the legend window is displayed, a click on the legend text shows/hides the respective graph. The legend window can be dragged to other positions on desktop browsers (currently not yet working for iOS and Android).&lt;br /&gt;
&lt;br /&gt;
The crosshair cursor currently only works dynamically on desktop browsers. On iOS and Android you have to tap on the screen to set the cursor to a new position.&lt;br /&gt;
&lt;br /&gt;
There is a number of css styles that control the visible appearance of the chart. The following classes are supported:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!CSS class name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
!.chart-background&lt;br /&gt;
|Color etc. for the chart background&lt;br /&gt;
|-&lt;br /&gt;
!.text.axes&lt;br /&gt;
|Font and color for the chart axes&lt;br /&gt;
|-&lt;br /&gt;
!.buttons&lt;br /&gt;
|Size and color for the buttons (shift etc.)&lt;br /&gt;
|-&lt;br /&gt;
!.gridlines&lt;br /&gt;
|Size and color for gridlines generally&lt;br /&gt;
|-&lt;br /&gt;
!.xaxis&lt;br /&gt;
|Font, size and color for xaxis&lt;br /&gt;
|-&lt;br /&gt;
!.yaxis&lt;br /&gt;
|Font, size and color for yaxis&lt;br /&gt;
|-&lt;br /&gt;
!.xticks&lt;br /&gt;
|Font, size and color for xticks&lt;br /&gt;
|-&lt;br /&gt;
!.yticks&lt;br /&gt;
|Font, size and color for yticks&lt;br /&gt;
|-&lt;br /&gt;
!.crosshair&lt;br /&gt;
|Font, size and color (foreground/background) for the crosshair cursor&lt;br /&gt;
|-&lt;br /&gt;
!.caption&lt;br /&gt;
|Font, size and color for text buttons for legend and cursor switching&lt;br /&gt;
|-&lt;br /&gt;
!.legend&lt;br /&gt;
|Font, size and background color for legend window&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_chart|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;CIRCLEMENU&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-item-diameter&lt;br /&gt;
|diameter of the circle&lt;br /&gt;
|52&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-circle-radius&lt;br /&gt;
|radius of each item, in pixel&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-direction&lt;br /&gt;
|position of the items in relation to the center&lt;br /&gt;
|&#039;full&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-close-after&lt;br /&gt;
|closing time of the circle-menu&lt;br /&gt;
|(item-count + 1s) or a minimum of 4s&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|keepopen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Optionen für data-direction: top | right | bottom | left | top-right | top-left | bottom-right | bottom-left | top-half | right-half | bottom-half | left-half | full | vertical | horizontal&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_circlemenu|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;DIMMER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|(&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value for ON status to set&lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|value for OFF status to set&lt;br /&gt;
|value of data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-dim&lt;br /&gt;
|name of the reading responsible for dim (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|fa-lightbulb-o&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_dimmer|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;HOMESTATUS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|array of states using for get&lt;br /&gt;
|[&#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039;]&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|array of states using for set.&lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|array of fix names to show only in the UI as an alias to the real states&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the data-get-on array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-version&lt;br /&gt;
|name of the status model e.g. &#039;residents&#039;,&#039;roommate&#039;,&#039;guest&#039; &lt;br /&gt;
|(default NULL)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default version has 4 states: &#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039; The default aliases are &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;; data-version=&#039;residents&#039; or &#039;roommate&#039; or &#039;guest&#039; has 5 states (&#039;home&#039;,&#039;asleep&#039;,&#039;absent&#039;,&#039;gone&#039;,&#039;gotosleep&#039;) They have these aliases &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;,&#039;Retire&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_homestatus|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;image&amp;quot;&amp;gt;&#039;&#039;&#039;IMAGE&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get an URL from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-size&lt;br /&gt;
|width of the image in px or %, the height scales proportionally&lt;br /&gt;
|50%&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the image to show (use data-url or data-device + data-get, not both)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-refresh&lt;br /&gt;
|Interval in seconds for image refresh for usage together with data-url&lt;br /&gt;
|900&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_image|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widgets LABEL ===&lt;br /&gt;
&amp;lt;div id=&amp;quot;label&amp;quot;&amp;gt;&#039;&#039;&#039;LABEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem LABEL Widget kann der STATUS eines Device in Textform angezeigt werden. Dabei kann das die Farbe des Anzeigetext abhängig von dessen Wert festgelegt werden. &lt;br /&gt;
&lt;br /&gt;
Neben den &#039;&#039;&#039;allgemeine Attribute&#039;&#039;&#039; besitzt das LABEL-Widget die nachfolgenden Attribute.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get           &lt;br /&gt;
|Name des Readings in FHEM &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fix           &lt;br /&gt;
|Eine bestimmte Anzahl an Dezimalstellen &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; non-numeric &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-part          &lt;br /&gt;
|split position of the space separated value to show or an RegEx &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-color         &lt;br /&gt;
| fix color attribute or DEVICE:READING for dynamic setting of label color &lt;br /&gt;
| &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors        &lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-get    &lt;br /&gt;
|name of the DEVICE:Reading to colorize the label  &lt;br /&gt;
|data-device:data-get &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits        &lt;br /&gt;
|an array of numeric values to affect the colour of the Label &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-part   &lt;br /&gt;
|part number of the space separated value to show or a RegEx &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; all &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-unit          &lt;br /&gt;
|add a unit after a numeric value. use encoded strings e.g. &amp;quot;%B0C%0A&amp;quot; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-substitution  &lt;br /&gt;
|regex-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-hide          &lt;br /&gt;
|string to compare with current value. hide element when it&#039;s value equals data-hide &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-hideparents   &lt;br /&gt;
|jquery selector to hide element&#039;s parents too &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class              &lt;br /&gt;
|small, large, big, bigger, thin, red, green, blue, darker, timestamp, w1x, w2x, w3x, fixedlabel, icon, bg-limit &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit der Class &#039;fixedlabel&#039; kann man Label einbauen, die einen festen Text (direkt im HTML) haben, aber trotzdem die Farbe per Reading Value beeinflusst werden könnte.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;icon&#039; kann man Label einbauen, die wie Icons aussehen. Als Hintergrund gibt es &#039;icon round&#039; (rund), &#039;icon square&#039; (Rechteck mit abgerundeten Ecken) und &#039;icon squareborder&#039; (Rechteck mit abgerundeten Ecken und einem zusätzlichen Rand).&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;bg-limit&#039; wird der Hintergrund des Icon auf grün oder rot gesetzt, passend zum on/off Status des data-limits.&lt;br /&gt;
Use data-color OR data-colors + data-limits, not both.&lt;br /&gt;
&lt;br /&gt;
With class=&amp;quot;bg-limit&amp;quot; it changes the background color not the forecolor according data-limits&lt;br /&gt;
&lt;br /&gt;
class=&amp;quot;icon square&amp;quot; or class=&amp;quot;icon round&amp;quot; forces the label to a fix width and height in icon style&lt;br /&gt;
&lt;br /&gt;
Special layout can be achieved by overwriting of following classes in the fhem-tablet-ui-user.css:&lt;br /&gt;
&lt;br /&gt;
.label-precomma .label-comma .label-aftercomma .label-unit&lt;br /&gt;
&lt;br /&gt;
e.g.: .label-aftercomma{ font-size:40%; left: 4px; top: -25px; position: relative; }&lt;br /&gt;
&lt;br /&gt;
Functions for data-substitution:&lt;br /&gt;
&lt;br /&gt;
Array of replacements&lt;br /&gt;
RegEx-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected&lt;br /&gt;
data-substitution=&amp;quot;weekdayshort&amp;quot;&lt;br /&gt;
JS functions data-substitution=&amp;quot;toDate().ddmm()&amp;quot; - convert to day:month&lt;br /&gt;
data-substitution=&amp;quot;toDate().hhmm()&amp;quot; - convert to hour:minutes&lt;br /&gt;
&lt;br /&gt;
data-substitution=&amp;quot;toDate().hhmmss()&amp;quot; - convert to hour:minutes:secondes&lt;br /&gt;
&lt;br /&gt;
data-substitution=&amp;quot;toDate().eeee()&amp;quot; - convert to name of the week day&lt;br /&gt;
&lt;br /&gt;
data-substitution=&amp;quot;toDate().ago()&amp;quot; - convert to time span&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_label|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widgets LEVEL ===&lt;br /&gt;
&amp;lt;div id=&amp;quot;level&amp;quot;&amp;gt;&#039;&#039;&#039;LEVEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|&#039;0&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|&#039;100&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-part&lt;br /&gt;
|part number of the space separated value to show or an RegEx&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|a array of numeric or RegEx values to affect the colour of the label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|mini, horizontal&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_level|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;PAGETAB&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the new page to show&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&#039;fa-power-off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|color of OFF state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|color of Off state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|array of status to assign a special icon-list from data-icons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the a data-get-on array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|warn, activate (as additionals for data-icons)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_pagetab|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;playstream&amp;quot;&amp;gt;&#039;&#039;&#039;PLAYSTREAM&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL des Radio-Streams&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the control state from FHEM&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for PLAY status to get. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for STOP status to get. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-volume&lt;br /&gt;
|name of the reading to get the volume value (0-100) &lt;br /&gt;
|volume&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_playstream|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;popup&amp;quot;&amp;gt;&#039;&#039;&#039;POPUP&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading where to get the alert value from&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value which trigger to open the dialog&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value which trigger to close the dialog &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_popup|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;progress&amp;quot;&amp;gt;&#039;&#039;&#039;PROGRESS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set or name of the reading which helds the max value&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|novalue, percent&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_progress|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;push&amp;quot;&amp;gt;&#039;&#039;&#039;PUSH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
| name of the reading to set on FHEM (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value to send when the the button get pressed oder ein Array zwischen dessen Werten umgeschaltet werden kann&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-doubleclick&lt;br /&gt;
|timeout to wait for a second click or touch. &#039;0&#039; disables the doubleclick feature. &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-countdown&lt;br /&gt;
|secondes for the countdown progress control &lt;br /&gt;
|autodetect from &#039;on-for-timer&#039; command&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|fix color attribute for OFF state or DEVICE:READING for dynamic setting &lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|fix color attribute for Off state or DEVICE:READING for dynamic setting&lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;data-set-on&#039; can also be an array of values to toggle between this values&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_push|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;rotor&amp;quot;&amp;gt;&#039;&#039;&#039;ROTOR&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; | data-delay&lt;br /&gt;
|time in millisecondes to wait until next list item get shown&lt;br /&gt;
|3500&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fade, rotate&lt;br /&gt;
|&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Ohne Angabe von class erfolgt keine Animation.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_rotor|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;select&amp;quot;&amp;gt;&#039;&#039;&#039;SELECT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading that get the selected item of the list&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|name of the reading to set on Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-list&lt;br /&gt;
|name of the reading to get a :-separated list from Fhem&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-items&lt;br /&gt;
|an array of fix items to show in the selection box (alternative if data-list is empty)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|an array of fix names to show only in the selection box as an alias to the real items&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command to send to Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-quote&lt;br /&gt;
|characters to enclose the send value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|wider, w1x, w2x, w3x, large, big&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_select|Link zu einem Beispiel]]&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;simplechart&amp;quot;&amp;gt;&#039;&#039;&#039;SIMPLECHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log)&lt;br /&gt;
|&#039;-&#039; means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY &lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY &lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick line (in Minuten)&lt;br /&gt;
|360 minutes&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago&lt;br /&gt;
|number of days back from now &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-caption&lt;br /&gt;
|name of the chart to show as text &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_simplechart|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; kann man auch weglassen, dann greift der Defaultwert &amp;quot;-&amp;quot;. Damit wird das neuste Logfile gelesen.&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;slider&amp;quot;&amp;gt;&#039;&#039;&#039;SLIDER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-step&lt;br /&gt;
|step value&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-value&lt;br /&gt;
|RegEx to retrieve the value or part number of the space separated input to get the value&lt;br /&gt;
|&#039;-1&#039;: all of the input&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-value&lt;br /&gt;
|Format of the value to send to FHEM&lt;br /&gt;
|&#039;$v&#039;: the value only&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|width for horizontal sliders&lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|height for vertical sliders &lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-color&lt;br /&gt;
|color for quantity range&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-color&lt;br /&gt;
|color for range bar&lt;br /&gt;
|#404040&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|Aussehen/Ausrichtung&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für class steht mini, horizontal und negated (0 liegt oben) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_slider|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;switch&amp;quot;&amp;gt;&#039;&#039;&#039;SWITCH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|Kommando Name (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) &amp;lt;br /&amp;gt;(z.B setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-doubleclick&lt;br /&gt;
|timeout to wait for x millisecondes click or touch. &#039;0&#039; disables the doubleclick feature.&lt;br /&gt;
|&#039;0&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Einstellung bei zwei Werten&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert, bei dem zum Status ON geschaltet werden soll. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert, bei dem zum Status OFF geschaltet werden soll. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf ON geschaltet wurde  &lt;br /&gt;
|Wert von data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf OFF geschaltet wurde &lt;br /&gt;
|Wert von data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des Font-Awesome Icon. &lt;br /&gt;
|&#039;fa-lightbulb-o&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Name des Font-Awesome Hintergrund Icon. &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|Hintergrundfarbe beim Status on oder DEVICE:Reading bei dynamischen Einstellungen&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|Hintergrundfarbe beim Status off oder DEVICE:Reading bei dynamischen Einstellungen&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Widget Farbe beim Status ON &lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Widget Farbe beim Status OFF &lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Einstellung bei mehreren Werten&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-state&lt;br /&gt;
|Array mit Status Angaben &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-state&lt;br /&gt;
|Array mit Status Angaben, die gesetzt werden sollen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|Array Icons zum zuvor definierten Status&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-backgroundicons&lt;br /&gt;
|Array mit Hintergrund Icons zum zuvor definierten Status &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|Array mit Farben zum zuvor definierten Status &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-colors&lt;br /&gt;
|Array mit Hintergrund Farben zum zuvor definierten Status &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class : readonly&lt;br /&gt;
|Es wird nur der Status angezeigt und kann nicht geändert werden&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-get-on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;data-get-off&amp;lt;/code&amp;gt; accept also RegEx values. e.g. data-get-on=&amp;quot;[0-9]{1,3}|on&amp;quot; means set switch on if STATE is a numeric value or &#039;on&#039;. data-get-off=&amp;quot;!on&amp;quot; means accept all but the data-get-on value (negation)&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_switch|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widgets SYMBOL ===&lt;br /&gt;
&amp;lt;div id=&amp;quot;symbol&amp;quot;&amp;gt;&#039;&#039;&#039;SYMBOL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem SYMBOL Widget kann der STATUS eines Device dargestellt werden. Dabei kann das angezeigte Symbol und dessen Farbe bestimmt werden. Wie bei anderen Widgets kann das Symbol und die Farbe vom State abhängig konfiguriert werden. Das SYMBOL-Widget dient nur zur Anzeige eines STATUS, es besitzt kein Möglichkeit der Interaktion.&lt;br /&gt;
&lt;br /&gt;
Neben den &#039;&#039;&#039;allgemeine Attribute&#039;&#039;&#039; besitzt das SYMBOL-Widget die nachfolgenden Attribute.&lt;br /&gt;
&lt;br /&gt;
dual state notation&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! HTML Attribut !! Beschreibung !! Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!data-get || Name des Reading, was gelesen werden soll || &#039;STATE&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Einstellung bei zwei Werten&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert für on&lt;br /&gt;
|&#039;open&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert für off &lt;br /&gt;
|&#039;closed&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des Symbols  &lt;br /&gt;
|&#039;ftui-window&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Hintergrundsymbol&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Einstellung bei mehreren Werten&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-states&lt;br /&gt;
|Array für states. &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|Array mit Farben zu data-states aArray&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-colors&lt;br /&gt;
|Array mit Hintergrundfarben zu data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
data-get-on,data-get-off and data-states accept also RegEx values. The value for one icon can also contain an additional animatation CSS name, e.g. &amp;quot;fa-exclamation-triangle fa-blink&amp;quot; for a blinking Symbol&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_symbol|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
=== Widgets THERMOSTAT===&lt;br /&gt;
&amp;lt;div id=&amp;quot;thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;THERMOSTAT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-temp&lt;br /&gt;
|reading for measured temperature of thermostates&lt;br /&gt;
|&#039;measured-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-valve&lt;br /&gt;
|reading for valve position of thermostates&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minColor&lt;br /&gt;
|Farbe des Keises für Min&lt;br /&gt;
| #4477FF&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxColor&lt;br /&gt;
|Farbe des Kreises für Max, zwischen Min und Max wird linear interpoliert &lt;br /&gt;
| #FF0000&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-step&lt;br /&gt;
|step size for value adjustment e.g. 0.5 &lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-bgColor&lt;br /&gt;
|Die Farbe der Kreises zwischen den ticks&lt;br /&gt;
|&#039;transparent&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fgColor&lt;br /&gt;
|Die Farbe der zahl im Kreismittelpunkt&lt;br /&gt;
|#bbbbbb&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-tkColor&lt;br /&gt;
|Die Farbe der ticks&lt;br /&gt;
|#696969&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleOffset&lt;br /&gt;
|Start der ticks im Kreis (in Winkelgraden, 0 = oben)&lt;br /&gt;
| -120&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleArc&lt;br /&gt;
|Bereich der ticks im Kreis (in Winkelgraden)&lt;br /&gt;
|240&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|big, readonly&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_thermostat|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;volume&amp;quot;&amp;gt;&#039;&#039;&#039;VOLUME&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem &lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;rigth&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-value&lt;br /&gt;
|RegEx to retrieve the value or part number of the space separated input to get the value&lt;br /&gt;
|&#039;-1&#039;: all of the input&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-value&lt;br /&gt;
|Format of the value to send to FHEM&lt;br /&gt;
|&#039;$v&#039;: the value only&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-tickstep&lt;br /&gt;
|distance between ticks&lt;br /&gt;
|4|20&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-unit&lt;br /&gt;
|add a unit after the desired value.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|mini, small, big, bigger, hue-tick, hue-front, hue-back, dim-tick ,dim-front, dim-back, readonly&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_volume|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;weather&amp;quot;&amp;gt;&#039;&#039;&#039;WEATHER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the weather literal from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-imageset&lt;br /&gt;
|collection of images to display current weather situation. Possible values: &#039;meteocons&#039;, &#039;kleinklima&#039;&lt;br /&gt;
|&#039;meteocons&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-image-path&lt;br /&gt;
|path to the images of the selected imageset&lt;br /&gt;
|/images/weather/&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_weather|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Beispiele ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_chart&amp;quot;&amp;gt;&#039;&#039;&#039;Chart&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display a chart with similar capabilities as the FHEM plots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div    data-type=&amp;quot;chart&amp;quot;&lt;br /&gt;
	data-logdevice=&#039;[&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Predicted&amp;quot;]&#039;&lt;br /&gt;
	data-columnspec=&#039;[&amp;quot;4:Garden.T:15:&amp;quot;,&amp;quot;10:Garden.T:0:delta-h&amp;quot;,&amp;quot;10:Garden.T:0:delta-d&amp;quot;,&amp;quot;4:predicted.*:15:&amp;quot;]&#039;&lt;br /&gt;
	data-style=&#039;[&amp;quot;ftui l0fill&amp;quot;,&amp;quot;ftui l1fill&amp;quot;,&amp;quot;ftui l2&amp;quot;,&amp;quot;ftui l3dot&amp;quot;]&#039;&lt;br /&gt;
	data-ptype=&#039;[&amp;quot;lines&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;cubic&amp;quot;]&#039;&lt;br /&gt;
	data-uaxis=&#039;[&amp;quot;primary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;primary&amp;quot;]&#039;&lt;br /&gt;
	data-legend=&#039;[&amp;quot;Temperature&amp;quot;,&amp;quot;Rain/hour&amp;quot;,&amp;quot;Rain/day&amp;quot;,&amp;quot;Predicted Temp.&amp;quot;]&#039;&lt;br /&gt;
	data-yunit=&amp;quot;°C&amp;quot;&lt;br /&gt;
	data-ytext=&amp;quot;Temperature&amp;quot;&lt;br /&gt;
	data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-yunit_sec=&amp;quot;mm&amp;quot;&lt;br /&gt;
	data-ytext_sec=&amp;quot;Rain (mm)&amp;quot;&lt;br /&gt;
	data-height=&amp;quot;250&amp;quot;&lt;br /&gt;
	data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
	data-daysago_start=&amp;quot;2013-08-13T00:00:00&amp;quot;&lt;br /&gt;
	data-daysago_end=&amp;quot;2013-08-14T00:00:00&amp;quot;&lt;br /&gt;
	data-cursorgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-scrollgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-xticks=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:chart_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;Circlemenu&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cover a lot of other button behind one single button&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;circlemenu&amp;quot; class=&amp;quot;cell circlemenu&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-icon=&amp;quot;fa-wrench&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -6&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-6&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -2&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level 0&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;0&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +3&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +9&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +C&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;12&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Woofer&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:circlemenu_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;Dimmer&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget Beispiel für Philips Hue&lt;br /&gt;
&lt;br /&gt;
Minimalvariante&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;!off&amp;quot; data-get-off=&amp;quot;off&amp;quot;&lt;br /&gt;
        data-set=&amp;quot;pct&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Anzeige der Dimstufe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
       data-get=&amp;quot;onoff&amp;quot;&lt;br /&gt;
       data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
       data-set=&amp;quot;&amp;quot;&lt;br /&gt;
       data-set-on=&amp;quot;on&amp;quot; data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
       data-dim=&amp;quot;pct&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget für MilightDevice&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot;&lt;br /&gt;
  data-device=&amp;quot;SonstWas&amp;quot;&lt;br /&gt;
  data-get=&amp;quot;brightness&amp;quot;&lt;br /&gt;
  data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-get-on=&amp;quot;[1-9][0-9]*&amp;quot;&lt;br /&gt;
  data-set-on=&amp;quot;on&amp;quot;&lt;br /&gt;
  data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
  data-dim=&amp;quot;dim&amp;quot;&lt;br /&gt;
  data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-max=&amp;quot;100&amp;quot;&lt;br /&gt;
&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;Homestatus&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel rechts im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
       data-get-on=&#039;[&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;]&#039;&lt;br /&gt;
       data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;]&#039;&lt;br /&gt;
       data-icons=&#039;[&amp;quot;fa-home&amp;quot;,&amp;quot;fa-bed&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-suitcase&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel links im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-get-on=&#039;[&amp;quot;home&amp;quot;,&amp;quot;asleep&amp;quot;,&amp;quot;absent&amp;quot;,&amp;quot;gone&amp;quot;,&amp;quot;gotosleep&amp;quot;]&#039;&lt;br /&gt;
        data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;,&amp;quot;Retire&amp;quot;]&#039;&lt;br /&gt;
        data-icons=&#039;[&amp;quot;fa-fire&amp;quot;,&amp;quot;fa-film&amp;quot;,&amp;quot;fa-plus&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-tint&amp;quot;]&#039;&lt;br /&gt;
        data-version=&#039;residents&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:homestatus_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_image&amp;quot;&amp;gt;&#039;&#039;&#039;Image&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erzeugt ein Widget mit einem Bild aus dem www, das alle 5 Sekunden aktualisiert wird (hier eine Wetterkarte vom DWD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot;&lt;br /&gt;
     data-size=&amp;quot;80%&amp;quot;&lt;br /&gt;
     data-url=&amp;quot;http://www.dwd.de/wundk/wetter/de/Deutschland.jpg&amp;quot;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:image_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for how to add an image to the dashboard which its URL is delivered by a Fhem module like PROPLANTA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot; data-device=&amp;quot;Wetter1&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDayIcon&amp;quot; &lt;br /&gt;
     data-size=&amp;quot;40px&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_label&amp;quot;&amp;gt;&#039;&#039;&#039;Label&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
STATE   T: 20.0 H: 61&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;2&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; data-part=&amp;quot;4&amp;quot; &lt;br /&gt;
     data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But the same result can reached by getting single readings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
humidity    58&lt;br /&gt;
temperature 20.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;temperature&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;humidity&amp;quot; data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to influence the color of the label according to value limits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;OutTemp&amp;quot; &lt;br /&gt;
     data-limits=&#039;[-73,10,23]&#039; &lt;br /&gt;
     data-colors=&#039;[&amp;quot;#6699FF&amp;quot;,&amp;quot;#AA6900&amp;quot;,&amp;quot;#FF0000&amp;quot;]&#039; &lt;br /&gt;
     data-unit=&amp;quot;%B0C%0A&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a widget for shutter via push: show state and set up/down&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;wzRollo&amp;quot; &lt;br /&gt;
     data-get-on=&amp;quot;up&amp;quot; &lt;br /&gt;
     data-get-off=&amp;quot;down&amp;quot; &lt;br /&gt;
     data-icon=&amp;quot;fa-bars&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;Rollo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a label for a time value in short format with usage of RegEx.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;(\d\d\.\d\d\.).*&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to show two labels in one line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunrise&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;bis&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunset&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des UV-Indexes und der Abhängigkeit der anzuzeigenden Farbe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc0_uv&amp;quot;&lt;br /&gt;
        data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot; &lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc0_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc1_uv&amp;quot;&lt;br /&gt;
	data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot;&lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc1_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:label_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des Labels als Icon.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon round bg-red cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon square bg-blue cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon squareborder cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;PowerAV_Sw&amp;quot; data-colors=&#039;[&amp;quot;red&amp;quot;,&amp;quot;green&amp;quot;]&#039; data-limits=&#039;[&amp;quot;off&amp;quot;,&amp;quot;on&amp;quot;]&#039; class=&amp;quot;icon round bg-limit cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Label_tabletUI_icon.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;Pagetab&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tab menu to switch smoothly between multiple pages. Multiple pagetabs in a template file: menu.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt;MENU&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index.html&amp;quot;  data-icon=&amp;quot;fa-home&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_2.html&amp;quot; data-icon=&amp;quot;fa-sliders&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_3.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_4.html&amp;quot; data-icon=&amp;quot;fa-hotel&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_5.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_6.html&amp;quot; data-icon=&amp;quot;fa-database&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_7.html&amp;quot; data-icon=&amp;quot;fa-fax&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_playstream&amp;quot;&amp;gt;&#039;&#039;&#039;Playstream&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt einen Knopf zum direkten Abspielen eines Webradio-Streams.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;playstream&amp;quot; data-url=&amp;quot;http://radioeins.de/stream&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Radio eins&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_push&amp;quot;&amp;gt;&#039;&#039;&#039;Push&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a push button widget to trigger all devices on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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=&amp;quot;on&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei horizontale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei quadratische vertikale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_rotor&amp;quot;&amp;gt;&#039;&#039;&#039;Rotor&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a rotor widget, which switches between to days of weather forecast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;rotor&amp;quot; class=&amp;quot;fade&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Heute&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Morgen&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_select&amp;quot;&amp;gt;&#039;&#039;&#039;Select&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt zwei Comboboxen zur Auswahl des Eingang eines 2-Zonen-AV-Receivers. Die Liste für Zone2 ist fest, die Liste für Zone1 wird von Fhem übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell wider&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline wider&amp;quot;&amp;gt;Zone2&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiverZ2&amp;quot; data-items=&#039;[&amp;quot;Airplay&amp;quot;,&amp;quot;Webradio&amp;quot;,&amp;quot;BD/DVD&amp;quot;,&amp;quot;PHONO&amp;quot;]&#039; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;Zone1&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-list=&amp;quot;inputs&amp;quot; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:select_tabeltUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_slider&amp;quot;&amp;gt;&#039;&#039;&#039;Slider&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slider mit einstellbaren Werten von 10 bis 90:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot; &lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;10&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;90&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Light1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Horizontal angeordneter Slider:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;0&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;100&amp;quot; &lt;br /&gt;
     class=&amp;quot;horizontal&amp;quot; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_switch&amp;quot;&amp;gt;&#039;&#039;&#039;Switch&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schalter. Usage of RegEx pattern for state request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; class=&amp;quot;cell&amp;quot; &lt;br /&gt;
            data-device=&amp;quot;MILIGHT_Zone1_Wohnzimmer&amp;quot; &lt;br /&gt;
            data-get-on=&amp;quot;on.*&amp;quot;&lt;br /&gt;
            data-get-off=&amp;quot;off&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine Gruppe von Schaltern, um zwischen vier verschiedenen Werten eines device umzuschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell left&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert1).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert1&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert1&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert2).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert2&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert2&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert3).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert3&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert3&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert4).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert4&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert4&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_symbol&amp;quot;&amp;gt;&#039;&#039;&#039;Symbol&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;wert1&amp;quot;,&amp;quot;wert2&amp;quot;,&amp;quot;wert3&amp;quot;]&#039; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-arrow-up&amp;quot;,&amp;quot;fa-user&amp;quot;,&amp;quot;fa-arrow-down&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;SeaGreen&amp;quot;,&amp;quot;SlateBlue&amp;quot;,&amp;quot;IndianRed&amp;quot;]&#039; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon with blink and spin animation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-exclamation-triangle fa-blink&amp;quot;,&amp;quot;fa-exclamation-circle&amp;quot;,&amp;quot;fa-cog fa-spin&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;Crimson&amp;quot;,&amp;quot;GoldenRod&amp;quot;,&amp;quot;SeaGreen&amp;quot;]&#039; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;Wert1&amp;quot;,&amp;quot;Wert2&amp;quot;,&amp;quot;Wert3&amp;quot;]&#039; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with RegEx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
     data-icons=&#039;[&amp;quot;oa-measure_battery_100&amp;quot;,&amp;quot;oa-measure_battery_75&amp;quot;,&amp;quot;oa-measure_battery_50&amp;quot;,&amp;quot;oa-measure_battery_25&amp;quot;,&amp;quot;oa-measure_battery_0&amp;quot;]&#039;&lt;br /&gt;
     data-get-on=&#039;[&amp;quot;3\\.[0-9]&amp;quot;,&amp;quot;2\\.[789]&amp;quot;,&amp;quot;2\\.[456]&amp;quot;,&amp;quot;2\\.[123]&amp;quot;,&amp;quot;((2\\.0)|([01]\\.[0-9]))&amp;quot;]&#039;&lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with greater-equal compare and 90° rotated symbols&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
    data-icons=&#039;[&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_25 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_50 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_75 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;]&#039;&lt;br /&gt;
    data-get-on=&#039;[&amp;quot;0&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;2.4&amp;quot;,&amp;quot;2.7&amp;quot;,&amp;quot;3.0&amp;quot;]&#039;&lt;br /&gt;
    data-on-colors=&#039;[&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;Thermostat&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure as data-device=&#039;...&#039; that item which delivers temp and desired-temp as reading.&lt;br /&gt;
&lt;br /&gt;
Default parameters are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data-get=&amp;quot;desired-temp&amp;quot; data-temp=&amp;quot;measured-temp&amp;quot; data-set=&amp;quot;desired-temp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefor for HomaMatic HM-CC-RT-DN this is sufficient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&#039;KH_Clima&#039; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The long format looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;KH_Clima&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;desired-temp&amp;quot; &lt;br /&gt;
     data-temp=&amp;quot;measured-temp&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for MAX!:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&amp;quot;HZ_Tuer&amp;quot; &lt;br /&gt;
    data-valve=&amp;quot;valveposition&amp;quot; &lt;br /&gt;
    data-get=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    data-temp=&amp;quot;temperature&amp;quot; &lt;br /&gt;
    data-set=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The wigets will show the valve value only in case of a valid data-valve attribute. The default for data-valve ist null. That means, a empty data-valve attribute hides the valve label for the widget.&lt;br /&gt;
&lt;br /&gt;
[[Datei:thermostat.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_weather&amp;quot;&amp;gt;&#039;&#039;&#039;Weather&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Widget fügt ein dem Wetter entsprechendes Bild ein. Die Daten können durch Fhem-Module wie [[PROPLANTA]], [[OPENWEATHER]] und [[Weather]] bereitgestellt werden. &lt;br /&gt;
Add &#039;big&#039; or &#039;bigger&#039; to CSS class to get a bigger weather icon.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;weather&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;Weather&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDay&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:weather.png]]&lt;br /&gt;
&lt;br /&gt;
== Icon-Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* Eingebaute Icons: Diese haben das ftui-Präfix. Zurzeit sind folgende verfügbar: ftui-window, ftui-door&lt;br /&gt;
&lt;br /&gt;
* Mehr als 500 Icons von &amp;quot;http://fortawesome.github.io/Font-Awesome/icons&amp;quot; verfügbar. Einfach den Icon-Namen angeben (Präfix &amp;quot;fa-&amp;quot; nicht vergessen, Z.B. &amp;lt;code&amp;gt;data-icon=&amp;quot;fa-volume-up&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Es stehen auch Openautomation Font-Files zur Verfügung. Wer sie nutzen möchte, muss folgende Stylesheets in die index.html hinzufügen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/openautomation.css&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/fhemSVG.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese font icons haben das Präfix &#039;fs-&#039; bzw. &#039;oa-&#039;.&lt;br /&gt;
&lt;br /&gt;
Beispiel bei einem Schalter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&#039;dummy1&#039; data-icon=&amp;quot;oa-secur_locked&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und so als großes Symbol:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-icon=&amp;quot;oa-status_frost&amp;quot;&lt;br /&gt;
        data-on-color=&amp;quot;#bb3232&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;on&amp;quot;&lt;br /&gt;
        data-get-off=&amp;quot;!on&amp;quot;&lt;br /&gt;
        class=&amp;quot;bigger&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Icons kann man auch etwas dicker darstellen mit den Zusatz bold: &amp;lt;code&amp;gt;data-icon=&amp;quot;oa-secur_locked bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Namen der verfügbaren Icons findet man auch in den CSS Files (openautomation.css / fhemSVG.css)&lt;br /&gt;
&lt;br /&gt;
== Spezial ==&lt;br /&gt;
Folgender Befehl setzt einen direkten Befehl an Fhem ab (&amp;lt;code&amp;gt;set dummy1 off&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div onclick=&amp;quot;setFhemStatus(&#039;set dummy1 off&#039;)&amp;quot;&amp;gt;All off!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM_Tablet_UI/FAQ|FHEM Tablet UI FAQ]] zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,34233.0.html Forums-Beitrag]&lt;br /&gt;
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,37378.0.html User-Demos]&lt;br /&gt;
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Verkehrslage&amp;diff=14626</id>
		<title>Verkehrslage</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Verkehrslage&amp;diff=14626"/>
		<updated>2016-03-10T03:25:41Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Erstellen der Seite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier wird ein Device erstellt um sich die [[Verkehrslage]] einer bestimmten Strecke anzeigen zu lassen. Das ganze beruht auf dem Modul [[HTTPMOD]]. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ziel ist es, dass ein Dummy die aktuelle Verkehrslage für einen bestimmten Weg anzeigt und sich regelmäßig aktualisiert.  &lt;br /&gt;
&lt;br /&gt;
== Vorraussetzungen ==&lt;br /&gt;
Benötigt wird das Modul [[HTTPMOD]], welches standardmäßig installiert ist. Weiterhin wird ein Google Account benötigt und ein API Key um auf die Daten der Google Verkehrslage zuzugreifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API Key von Google beziehen ==&lt;br /&gt;
Der Google API Key ist ein Schlüssel, welcher uns berechtigt Daten von Google zu erhalten. Google hat verschiedene Programme, welche über eine API Schnittstelle zur Verfügung gestellt werden. Damit nicht jeder einfach auf diese Daten zugreifen kann, wird der Key benötigt. Um diesen zu bekommen müsst ihr als aller erstes einen Google Account erstellen auf www.google.de &lt;br /&gt;
&lt;br /&gt;
Sobald ihr dies habt, müssen wir in die Developer Console. Grund ist, dass der Zugriff auf die Daten eigentlich für Entwickler ist. Dorthin gelang ihr über diesen [https://console.developers.google.com/start?hl=de Link]. &lt;br /&gt;
&lt;br /&gt;
Als nächstes müsst ihr oben Links auf &amp;quot;Google APIs verwenden&amp;quot; klicken und ein neues Projekt erstellen, wenn ihr noch keins habt.&lt;br /&gt;
&lt;br /&gt;
Jetzt in der Übersicht beim Reiter &amp;quot;Google APIs&amp;quot; unter Google Maps API &amp;quot;Google Maps Distance Matrix API&amp;quot; auswählen und dort auf den blauen Button &amp;quot;Enable&amp;quot; klicken.  &lt;br /&gt;
&lt;br /&gt;
Unter dem Reiter &amp;quot;Nutzung&amp;quot; könnt ihr später die Häufigkeit eurer Zugriffe anzeigen lassen. Unter dem Reiter &amp;quot;Kontingente&amp;quot; seht ihr, wie viele Zugriffe ihr an diesem Tag noch tätigen könnt. Insgesamt sind 2500 Zugriffe pro Tag erlaubt. Das sind etwa 1,7 Zugriffe pro Minute. So viele sollte man eigentlich nicht brauchen. &lt;br /&gt;
&lt;br /&gt;
Auf der linken Seite unter &amp;quot;Zugangsdaten&amp;quot; kann man sich nun auch seinen Key anzeigen lassen. Diesen werden wir später für die Zugriffe benötigen. &lt;br /&gt;
&lt;br /&gt;
== Link für das Modul erstellen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://maps.googleapis.com/maps/api/distancematrix/json?origins=ORT,STRASSE+NR&amp;amp;destinations=ORT,STRASSE+NR&amp;amp;mode=driving&amp;amp;language=de-DE&amp;amp;departure_time=now&amp;amp;key=APIKEY&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Den Link müssen wir mit unseren eigenen Angaben ergänzen. Starten wir zB in Frankfurt an der Friedberger Straße 291 und wollen nach Gießen in die Straße Schiffenberger Weg 115 sieht unser Link wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://maps.googleapis.com/maps/api/distancematrix/json?origins=Frankfurt,Friedberger%20Stra%C3%9Fe%20291&amp;amp;destinations=Gie%C3%9Fen,%20Schiffenberger%20Weg%20115&amp;amp;mode=driving&amp;amp;language=de-DE&amp;amp;departure_time=now&amp;amp;key=APIKEY&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich den Link einmal in die Browserzeile einzugeben. Dann muss auch nicht auf Leerzeichen geachtet werden und Google formatiert ihn uns automatisch, wie wir ihn brauchen. Übrigens seht ihr dann auch, wie die Seite aussieht, auf welche wir später mit dem HTTPMOD Modul zugreifen werden. &lt;br /&gt;
&lt;br /&gt;
== HTTPMOD Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
=== Definieren des Device ===&lt;br /&gt;
Wenn wir nun unseren Google API Key und den Link haben, müssen wir ein neues Device mittels des [[HTTPMOD]] Moduls anlegen. In unserem Beispiel werden wir es wie folgt nennen: Verkehr.FFM.GI Verkehr für die Übersicht, FFM, weil wir ins Frankfurt am Main starten werden und GI, weil wir in Gießen enden. &lt;br /&gt;
&lt;br /&gt;
Wir geben also folgendes in unsere Kommandozeile ein: &lt;br /&gt;
&amp;lt;pre&amp;gt;define Verkehr HTTPMOD Link 3600&amp;lt;/pre&amp;gt; &lt;br /&gt;
in unserem Beispiel also:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Verkehr HTTPMOD https://maps.googleapis.com/maps/api/distancematrix/json?origins=Frankfurt,Friedberger%20Stra%C3%9Fe%20291&amp;amp;destinations=Gie%C3%9Fen,%20Schiffenberger%20Weg%20115&amp;amp;mode=driving&amp;amp;language=de-DE&amp;amp;departure_time=now&amp;amp;key=APIKEY 3600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahl am Ende bestimmt die Häufigkeit der Abfrage in Sekunden. In unserem Fall also einmal die Stunde. &lt;br /&gt;
&lt;br /&gt;
=== Anlegen der Attribute ===&lt;br /&gt;
Die benötigten Daten werden nun über die Attribut readingXXName und readingXXRegex abgefragt. &lt;br /&gt;
&lt;br /&gt;
readingXXName: Hiermit geben wir dem späteren Reading einen Namen. &lt;br /&gt;
&lt;br /&gt;
readingXXRegex: Hier wird festgelegt, welcher Teil des Textes &amp;quot;herausgeschnitten&amp;quot; werden soll.&lt;br /&gt;
&lt;br /&gt;
XX: Wird durch Zahlen ersetzt, damit man eine Übersicht hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als aller Erstes müssen wir uns unsere eigenen Attribute vorbereiten. Dies machen wir mit dem attr userattr wie folgt:&lt;br /&gt;
&lt;br /&gt;
==== UserReadings Attribut ====&lt;br /&gt;
Hier definieren wir die später benötigte Attribute:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehr zu den Attributen unter [[HTTPMOD]].&lt;br /&gt;
&lt;br /&gt;
Legen wir nun unsere weiteren Attribut an:&lt;br /&gt;
&lt;br /&gt;
==== Dauer der Reise ====&lt;br /&gt;
Die Dauer der Reise greifen wir mit den Attributen: &lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading01Name duration &lt;br /&gt;
attr Verkehr.FFM.GI reading01Regex &amp;quot;duration&amp;quot;\s*:\s*{\s*[&amp;quot;\w\s:,]+&amp;quot;value&amp;quot;\s*:\s*(\d+)\s*} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;duration&amp;quot; heißen. Darin wird die Dauer der Reise in Sekunden angegeben.&lt;br /&gt;
&lt;br /&gt;
==== Dauer der Reise mit aktuellem Verkehr ====&lt;br /&gt;
Die Dauer der Reise mit Verkehr greifen wir mit den Attributen: &lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading02Name duration_in_traffic &lt;br /&gt;
attr Verkehr.FFM.GI reading02Regex &amp;quot;duration_in_traffic&amp;quot;\s*:\s*{\s*[&amp;quot;\w\s:,]+&amp;quot;value&amp;quot;\s*:\s*(\d+)\s*}  &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;duration&amp;quot; heißen. Darin wird die Dauer der Reise in Sekunden angegeben.&lt;br /&gt;
&lt;br /&gt;
==== Entfernung ====&lt;br /&gt;
Die Entfernung greifen wir mit den Attributen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading03Name distance &lt;br /&gt;
attr Verkehr.FFM.GI reading03Regex &amp;quot;distance&amp;quot;\s*:\s*{\s*[&amp;quot;\w\s:,]+&amp;quot;value&amp;quot;\s*:\s*(\d+)\s*}   &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;distance&amp;quot; heißen und uns die Entfernung angeben.&lt;br /&gt;
&lt;br /&gt;
==== Zielort ====&lt;br /&gt;
Den Zielort greifen wir mit den Attributen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading04Name destination_addresses  &lt;br /&gt;
attr Verkehr.FFM.GI reading04Regex &amp;quot;destination_addresses&amp;quot;\s*:\s*\[\s*&amp;quot;([\w\s.,-:üöäß(\)]+)&amp;quot;\s*\]   &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;destination_addresses&amp;quot; heißen und uns den Zielort angeben.&lt;br /&gt;
&lt;br /&gt;
==== Startort ====&lt;br /&gt;
Den Startort greifen wir mit den Attributen: &lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading05Name origin_addresses  &lt;br /&gt;
attr Verkehr.FFM.GI reading05Regex &amp;quot;origin_addresses&amp;quot;\s*:\s*\[\s*&amp;quot;([\w\s.,-:üöäß(\)]+)&amp;quot;\s*\]   &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;origin_addresses&amp;quot; heißen und uns den Zielort angeben.&lt;br /&gt;
&lt;br /&gt;
==== Startort ====&lt;br /&gt;
Den Startort greifen wir mit den Attributen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI reading06Name origin_addresses  &lt;br /&gt;
attr Verkehr.FFM.GI reading06Regex &amp;quot;origin_addresses&amp;quot;\s*:\s*\[\s*&amp;quot;([\w\s.,-:üöäß(\)]+)&amp;quot;\s*\]   &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unser Reading wird später &amp;quot;origin_addresses&amp;quot; heißen und uns den Zielort angeben.&lt;br /&gt;
&lt;br /&gt;
==== Berechnung der Werte für die spätere Anzeige ====&lt;br /&gt;
Damit die Werte später User freundlich angezeigt werden, lassen wir sie von FHEM berechnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI userReadings duration_hr {strftime &amp;quot;%H:%M&amp;quot;, gmtime( int( ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration&amp;quot;,0) /60+0.5)*60 );}, duration_in_traffic_hr {strftime &amp;quot;%H:%M&amp;quot;, gmtime( int( ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration_in_traffic&amp;quot;,0) /60+0.5)*60 );}, distance_hr:distance {int( ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;distance&amp;quot;,0) /1000+0.5);}, duration_diff {int((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration_in_traffic&amp;quot;,0)-ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration&amp;quot;,0))/60+0.5);}, duration_diff_hr {my $diff=int((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration_in_traffic&amp;quot;,0)-ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;duration&amp;quot;,0))/60+0.5); return &amp;quot;+&amp;quot;.$diff if ($diff&amp;gt;0); return &amp;quot;+0&amp;quot;;} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== State Anzeige ====&lt;br /&gt;
Uns als letztes noch, wie wir das ganze in State angezeigt bekommen möchten:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Verkehr.FFM.GI stateFormat duration_hr duration_diff_hr Min. (distance_hr km) &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fertig ==&lt;br /&gt;
Fertig ist das Device, welches uns nun unseren Weg anzeigt. Natürlich könnt ihr die einzelnen Berechnungen und auch die State Anzeige für euch selbst anpassen und entsprechend ändern.&lt;br /&gt;
&lt;br /&gt;
== Anmerkung ==&lt;br /&gt;
Zwei Dinge möchte ich anmerken:&lt;br /&gt;
&lt;br /&gt;
1. Das ganze beruht auf {{Link2Forum|Topic=20151|Message=363109|LinkText=diesem}} und {{Link2Forum|Topic=20151|Message=365322|LinkText=diesem}} Beitrag. &lt;br /&gt;
&lt;br /&gt;
2. Sobald Google die Ausgabe der Website verändert, wird es vermutlich nicht mehr funktionieren. Wie ihr dem Thema im Forum entnehmen könnt, ist dies schon vorgekommen. Daher nicht wundern, sondern im Forum schauen, ob es schon eine Veränderung gibt oder selbst die Readings anpassen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:FHEM_Tablet_UI&amp;diff=14622</id>
		<title>Diskussion:FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:FHEM_Tablet_UI&amp;diff=14622"/>
		<updated>2016-03-09T14:22:12Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Widgets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sollte man nicht die Widgets alphabetisch sortieren ? &lt;br /&gt;
&lt;br /&gt;
Ich kann das gerne machen... bzw. mache das, wenn ich keinen Widerspruch höre  --[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 13:05, 6. Mai 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
Ich habe die Reihenfolge von github übernommen. Aber klar, eine alphabetische Sortierung ist durchaus sinnvoll. Dann aber auch die Beispiele entsprechend sortieren.&lt;br /&gt;
&lt;br /&gt;
:Ich setz mich mal dran .. oder willst du noch aktuell noch etwas ändern ?--[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 16:48, 7. Mai 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Sprung von der Widget-Auflistung zu den Beschreibungen ==&lt;br /&gt;
&lt;br /&gt;
... habe ich testweise mal für CIRCLEMENU gemacht ... werde ich in den nächsten Tagen für alle nachzioehgen ... und von dort dann sinnvollerweise auch zu den Beispielen ?! --[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 11:54, 14. Mai 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Update Link falsch? ==&lt;br /&gt;
&lt;br /&gt;
Müsste der Update Link zum hinzfügen nicht wie folgt heißen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ich bekomme mit dem aktuell hinterlegten Link nämlich einen Fehler&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Amenophis86|Amenophis86]] ([[Benutzer Diskussion:Amenophis86|Diskussion]]) 14:35, 16. Feb. 2016 (CET)&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
: Hallo!&lt;br /&gt;
: Ja, Link auf Wiki-Seite war falsch; controlfile-Angabe fehlt dort.&lt;br /&gt;
: Ist korrigiert.&lt;br /&gt;
: Danke, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 14:52, 16. Feb. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Deutsch / Englisch ==&lt;br /&gt;
Sollten die Texte nicht eingedeutscht werden? Inhalt ist mal deutsch mal englisch --[[Benutzer:Svenson08|Svenson08]] ([[Benutzer Diskussion:Svenson08|Diskussion]]) 06:37, 2. Mär. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Ist richtig, hat nur noch keiner gemacht. Kommt daher, dass setstate es auf seiner github Seite in Englisch hat und von dort das Meiste kopiert wurde. --[[Benutzer:Amenophis86|Amenophis86]] ([[Benutzer Diskussion:Amenophis86|Diskussion]]) 00:57, 5. Mär. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Widgets ==&lt;br /&gt;
zur besseren Lesbarkeit wäre es besser je Widget ein eigenen &amp;quot;Kapitel&amp;quot;/Überschrift in der Seite anzulegen. Es macht auch wenig Sinn die Beispiele eines Widgets am Ende der Seite einzuhängen. Verständlicher ist es Wenn die Beispiele bei dessen Erläuterung aufgeführt sind. Beispiele ohne Bilder machen wenig Sinn wenn ich ein UI erklären will. --[[Benutzer:Svenson08|Svenson08]] ([[Benutzer Diskussion:Svenson08|Diskussion]]) 19:39, 7. Mär. 2016 (CET)&lt;br /&gt;
:Da stimme ich nicht zu ... die jetzige Version mit den zusätzliche &amp;quot;Überschriften&#039; bei Label und Level ist m.E. unübersichtlicher ... aus der alphabetischen Übersicht kommt ja immer durch die Links schnell zu den Beschreibungen  und ebenfalls durch die Links zu den Beispielen ... wenn ich zu einem Widget die Argumente nachschlagen will würden m.E. die immer wieder dazwischen liegenden Beispiele eher stören --[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 23:33, 7. Mär. 2016 (CET)&lt;br /&gt;
Da diese Überschriften keine Kapitel sind ist diese Bearbeitung, Ergänzung mühselig. Das sollten zumindest Kapitel sein um das besser zu bearbeiten und in der Seiten Übersicht sind diese dann ebenfalls mit einem Blick zu sehen und man direkt von dort zum Beispiel springen. Ist eine kleinere Änderung. --[[Benutzer:Svenson08|Svenson08]] ([[Benutzer Diskussion:Svenson08|Diskussion]]) 04:54, 8. Mär. 2016 (CET)&lt;br /&gt;
Längere Artikel ohne Kapitel sind nur schwer zu Pflege, das dadurch ein index gebildet wird, besser ein Inhaltsverzeichnis halte ich sehr wohl als übersichtlicher, aber das sieht jeder anders. Aber bearbeite mal eine bestimmte stelle wenn du mehrere tausend Zeilen bis zur gesuchten Zeile scrollen musst. Diese Übersichtlichkeit ist ein Grund warum es die Funktion in jeder wiki Engine gibt.--[[Benutzer:Svenson08|Svenson08]] ([[Benutzer Diskussion:Svenson08|Diskussion]]) 04:58, 8. Mär. 2016 (CET)&lt;br /&gt;
:Ein seitlanges Inhaltsverzeichnis finde ich allerdings nicht so prickelnd ;) Ansonsten hast du ja nicht unrecht, ich habe schon mehrfach kleinere Änderungen an den Widgetbeschreibungen durchgeführt, das wäre einfacher wenn die Abschnitte kleiner wären. --[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 09:42, 8. Mär. 2016 (CET)&lt;br /&gt;
: :-) Toll, ich hab mal recht .... Spaß bei seite. Ich hab auch schon überlegt ob man den einzelnen Widgets nicht einzelne Artikel spendiert. Gibts hier im Wiki auch schon bei ähnlich ausführlicheren Dokus. Auch wenn mal (viel) mehr Beispiele zu einem Widget erfasst werden wäre das vielleicht nicht verkehrt. Hab aber keine Endgültige Meinung dazu.--[[Benutzer:Svenson08|Svenson08]] ([[Benutzer Diskussion:Svenson08|Diskussion]]) 12:25, 8. Mär. 2016 (CET) &lt;br /&gt;
:Ich finde die Idee der einzelnen Unterabschnitte, wie sie aktuell zB bei Label gemacht wurde nicht schlecht. Allerdings sollte weiterhin eine Übersichtsliste bleiben, wie sie aktuell unter &amp;quot;Widgets -- Konfiguration&amp;quot; ist. Wenn alle Widgets ein eigener Unterabschnitt ist, dann kann man auch die Beispiele direkt dort einfügen und zB Bilder hinzufügen. Allerdings sollte es dann auch nicht &amp;quot;Widgets LABEL&amp;quot; heißen, sondern &amp;quot;Widget LABEL&amp;quot;. Ist ja dann nur noch ein Widget, welches angezeigt wird ;) --[[Benutzer:Amenophis86|Amenophis86]] ([[Benutzer Diskussion:Amenophis86|Diskussion]]) 15:22, 9. Mär. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Betriff Abschnitt Vorraussetungen ==&lt;br /&gt;
Vorausgesetzt ist noch ein definierte FHEMWEB Instance, ohne das würden die Fhem Befehle nicht gesendet werden, longpoll, etc. Zwar ist das Default jeder installation, aber man sollte darauf Hinweisen. --[[Benutzer:Svenson08|Svenson08]] ([[Benutzer Diskussion:Svenson08|Diskussion]]) 05:54, 8. Mär. 2016 (CET)&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:FHEM_Tablet_UI&amp;diff=14475</id>
		<title>Diskussion:FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:FHEM_Tablet_UI&amp;diff=14475"/>
		<updated>2016-03-04T23:57:23Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Deutsch / Englisch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sollte man nicht die Widgets alphabetisch sortieren ? &lt;br /&gt;
&lt;br /&gt;
Ich kann das gerne machen... bzw. mache das, wenn ich keinen Widerspruch höre  --[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 13:05, 6. Mai 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
Ich habe die Reihenfolge von github übernommen. Aber klar, eine alphabetische Sortierung ist durchaus sinnvoll. Dann aber auch die Beispiele entsprechend sortieren.&lt;br /&gt;
&lt;br /&gt;
:Ich setz mich mal dran .. oder willst du noch aktuell noch etwas ändern ?--[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 16:48, 7. Mai 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Sprung von der Widget-Auflistung zu den Beschreibungen ==&lt;br /&gt;
&lt;br /&gt;
... habe ich testweise mal für CIRCLEMENU gemacht ... werde ich in den nächsten Tagen für alle nachzioehgen ... und von dort dann sinnvollerweise auch zu den Beispielen ?! --[[Benutzer:Nobby1805|Nobby1805]] ([[Benutzer Diskussion:Nobby1805|Diskussion]]) 11:54, 14. Mai 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Update Link falsch? ==&lt;br /&gt;
&lt;br /&gt;
Müsste der Update Link zum hinzfügen nicht wie folgt heißen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ich bekomme mit dem aktuell hinterlegten Link nämlich einen Fehler&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Amenophis86|Amenophis86]] ([[Benutzer Diskussion:Amenophis86|Diskussion]]) 14:35, 16. Feb. 2016 (CET)&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
: Hallo!&lt;br /&gt;
: Ja, Link auf Wiki-Seite war falsch; controlfile-Angabe fehlt dort.&lt;br /&gt;
: Ist korrigiert.&lt;br /&gt;
: Danke, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 14:52, 16. Feb. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Deutsch / Englisch ==&lt;br /&gt;
Sollten die Texte nicht eingedeutscht werden? Inhalt ist mal deutsch mal englisch --[[Benutzer:Svenson08|Svenson08]] ([[Benutzer Diskussion:Svenson08|Diskussion]]) 06:37, 2. Mär. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
Ist richtig, hat nur noch keiner gemacht. Kommt daher, dass setstate es auf seiner github Seite in Englisch hat und von dort das Meiste kopiert wurde. --[[Benutzer:Amenophis86|Amenophis86]] ([[Benutzer Diskussion:Amenophis86|Diskussion]]) 00:57, 5. Mär. 2016 (CET)&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14305</id>
		<title>FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14305"/>
		<updated>2016-02-20T16:07:22Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Widgets -- Konfiguration */ Fehlende Widgets hinzugefügt, Doku fehlt teilweise noch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Oberfläche für Fhem&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=34233&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=n.a.&lt;br /&gt;
|ModOwner=setstate ({{Link2FU|7023|Forum}})&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:tablet_ui.png|200px|thumb|right|Fhem Tablet UI]]&lt;br /&gt;
FHEM Tablet UI ist ein leichtgewichtiges aber funktionsreiches Framework zum Steuern und Überwachen von in Fhem integrierten Geräten. Zahlreiche Widgets können sehr flexibel und leicht per HTML Code konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird die Installation und Konfiguration des FHEM Tablet UI beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Todo|alle Widgets hier übernehmen, Übersetzung, weitere Beispiele aus dem Forum einfügen (evtl. mit Link!?)}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Dieses User Interface für Tablets benötigt &amp;lt;u&amp;gt;keine&amp;lt;/u&amp;gt; zusätzliche Frameworks, wie PHP, MySQL oder SmartVisu.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen ist nur ein Standard-Fhem mit HTTPSRV Modul und ein beliebiger Standard-Browser  mit Javascript auf einem beliebigen Betriebssystem oder Webviewcontrol.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;define TABLETUI HTTPSRV ftui/ ./www/tablet Tablet-UI&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Verzeichnis ./fhem/www/tablet die Datei index-example.html in index.html umbenennen oder eine neue index.html erzeugen und diese index.html wie nachfolgend beschrieben editieren.&lt;br /&gt;
&lt;br /&gt;
Das UI ist über den Link &amp;quot;Tablet-UI&amp;quot; auf der Fhem-Hauptseite oder durch Direktaufruf der URL &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;Fhem-url&amp;gt;:8083/fhem/tablet/index.html&amp;lt;/nowiki&amp;gt;&amp;quot; zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Hinweise zu einer manuellen Installation und weitere Infos sind auf der Projektseite https://github.com/knowthelist/fhem-tablet-ui zu finden.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update des UI durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
kann seit dem 24.12.2015 die URL zum normalen Updatebefehl von FHEM hinzugefügt werden. Mit einen &amp;quot;update check&amp;quot; sieht man dann  gleich alle Updates aus beiden &amp;quot;Welten&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Weitere Widgets ==&lt;br /&gt;
&lt;br /&gt;
=== Widgets for Fhem-tablet-ui ===&lt;br /&gt;
Zusätzlich zu den bei der Installation des Tablet UI direkt zur Verfügung stehenden Widgets, gibt es eine weitere Widget-Quelle von nesges unter https://github.com/nesges/Widgets-for-fhem-tablet-ui. Die Widgets aus dieser Quelle müssen für eine Nutzung separat installiert werden.&lt;br /&gt;
&lt;br /&gt;
Dazu folgenden Befehl in die Fhem-Befehlszeile eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/controls_widgets-for-fhem-tablet-ui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Näheres zur Installation unter [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/Installation Wiki: Installation]. &lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der einzelnen Widgets befindet sich ebenfalls [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki im Github-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration der angezeigten Widgets erfolgt in der Datei &#039;&#039;&#039;index.html&#039;&#039;&#039; im Hauptordner &#039;tablet&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metadaten-Konfiguration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Refresh sofort, alle 15 Minuten ein voller Refresh (shortpoll) statt alle 30 Sekunden ein voller Refresh&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;longpoll&amp;quot; content=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drag&amp;amp;Drop deaktivieren&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&#039;gridster_disable&#039; content=&#039;1&#039;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Toast messages deaktivieren&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&#039;toast&#039; content=&#039;1&#039;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größe des Basis-Rasters (data-sizey=1/data-sizex=1)&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_base_width&amp;quot; content=&amp;quot;116&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_base_height&amp;quot; content=&amp;quot;131&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abstände der Gridsterelemente verkleinern:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_margin&amp;quot; content=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Link sollte auskommentiert werden, solange es diese Datei noch nicht gibt, da diese immer wieder zu Problemen beim Laden der Seite führen kann:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/css/fhem-tablet-ui-user.css&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Layout und das Aussehen des UI kann durch die Klassen-Attribute beeinflusst werden. Verfügbare Klassen sind:&lt;br /&gt;
&lt;br /&gt;
container, left, right, cell, narrow, darker, big, bigger, small&lt;br /&gt;
&lt;br /&gt;
== Farbe ==&lt;br /&gt;
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form oder als RGB-Wert anzugeben. Zum Beispiel: Hex: #A3CFA3 RBG: rgb(163, 207, 163).&lt;br /&gt;
&lt;br /&gt;
Knallige Farben wie #ff0000 für Rot oder #00ff00 für Grün sollten vermieden werden. Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.&lt;br /&gt;
&lt;br /&gt;
Hilfreich bei der Suche nach den Farbwerten ist der color picker: http://www.w3schools.com/tags/ref_colorpicker.asp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CSS Class description ==&lt;br /&gt;
&lt;br /&gt;
Not all widgets support all classes&lt;br /&gt;
&lt;br /&gt;
* readonly : changing of state is not allowed&lt;br /&gt;
* wider : 25px extra space for the widget to the top&lt;br /&gt;
* narrow : shorter distant to the widget above&lt;br /&gt;
* w1x, w2x, w3x : set the widget to a fix width: 1x, 2x, 3x width&lt;br /&gt;
* mini : lowest diameter for volume widget&lt;br /&gt;
* small : font 80% size (label), small diameter for volume widget&lt;br /&gt;
* medium : font 120% size&lt;br /&gt;
* large : font 150% size&lt;br /&gt;
* big : font 200% size&lt;br /&gt;
* bigplus : font 270% size&lt;br /&gt;
* bigger : font 320% size&lt;br /&gt;
* bigger.thin : font 450% size&lt;br /&gt;
* grande : font 600% size&lt;br /&gt;
* gigantic: font 144px size + 120px line-height&lt;br /&gt;
* thin : font thin&lt;br /&gt;
* darker : forecolor in gray&lt;br /&gt;
* hue-tick : draw ticks in color range&lt;br /&gt;
* hue-front : draw handle in color range&lt;br /&gt;
* hue-back : draw background in color range&lt;br /&gt;
* dim-tick : draw ticks in brightness range&lt;br /&gt;
* dim-front : draw handle in brightness range&lt;br /&gt;
* dim-back : draw background in brightness range&lt;br /&gt;
* red : foreground color red&lt;br /&gt;
* green : foreground color green&lt;br /&gt;
* blue : foreground color blue&lt;br /&gt;
* doublebox-v : container to place 2 small widgets (e.g. switch) one above the other&lt;br /&gt;
* doublebox-h : container to place 2 small widgets (e.g. switch) side by side&lt;br /&gt;
* timestamp : deliver the date time for the reading instead the value&lt;br /&gt;
* inline : positioning elements in a row, no line break&lt;br /&gt;
* top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
* left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
* right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
* blink : blink animatation for label or symbol widget&lt;br /&gt;
* verticalLine : Vertikale Line am rechten Rand&lt;br /&gt;
&lt;br /&gt;
== Positioning ==&lt;br /&gt;
&lt;br /&gt;
*container : new box or new row&lt;br /&gt;
*col-x-y : new column with x/y of width (col-1-3,col-2-3,col-1-2,col-1-4,col-1-8,col-1-5,col-2-5,col-3-5,col-4-5)&lt;br /&gt;
*inline : positioning elements in a row, no line break&lt;br /&gt;
*top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
*left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
*right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
*top-narrow : -15px closer on top (top-narrow-2x -&amp;gt; -30px; top-narrow-10 -&amp;gt; -10px)&lt;br /&gt;
*centered : horizontal centered&lt;br /&gt;
*left-align : align text left&lt;br /&gt;
*right-align : align text right&lt;br /&gt;
*wider : 15px extra space for the widget all around&lt;br /&gt;
*narrow : shorter distant to the widget above&lt;br /&gt;
*fullsize : 100% in width and height&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Teilweise dokumentierte Widgets:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/button button]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen Fhem-Befehl absetzen kann.&lt;br /&gt;
* [[#chart|chart]]: chart with similar capabilities as the FHEM plots &lt;br /&gt;
* checkbox:&lt;br /&gt;
* [[#circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des &#039;circle&#039; im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clicksound clicksound]: Mit dem Widget &amp;quot;clicksound&amp;quot; können Sounds an Click-Events von Elementen gebunden werden. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clock clock]: Das Widget &amp;quot;clock&amp;quot; stellt eine einfach Uhr zur verfügung.&lt;br /&gt;
* colorwheel:&lt;br /&gt;
* daytimepicker:&lt;br /&gt;
* departure:&lt;br /&gt;
* [[#dimmer|dimmer]]: toogle button with a setter for on value&lt;br /&gt;
* eventmonitor:&lt;br /&gt;
* highchart:&lt;br /&gt;
* [[#homestatus|homestatus]]: selector for 4 states (1=home, 2=night, 3=away, 4=holiday)&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/iframe iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe. &lt;br /&gt;
* [[#image|image]]: insert an image, the URL is given by a reading&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/klimatrend klimatrend]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.&lt;br /&gt;
* [[#label|label]]: ein state als Text anzeigen (Farbe einstellbar)&lt;br /&gt;
* [[#level|level]]: vertical/horizontal bar to show values between min/max value&lt;br /&gt;
* link:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/multistatebutton multistatebutton]: Variante des push-Widgets das den set-Befehl abhängig vom gelesenen Status ändert.&lt;br /&gt;
* [[#pagetab|pagetab]]: Element to smoothly exchange the whole page with another page&lt;br /&gt;
* pagebutton:&lt;br /&gt;
* [[#playstream|playstream]]: Abspielen eines Webradio-Streams per Button&lt;br /&gt;
* [[#popup|popup]]: a popup dialog which open on click on another widget &lt;br /&gt;
* [[#progress|progress]]: round symbolic display for percent values&lt;br /&gt;
* [[#push|push]]: send any command to Fhem e.g. up / down&lt;br /&gt;
* range:&lt;br /&gt;
* readingsgroup:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads&lt;br /&gt;
* [[#rotor|rotor]]: Umschalten von zwei oder mehr Widgets an einer Position&lt;br /&gt;
* [[#select|select]]: Combobox to provide a list for selection&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: zum anzeigen und einstellen einer Uhrzeit.&lt;br /&gt;
* [[#simplechart|simplechart]]: simple XY line chart for one value (reads directly from Fhem log file) &lt;br /&gt;
* [[#slider|slider]]: vertical slider to select between min/max value&lt;br /&gt;
* spinner:&lt;br /&gt;
* swiper:&lt;br /&gt;
* [[#switch|switch]]: Toggle any command to Fhem (e.g. on / off)&lt;br /&gt;
* [[#symbol|symbol]]: State als Symbol darstellen (z.B. Fenster offen)&lt;br /&gt;
* [[#thermostat|thermostat]]: dial for heater thermostates to set desired value and show current value&lt;br /&gt;
* [[#volume|volume]]: dial to set a single value (e.g. 0-60)&lt;br /&gt;
* [[#weather|weather]]: insert an icon or image, represending a weather literal&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/wind_direction wind_direction]: Zeigt die Windrichtung auf einer Windrose an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Demo der Widgets findet ihr [http://knowthelist.github.io/fhem/tablet/demo_widgets.html Hier].&lt;br /&gt;
----------------------------------&lt;br /&gt;
&lt;br /&gt;
Für alle Widgets gilt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+allgemeine Attribute&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-type&lt;br /&gt;
|Widget-Typ&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-device&lt;br /&gt;
|Fhem-Name des Gerätes (mit dem Befehl &#039;list&#039; bekommt man im Fhem die kpl. Liste)&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|CSS-Klassen für Aussehen und Formatierung des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;chart&amp;quot;&amp;gt;&#039;&#039;&#039;CHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung) or array of names if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log) or or array of names if more than one graph shall be displayed&lt;br /&gt;
|&#039;-&#039; or omitting this data means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;) or or array of columnspecs if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-style&lt;br /&gt;
|name of the graph style to be used (e.g. &#039;SVGplot l0&#039; or &#039;ftui l0dash&#039;) or or array of styles if more than one graph shall be displayed using different stlyes. The standard fhem plot styles can be used furthermore there are some more predefined styles existing (details see css file). Own styles can be specified e.g. in the fhem-table-ui-user.css file.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ptype&lt;br /&gt;
|name of the plot type (e.g. &#039;lines&#039; or &#039;fa-cog&#039;) or or array of plottypes if more than one graph shall be displayed. All fhem plot styles are supported. Additionally it is possible to specify symbols (currently supported are font awesome (&#039;fa-...&#039;), open automation (&#039;oa-...&#039;) and fhem symbols (&#039;fs-...&#039;))&lt;br /&gt;
|&#039;lines&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-uaxis&lt;br /&gt;
|name of the axis to be used (&#039;primary&#039; or &#039;secondary&#039;) or or array of axis&#039; to be used if more than one graph shall be displayed. The &#039;primary&#039; axis is labelled on the left side, the &#039;secondary&#039; axis is labelled on the right side&lt;br /&gt;
|&#039;primary&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-legend&lt;br /&gt;
|caption of the graph (used in the legend and at the cursor) or an array of legend texts if more than one graph shall be displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue_sec&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue_sec&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines (related to primary axis). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically.&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick lines (in minutes). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_start&lt;br /&gt;
|number of days back from now for the start of the plot (0 means the plot starts from today 0:00). Additionally the x-axis start value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_end&lt;br /&gt;
|number of days back from now for the end of the plot (-1 means the plot ends today 24:00). Additionally the x-axis end value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|-1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-nofulldays&lt;br /&gt;
|switch to activate/deactivate rounding of the xaxis start and end values to full days (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext&lt;br /&gt;
|text to be shown besides the primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext_sec&lt;br /&gt;
|text to be shown besides the secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks for primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-crosshair&lt;br /&gt;
|switch to activate/deactivate the crosshair cursor (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cursorgroup&lt;br /&gt;
|number to define coupling of the crosshair cursor. The cursors of all charts having the same number are coupled and move together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-scrollgroup&lt;br /&gt;
|number to define coupling of the scrolling (shift and zoom). All charts having the same number are scrolled (shifted and zoomed) together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-showlegend&lt;br /&gt;
|switch to activate/deactivate the initial display of the legend window (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit_sec&lt;br /&gt;
|unit of the value to show beside of each Y ticks for secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixed size for width (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixed size for height (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks, nobuttons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; can be omitted in this case the default value &amp;quot;-&amp;quot; will be used. This means that the current logfile is going to be used.&lt;br /&gt;
&lt;br /&gt;
There are several buttons that control the dynamic behaviour of the chart. The &amp;lt;-, -&amp;gt;, + and - buttons shift and zoom the displayed data. The &amp;quot;legend&amp;quot; and &amp;quot;cursor&amp;quot; buttons are switching on and off the display of the legend window and the crosshair cursor respectively.&lt;br /&gt;
&lt;br /&gt;
When the legend window is displayed, a click on the legend text shows/hides the respective graph. The legend window can be dragged to other positions on desktop browsers (currently not yet working for iOS and Android).&lt;br /&gt;
&lt;br /&gt;
The crosshair cursor currently only works dynamically on desktop browsers. On iOS and Android you have to tap on the screen to set the cursor to a new position.&lt;br /&gt;
&lt;br /&gt;
There is a number of css styles that control the visible appearance of the chart. The following classes are supported:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!CSS class name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
!.chart-background&lt;br /&gt;
|Color etc. for the chart background&lt;br /&gt;
|-&lt;br /&gt;
!.text.axes&lt;br /&gt;
|Font and color for the chart axes&lt;br /&gt;
|-&lt;br /&gt;
!.buttons&lt;br /&gt;
|Size and color for the buttons (shift etc.)&lt;br /&gt;
|-&lt;br /&gt;
!.gridlines&lt;br /&gt;
|Size and color for gridlines generally&lt;br /&gt;
|-&lt;br /&gt;
!.xaxis&lt;br /&gt;
|Font, size and color for xaxis&lt;br /&gt;
|-&lt;br /&gt;
!.yaxis&lt;br /&gt;
|Font, size and color for yaxis&lt;br /&gt;
|-&lt;br /&gt;
!.xticks&lt;br /&gt;
|Font, size and color for xticks&lt;br /&gt;
|-&lt;br /&gt;
!.yticks&lt;br /&gt;
|Font, size and color for yticks&lt;br /&gt;
|-&lt;br /&gt;
!.crosshair&lt;br /&gt;
|Font, size and color (foreground/background) for the crosshair cursor&lt;br /&gt;
|-&lt;br /&gt;
!.caption&lt;br /&gt;
|Font, size and color for text buttons for legend and cursor switching&lt;br /&gt;
|-&lt;br /&gt;
!.legend&lt;br /&gt;
|Font, size and background color for legend window&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_chart|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;CIRCLEMENU&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-item-diameter&lt;br /&gt;
|diameter of the circle&lt;br /&gt;
|52&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-circle-radius&lt;br /&gt;
|radius of each item, in pixel&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-direction&lt;br /&gt;
|position of the items in relation to the center&lt;br /&gt;
|&#039;full&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-close-after&lt;br /&gt;
|closing time of the circle-menu&lt;br /&gt;
|(item-count + 1s) or a minimum of 4s&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|keepopen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Optionen für data-direction: top | right | bottom | left | top-right | top-left | bottom-right | bottom-left | top-half | right-half | bottom-half | left-half | full | vertical | horizontal&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_circlemenu|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;DIMMER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|(&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value for ON status to set&lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|value for OFF status to set&lt;br /&gt;
|value of data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-dim&lt;br /&gt;
|name of the reading responsible for dim (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|fa-lightbulb-o&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_dimmer|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;HOMESTATUS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|array of fix names to show only in the UI as an alias to the real states&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the data-get-on array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-version&lt;br /&gt;
|name of the status model e.g. &#039;residents&#039;,&#039;roommate&#039;,&#039;guest&#039; &lt;br /&gt;
|(default NULL)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default version has 4 states: &#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039; The default aliases are &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;; data-version=&#039;residents&#039; or &#039;roommate&#039; or &#039;guest&#039; has 5 states (&#039;home&#039;,&#039;asleep&#039;,&#039;absent&#039;,&#039;gone&#039;,&#039;gotosleep&#039;) They have these aliases &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;,&#039;Retire&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_homestatus|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;image&amp;quot;&amp;gt;&#039;&#039;&#039;IMAGE&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get an URL from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-size&lt;br /&gt;
|width of the image in px or %, the height scales proportionally&lt;br /&gt;
|50%&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the image to show (use data-url or data-device + data-get, not both)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-refresh&lt;br /&gt;
|Interval in seconds for image refresh for usage together with data-url&lt;br /&gt;
|900&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_image|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;label&amp;quot;&amp;gt;&#039;&#039;&#039;LABEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fix&lt;br /&gt;
|keeping a specified number of decimals. &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; non-numeric&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-part&lt;br /&gt;
|split position of the space separated value to show or an RegEx&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-get&lt;br /&gt;
|name of the DEVICE:Reading to colorize the label &lt;br /&gt;
|data-device:data-get&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|an array of numeric values to affect the colour of the Label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-part&lt;br /&gt;
|part number of the space separated value to show or a RegEx &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; all&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-unit&lt;br /&gt;
|add a unit after a numeric value. use encoded strings e.g. &amp;quot;%B0C%0A&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-substitution&lt;br /&gt;
|regex-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|small, large, big, bigger, thin, red, green, blue, darker, timestamp, w1x, w2x, w3x, fixedlabel, icon, bg-limit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit der Class &#039;fixedlabel&#039; kann man Label einbauen, die einen festen Text (direkt im HTML) haben, aber trotzdem die Farbe per Reading Value beeinflusst werden könnte.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;icon&#039; kann man Label einbauen, die wie Icons aussehen. Als Hintergrund gibt es &#039;icon round&#039; (rund), &#039;icon square&#039; (Rechteck mit abgerundeten Ecken) und &#039;icon squareborder&#039; (Rechteck mit abgerundeten Ecken und einem zusätzlichen Rand).&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;bg-limit&#039; wird der Hintergrund des Icon auf grün oder rot gesetzt, passend zum on/off Status des data-limits.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_label|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;level&amp;quot;&amp;gt;&#039;&#039;&#039;LEVEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|&#039;0&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|&#039;100&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|a array of numeric or RegEx values to affect the colour of the label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|mini, horizontal&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_level|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;PAGETAB&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the new page to show&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&#039;fa-power-off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|color of OFF state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|color of Off state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|array of status to assign a special icon-list from data-icons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the a data-get-on array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|warn, activate (as additionals for data-icons)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_pagetab|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;playstream&amp;quot;&amp;gt;&#039;&#039;&#039;PLAYSTREAM&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL des Radio-Streams&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the control state from FHEM&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for PLAY status to get. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for STOP status to get. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-volume&lt;br /&gt;
|name of the reading to get the volume value (0-100) &lt;br /&gt;
|volume&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_playstream|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;popup&amp;quot;&amp;gt;&#039;&#039;&#039;POPUP&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading where to get the alert value from&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value which trigger to open the dialog&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value which trigger to close the dialog &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_popup|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;progress&amp;quot;&amp;gt;&#039;&#039;&#039;PROGRESS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set or name of the reading which helds the max value&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|novalue, percent&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_progress|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;push&amp;quot;&amp;gt;&#039;&#039;&#039;PUSH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
| name of the reading to set on FHEM (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value to send when the the button get pressed oder ein Array zwischen dessen Werten umgeschaltet werden kann&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-doubleclick&lt;br /&gt;
|timeout to wait for a second click or touch. &#039;0&#039; disables the doubleclick feature. &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-countdown&lt;br /&gt;
|secondes for the countdown progress control &lt;br /&gt;
|autodetect from &#039;on-for-timer&#039; command&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|fix color attribute for OFF state or DEVICE:READING for dynamic setting &lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|fix color attribute for Off state or DEVICE:READING for dynamic setting&lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_push|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;rotor&amp;quot;&amp;gt;&#039;&#039;&#039;ROTOR&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; | data-delay&lt;br /&gt;
|time in millisecondes to wait until next list item get shown&lt;br /&gt;
|3500&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fade, rotate&lt;br /&gt;
|&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Ohne Angabe von class erfolgt keine Animation.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_rotor|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;select&amp;quot;&amp;gt;&#039;&#039;&#039;SELECT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading that get the selected item of the list&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|name of the reading to set on Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-list&lt;br /&gt;
|name of the reading to get a :-separated list from Fhem&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-items&lt;br /&gt;
|an array of fix items to show in the selection box (alternative if data-list is empty)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|an array of fix names to show only in the selection box as an alias to the real items&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command to send to Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-quote&lt;br /&gt;
|characters to enclose the send value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|wider, w1x, w2x, w3x, large, big&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_select|Link zu einem Beispiel]]&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;simplechart&amp;quot;&amp;gt;&#039;&#039;&#039;SIMPLECHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log)&lt;br /&gt;
|&#039;-&#039; means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY &lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY &lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick line (in Minuten)&lt;br /&gt;
|360 minutes&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago&lt;br /&gt;
|number of days back from now &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-caption&lt;br /&gt;
|name of the chart to show as text &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_simplechart|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; kann man auch weglassen, dann greift der Defaultwert &amp;quot;-&amp;quot;. Damit wird das neuste Logfile gelesen.&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;slider&amp;quot;&amp;gt;&#039;&#039;&#039;SLIDER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-value&lt;br /&gt;
|wenn true wird beim sliden der Wert angezeigt&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|width for horizontal sliders&lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|height for vertical sliders &lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|Aussehen/Ausrichtung&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für class steht mini, horizontal und negated (0 liegt oben) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_slider|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;switch&amp;quot;&amp;gt;&#039;&#039;&#039;SWITCH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert, bei dem zum Status ON geschaltet werden soll. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert, bei dem zum Status OFF geschaltet werden soll. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf ON geschaltet wurde  &lt;br /&gt;
|Wert von data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf OFF geschaltet wurde &lt;br /&gt;
|Wert von data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|Kommando Name (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) &amp;lt;br /&amp;gt;(z.B setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des Font-Awesome Icon. &lt;br /&gt;
|&#039;fa-lightbulb-o&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Name des Font-Awesome Hintergrund Icon. &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Widget Farbe beim Status ON &lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Widget Farbe beim Status OFF &lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-get-on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;data-get-off&amp;lt;/code&amp;gt; accept also RegEx values. e.g. data-get-on=&amp;quot;[0-9]{1,3}|on&amp;quot; means set switch on if STATE is a numeric value or &#039;on&#039;. data-get-off=&amp;quot;!on&amp;quot; means accept all but the data-get-on value (negation)&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_switch|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;symbol&amp;quot;&amp;gt;&#039;&#039;&#039;SYMBOL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dual state notation&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get. &lt;br /&gt;
|&#039;open&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get. &lt;br /&gt;
|&#039;closed&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des font-awesome-Symbols  &lt;br /&gt;
|&#039;ftui-window&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Hintergrundsymbol&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
multi state notation&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-states&lt;br /&gt;
|array of states. &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|array of colors related to the data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-colors&lt;br /&gt;
|array of background-colors related to the data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
data-get-on,data-get-off and data-states accept also RegEx values. The value for one icon can also contain an additional animatation CSS name, e.g. &amp;quot;fa-exclamation-triangle fa-blink&amp;quot; for a blinking Symbol&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_symbol|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;THERMOSTAT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-temp&lt;br /&gt;
|reading for measured temperature of thermostates&lt;br /&gt;
|&#039;measured-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-valve&lt;br /&gt;
|reading for valve position of thermostates&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minColor&lt;br /&gt;
|Farbe des Keises für Min&lt;br /&gt;
| #4477FF&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxColor&lt;br /&gt;
|Farbe des Kreises für Max, zwischen Min und Max wird linear interpoliert &lt;br /&gt;
| #FF0000&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-step&lt;br /&gt;
|step size for value adjustment e.g. 0.5 &lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-bgColor&lt;br /&gt;
|Die Farbe der Kreises zwischen den ticks&lt;br /&gt;
|&#039;transparent&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fgColor&lt;br /&gt;
|Die Farbe der zahl im Kreismittelpunkt&lt;br /&gt;
|#bbbbbb&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-tkColor&lt;br /&gt;
|Die Farbe der ticks&lt;br /&gt;
|#696969&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleOffset&lt;br /&gt;
|Start der ticks im Kreis (in Winkelgraden, 0 = oben)&lt;br /&gt;
| -120&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleArc&lt;br /&gt;
|Bereich der ticks im Kreis (in Winkelgraden)&lt;br /&gt;
|240&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|big, readonly&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_thermostat|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;volume&amp;quot;&amp;gt;&#039;&#039;&#039;VOLUME&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem &lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;rigth&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|small, hue-tick, hue-front, hue-back, dim-tick ,dim-front, dim-back&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_volume|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;weather&amp;quot;&amp;gt;&#039;&#039;&#039;WEATHER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the weather literal from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-imageset&lt;br /&gt;
|collection of images to display current weather situation. Possible values: &#039;meteocons&#039;, &#039;kleinklima&#039;&lt;br /&gt;
|&#039;meteocons&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-image-path&lt;br /&gt;
|path to the images of the selected imageset&lt;br /&gt;
|/images/weather/&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_weather|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Beispiele ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_chart&amp;quot;&amp;gt;&#039;&#039;&#039;Chart&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display a chart with similar capabilities as the FHEM plots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;normal&amp;quot;&amp;gt;&lt;br /&gt;
	data-type=&amp;quot;chart&amp;quot;&lt;br /&gt;
	data-logdevice=&#039;[&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Predicted&amp;quot;]&#039;&lt;br /&gt;
	data-columnspec=&#039;[&amp;quot;4:Garden.T:15:&amp;quot;,&amp;quot;10:Garden.T:0:delta-h&amp;quot;,&amp;quot;10:Garden.T:0:delta-d&amp;quot;,&amp;quot;4:predicted.*:15:&amp;quot;]&#039;&lt;br /&gt;
	data-style=&#039;[&amp;quot;ftui l0fill&amp;quot;,&amp;quot;ftui l1fill&amp;quot;,&amp;quot;ftui l2&amp;quot;,&amp;quot;ftui l3dot&amp;quot;]&#039;&lt;br /&gt;
	data-ptype=&#039;[&amp;quot;lines&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;cubic&amp;quot;]&#039;&lt;br /&gt;
	data-uaxis=&#039;[&amp;quot;primary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;primary&amp;quot;]&#039;&lt;br /&gt;
	data-legend=&#039;[&amp;quot;Temperature&amp;quot;,&amp;quot;Rain/hour&amp;quot;,&amp;quot;Rain/day&amp;quot;,&amp;quot;Predicted Temp.&amp;quot;]&#039;&lt;br /&gt;
	data-yunit=&amp;quot;°C&amp;quot;&lt;br /&gt;
	data-ytext=&amp;quot;Temperature&amp;quot;&lt;br /&gt;
	data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-yunit_sec=&amp;quot;mm&amp;quot;&lt;br /&gt;
	data-ytext_sec=&amp;quot;Rain (mm)&amp;quot;&lt;br /&gt;
	data-height=&amp;quot;250&amp;quot;&lt;br /&gt;
	data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
	data-daysago_start=&amp;quot;2013-08-13T00:00:00&amp;quot;&lt;br /&gt;
	data-daysago_end=&amp;quot;2013-08-14T00:00:00&amp;quot;&lt;br /&gt;
	data-cursorgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-scrollgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-xticks=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:chart_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;Circlemenu&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cover a lot of other button behind one single button&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;circlemenu&amp;quot; class=&amp;quot;cell circlemenu&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-icon=&amp;quot;fa-wrench&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -6&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-6&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -2&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level 0&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;0&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +3&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +9&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +C&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;12&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Woofer&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:circlemenu_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;Dimmer&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget Beispiel für Philips Hue&lt;br /&gt;
&lt;br /&gt;
Minimalvariante&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;!off&amp;quot; data-get-off=&amp;quot;off&amp;quot;&lt;br /&gt;
        data-set=&amp;quot;pct&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Anzeige der Dimstufe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
       data-get=&amp;quot;onoff&amp;quot;&lt;br /&gt;
       data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
       data-set=&amp;quot;&amp;quot;&lt;br /&gt;
       data-set-on=&amp;quot;on&amp;quot; data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
       data-dim=&amp;quot;pct&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget für MilightDevice&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot;&lt;br /&gt;
  data-device=&amp;quot;SonstWas&amp;quot;&lt;br /&gt;
  data-get=&amp;quot;brightness&amp;quot;&lt;br /&gt;
  data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-get-on=&amp;quot;[1-9][0-9]*&amp;quot;&lt;br /&gt;
  data-set-on=&amp;quot;on&amp;quot;&lt;br /&gt;
  data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
  data-dim=&amp;quot;dim&amp;quot;&lt;br /&gt;
  data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-max=&amp;quot;100&amp;quot;&lt;br /&gt;
&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;Homestatus&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel rechts im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
       data-get-on=&#039;[&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;]&#039;&lt;br /&gt;
       data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;]&#039;&lt;br /&gt;
       data-icons=&#039;[&amp;quot;fa-home&amp;quot;,&amp;quot;fa-bed&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-suitcase&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel links im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-get-on=&#039;[&amp;quot;home&amp;quot;,&amp;quot;asleep&amp;quot;,&amp;quot;absent&amp;quot;,&amp;quot;gone&amp;quot;,&amp;quot;gotosleep&amp;quot;]&#039;&lt;br /&gt;
        data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;,&amp;quot;Retire&amp;quot;]&#039;&lt;br /&gt;
        data-icons=&#039;[&amp;quot;fa-fire&amp;quot;,&amp;quot;fa-film&amp;quot;,&amp;quot;fa-plus&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-tint&amp;quot;]&#039;&lt;br /&gt;
        data-version=&#039;residents&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:homestatus_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_image&amp;quot;&amp;gt;&#039;&#039;&#039;Image&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erzeugt ein Widget mit einem Bild aus dem www, das alle 5 Sekunden aktualisiert wird (hier eine Wetterkarte vom DWD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot;&lt;br /&gt;
     data-size=&amp;quot;80%&amp;quot;&lt;br /&gt;
     data-url=&amp;quot;http://www.dwd.de/wundk/wetter/de/Deutschland.jpg&amp;quot;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:image_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for how to add an image to the dashboard which its URL is delivered by a Fhem module like PROPLANTA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot; data-device=&amp;quot;Wetter1&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDayIcon&amp;quot; &lt;br /&gt;
     data-size=&amp;quot;40px&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_label&amp;quot;&amp;gt;&#039;&#039;&#039;Label&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
STATE   T: 20.0 H: 61&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;2&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; data-part=&amp;quot;4&amp;quot; &lt;br /&gt;
     data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But the same result can reached by getting single readings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
humidity    58&lt;br /&gt;
temperature 20.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;temperature&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;humidity&amp;quot; data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to influence the color of the label according to value limits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;OutTemp&amp;quot; &lt;br /&gt;
     data-limits=&#039;[-73,10,23]&#039; &lt;br /&gt;
     data-colors=&#039;[&amp;quot;#6699FF&amp;quot;,&amp;quot;#AA6900&amp;quot;,&amp;quot;#FF0000&amp;quot;]&#039; &lt;br /&gt;
     data-unit=&amp;quot;%B0C%0A&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a widget for shutter via push: show state and set up/down&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;wzRollo&amp;quot; &lt;br /&gt;
     data-get-on=&amp;quot;up&amp;quot; &lt;br /&gt;
     data-get-off=&amp;quot;down&amp;quot; &lt;br /&gt;
     data-icon=&amp;quot;fa-bars&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;Rollo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a label for a time value in short format with usage of RegEx.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;(\d\d\.\d\d\.).*&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to show two labels in one line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunrise&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;bis&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunset&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des UV-Indexes und der Abhängigkeit der anzuzeigenden Farbe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc0_uv&amp;quot;&lt;br /&gt;
        data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot; &lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc0_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc1_uv&amp;quot;&lt;br /&gt;
	data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot;&lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc1_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:label_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des Labels als Icon.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon round bg-red cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon square bg-blue cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon squareborder cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;PowerAV_Sw&amp;quot; data-colors=&#039;[&amp;quot;red&amp;quot;,&amp;quot;green&amp;quot;]&#039; data-limits=&#039;[&amp;quot;off&amp;quot;,&amp;quot;on&amp;quot;]&#039; class=&amp;quot;icon round bg-limit cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Label_tabletUI_icon.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;Pagetab&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tab menu to switch smoothly between multiple pages. Multiple pagetabs in a template file: menu.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt;MENU&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index.html&amp;quot;  data-icon=&amp;quot;fa-home&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_2.html&amp;quot; data-icon=&amp;quot;fa-sliders&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_3.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_4.html&amp;quot; data-icon=&amp;quot;fa-hotel&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_5.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_6.html&amp;quot; data-icon=&amp;quot;fa-database&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_7.html&amp;quot; data-icon=&amp;quot;fa-fax&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_playstream&amp;quot;&amp;gt;&#039;&#039;&#039;Playstream&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt einen Knopf zum direkten Abspielen eines Webradio-Streams.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;playstream&amp;quot; data-url=&amp;quot;http://radioeins.de/stream&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Radio eins&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_push&amp;quot;&amp;gt;&#039;&#039;&#039;Push&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a push button widget to trigger all devices on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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=&amp;quot;on&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei horizontale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei quadratische vertikale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_rotor&amp;quot;&amp;gt;&#039;&#039;&#039;Rotor&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a rotor widget, which switches between to days of weather forecast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;rotor&amp;quot; class=&amp;quot;fade&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Heute&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Morgen&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_select&amp;quot;&amp;gt;&#039;&#039;&#039;Select&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt zwei Comboboxen zur Auswahl des Eingang eines 2-Zonen-AV-Receivers. Die Liste für Zone2 ist fest, die Liste für Zone1 wird von Fhem übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell wider&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline wider&amp;quot;&amp;gt;Zone2&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiverZ2&amp;quot; data-items=&#039;[&amp;quot;Airplay&amp;quot;,&amp;quot;Webradio&amp;quot;,&amp;quot;BD/DVD&amp;quot;,&amp;quot;PHONO&amp;quot;]&#039; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;Zone1&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-list=&amp;quot;inputs&amp;quot; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:select_tabeltUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_slider&amp;quot;&amp;gt;&#039;&#039;&#039;Slider&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slider mit einstellbaren Werten von 10 bis 90:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot; &lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;10&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;90&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Light1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Horizontal angeordneter Slider:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;0&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;100&amp;quot; &lt;br /&gt;
     class=&amp;quot;horizontal&amp;quot; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_switch&amp;quot;&amp;gt;&#039;&#039;&#039;Switch&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schalter. Usage of RegEx pattern for state request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; class=&amp;quot;cell&amp;quot; &lt;br /&gt;
            data-device=&amp;quot;MILIGHT_Zone1_Wohnzimmer&amp;quot; &lt;br /&gt;
            data-get-on=&amp;quot;on.*&amp;quot;&lt;br /&gt;
            data-get-off=&amp;quot;off&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine Gruppe von Schaltern, um zwischen vier verschiedenen Werten eines device umzuschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell left&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert1).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert1&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert1&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert2).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert2&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert2&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert3).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert3&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert3&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert4).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert4&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert4&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_symbol&amp;quot;&amp;gt;&#039;&#039;&#039;Symbol&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;wert1&amp;quot;,&amp;quot;wert2&amp;quot;,&amp;quot;wert3&amp;quot;]&#039; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-arrow-up&amp;quot;,&amp;quot;fa-user&amp;quot;,&amp;quot;fa-arrow-down&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;SeaGreen&amp;quot;,&amp;quot;SlateBlue&amp;quot;,&amp;quot;IndianRed&amp;quot;]&#039; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon with blink and spin animation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-exclamation-triangle fa-blink&amp;quot;,&amp;quot;fa-exclamation-circle&amp;quot;,&amp;quot;fa-cog fa-spin&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;Crimson&amp;quot;,&amp;quot;GoldenRod&amp;quot;,&amp;quot;SeaGreen&amp;quot;]&#039; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;Wert1&amp;quot;,&amp;quot;Wert2&amp;quot;,&amp;quot;Wert3&amp;quot;]&#039; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with RegEx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
     data-icons=&#039;[&amp;quot;oa-measure_battery_100&amp;quot;,&amp;quot;oa-measure_battery_75&amp;quot;,&amp;quot;oa-measure_battery_50&amp;quot;,&amp;quot;oa-measure_battery_25&amp;quot;,&amp;quot;oa-measure_battery_0&amp;quot;]&#039;&lt;br /&gt;
     data-get-on=&#039;[&amp;quot;3\\.[0-9]&amp;quot;,&amp;quot;2\\.[789]&amp;quot;,&amp;quot;2\\.[456]&amp;quot;,&amp;quot;2\\.[123]&amp;quot;,&amp;quot;((2\\.0)|([01]\\.[0-9]))&amp;quot;]&#039;&lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with greater-equal compare and 90° rotated symbols&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
    data-icons=&#039;[&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_25 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_50 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_75 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;]&#039;&lt;br /&gt;
    data-get-on=&#039;[&amp;quot;0&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;2.4&amp;quot;,&amp;quot;2.7&amp;quot;,&amp;quot;3.0&amp;quot;]&#039;&lt;br /&gt;
    data-on-colors=&#039;[&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;Thermostat&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure as data-device=&#039;...&#039; that item which delivers temp and desired-temp as reading.&lt;br /&gt;
&lt;br /&gt;
Default parameters are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data-get=&amp;quot;desired-temp&amp;quot; data-temp=&amp;quot;measured-temp&amp;quot; data-set=&amp;quot;desired-temp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefor for HomaMatic HM-CC-RT-DN this is sufficient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&#039;KH_Clima&#039; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The long format looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;KH_Clima&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;desired-temp&amp;quot; &lt;br /&gt;
     data-temp=&amp;quot;measured-temp&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for MAX!:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&amp;quot;HZ_Tuer&amp;quot; &lt;br /&gt;
    data-valve=&amp;quot;valveposition&amp;quot; &lt;br /&gt;
    data-get=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    data-temp=&amp;quot;temperature&amp;quot; &lt;br /&gt;
    data-set=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The wigets will show the valve value only in case of a valid data-valve attribute. The default for data-valve ist null. That means, a empty data-valve attribute hides the valve label for the widget.&lt;br /&gt;
&lt;br /&gt;
[[Datei:thermostat.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_weather&amp;quot;&amp;gt;&#039;&#039;&#039;Weather&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Widget fügt ein dem Wetter entsprechendes Bild ein. Die Daten können durch Fhem-Module wie [[PROPLANTA]], [[OPENWEATHER]] und [[Weather]] bereitgestellt werden. &lt;br /&gt;
Add &#039;big&#039; or &#039;bigger&#039; to CSS class to get a bigger weather icon.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;weather&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;Weather&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDay&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:weather.png]]&lt;br /&gt;
&lt;br /&gt;
== Icon-Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* Eingebaute Icons: Diese haben das ftui-Präfix. Zurzeit sind folgende verfügbar: ftui-window, ftui-door&lt;br /&gt;
&lt;br /&gt;
* Mehr als 500 Icons von &amp;quot;http://fortawesome.github.io/Font-Awesome/icons&amp;quot; verfügbar. Einfach den Icon-Namen angeben (Präfix &amp;quot;fa-&amp;quot; nicht vergessen, Z.B. &amp;lt;code&amp;gt;data-icon=&amp;quot;fa-volume-up&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Es stehen auch Openautomation Font-Files zur Verfügung. Wer sie nutzen möchte, muss folgende Stylesheets in die index.html hinzufügen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/openautomation.css&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/fhemSVG.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese font icons haben das Präfix &#039;fs-&#039; bzw. &#039;oa-&#039;.&lt;br /&gt;
&lt;br /&gt;
Beispiel bei einem Schalter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&#039;dummy1&#039; data-icon=&amp;quot;oa-secur_locked&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und so als großes Symbol:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-icon=&amp;quot;oa-status_frost&amp;quot;&lt;br /&gt;
        data-on-color=&amp;quot;#bb3232&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;on&amp;quot;&lt;br /&gt;
        data-get-off=&amp;quot;!on&amp;quot;&lt;br /&gt;
        class=&amp;quot;bigger&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Icons kann man auch etwas dicker darstellen mit den Zusatz bold: &amp;lt;code&amp;gt;data-icon=&amp;quot;oa-secur_locked bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Namen der verfügbaren Icons findet man auch in den CSS Files (openautomation.css / fhemSVG.css)&lt;br /&gt;
&lt;br /&gt;
== Spezial ==&lt;br /&gt;
Folgender Befehl setzt einen direkten Befehl an Fhem ab (&amp;lt;code&amp;gt;set dummy1 off&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div onclick=&amp;quot;setFhemStatus(&#039;set dummy1 off&#039;)&amp;quot;&amp;gt;All off!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM_Tablet_UI/FAQ|FHEM Tablet UI FAQ]] zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,34233.0.html Forums-Beitrag]&lt;br /&gt;
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,37378.0.html User-Demos]&lt;br /&gt;
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14304</id>
		<title>FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14304"/>
		<updated>2016-02-20T15:45:56Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Konfiguration */ Hinweis, dass fhem-tablet-ui-user.css auskommentiert werden sollte, solange sie nicht existiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Oberfläche für Fhem&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=34233&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=n.a.&lt;br /&gt;
|ModOwner=setstate ({{Link2FU|7023|Forum}})&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:tablet_ui.png|200px|thumb|right|Fhem Tablet UI]]&lt;br /&gt;
FHEM Tablet UI ist ein leichtgewichtiges aber funktionsreiches Framework zum Steuern und Überwachen von in Fhem integrierten Geräten. Zahlreiche Widgets können sehr flexibel und leicht per HTML Code konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird die Installation und Konfiguration des FHEM Tablet UI beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Todo|alle Widgets hier übernehmen, Übersetzung, weitere Beispiele aus dem Forum einfügen (evtl. mit Link!?)}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Dieses User Interface für Tablets benötigt &amp;lt;u&amp;gt;keine&amp;lt;/u&amp;gt; zusätzliche Frameworks, wie PHP, MySQL oder SmartVisu.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen ist nur ein Standard-Fhem mit HTTPSRV Modul und ein beliebiger Standard-Browser  mit Javascript auf einem beliebigen Betriebssystem oder Webviewcontrol.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;define TABLETUI HTTPSRV ftui/ ./www/tablet Tablet-UI&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Verzeichnis ./fhem/www/tablet die Datei index-example.html in index.html umbenennen oder eine neue index.html erzeugen und diese index.html wie nachfolgend beschrieben editieren.&lt;br /&gt;
&lt;br /&gt;
Das UI ist über den Link &amp;quot;Tablet-UI&amp;quot; auf der Fhem-Hauptseite oder durch Direktaufruf der URL &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;Fhem-url&amp;gt;:8083/fhem/tablet/index.html&amp;lt;/nowiki&amp;gt;&amp;quot; zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Hinweise zu einer manuellen Installation und weitere Infos sind auf der Projektseite https://github.com/knowthelist/fhem-tablet-ui zu finden.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update des UI durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
kann seit dem 24.12.2015 die URL zum normalen Updatebefehl von FHEM hinzugefügt werden. Mit einen &amp;quot;update check&amp;quot; sieht man dann  gleich alle Updates aus beiden &amp;quot;Welten&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Weitere Widgets ==&lt;br /&gt;
&lt;br /&gt;
=== Widgets for Fhem-tablet-ui ===&lt;br /&gt;
Zusätzlich zu den bei der Installation des Tablet UI direkt zur Verfügung stehenden Widgets, gibt es eine weitere Widget-Quelle von nesges unter https://github.com/nesges/Widgets-for-fhem-tablet-ui. Die Widgets aus dieser Quelle müssen für eine Nutzung separat installiert werden.&lt;br /&gt;
&lt;br /&gt;
Dazu folgenden Befehl in die Fhem-Befehlszeile eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/controls_widgets-for-fhem-tablet-ui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Näheres zur Installation unter [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/Installation Wiki: Installation]. &lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der einzelnen Widgets befindet sich ebenfalls [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki im Github-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration der angezeigten Widgets erfolgt in der Datei &#039;&#039;&#039;index.html&#039;&#039;&#039; im Hauptordner &#039;tablet&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metadaten-Konfiguration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Refresh sofort, alle 15 Minuten ein voller Refresh (shortpoll) statt alle 30 Sekunden ein voller Refresh&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;longpoll&amp;quot; content=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drag&amp;amp;Drop deaktivieren&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&#039;gridster_disable&#039; content=&#039;1&#039;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Toast messages deaktivieren&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&#039;toast&#039; content=&#039;1&#039;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größe des Basis-Rasters (data-sizey=1/data-sizex=1)&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_base_width&amp;quot; content=&amp;quot;116&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_base_height&amp;quot; content=&amp;quot;131&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abstände der Gridsterelemente verkleinern:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_margin&amp;quot; content=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Link sollte auskommentiert werden, solange es diese Datei noch nicht gibt, da diese immer wieder zu Problemen beim Laden der Seite führen kann:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/css/fhem-tablet-ui-user.css&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Layout und das Aussehen des UI kann durch die Klassen-Attribute beeinflusst werden. Verfügbare Klassen sind:&lt;br /&gt;
&lt;br /&gt;
container, left, right, cell, narrow, darker, big, bigger, small&lt;br /&gt;
&lt;br /&gt;
== Farbe ==&lt;br /&gt;
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form oder als RGB-Wert anzugeben. Zum Beispiel: Hex: #A3CFA3 RBG: rgb(163, 207, 163).&lt;br /&gt;
&lt;br /&gt;
Knallige Farben wie #ff0000 für Rot oder #00ff00 für Grün sollten vermieden werden. Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.&lt;br /&gt;
&lt;br /&gt;
Hilfreich bei der Suche nach den Farbwerten ist der color picker: http://www.w3schools.com/tags/ref_colorpicker.asp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CSS Class description ==&lt;br /&gt;
&lt;br /&gt;
Not all widgets support all classes&lt;br /&gt;
&lt;br /&gt;
* readonly : changing of state is not allowed&lt;br /&gt;
* wider : 25px extra space for the widget to the top&lt;br /&gt;
* narrow : shorter distant to the widget above&lt;br /&gt;
* w1x, w2x, w3x : set the widget to a fix width: 1x, 2x, 3x width&lt;br /&gt;
* mini : lowest diameter for volume widget&lt;br /&gt;
* small : font 80% size (label), small diameter for volume widget&lt;br /&gt;
* medium : font 120% size&lt;br /&gt;
* large : font 150% size&lt;br /&gt;
* big : font 200% size&lt;br /&gt;
* bigplus : font 270% size&lt;br /&gt;
* bigger : font 320% size&lt;br /&gt;
* bigger.thin : font 450% size&lt;br /&gt;
* grande : font 600% size&lt;br /&gt;
* gigantic: font 144px size + 120px line-height&lt;br /&gt;
* thin : font thin&lt;br /&gt;
* darker : forecolor in gray&lt;br /&gt;
* hue-tick : draw ticks in color range&lt;br /&gt;
* hue-front : draw handle in color range&lt;br /&gt;
* hue-back : draw background in color range&lt;br /&gt;
* dim-tick : draw ticks in brightness range&lt;br /&gt;
* dim-front : draw handle in brightness range&lt;br /&gt;
* dim-back : draw background in brightness range&lt;br /&gt;
* red : foreground color red&lt;br /&gt;
* green : foreground color green&lt;br /&gt;
* blue : foreground color blue&lt;br /&gt;
* doublebox-v : container to place 2 small widgets (e.g. switch) one above the other&lt;br /&gt;
* doublebox-h : container to place 2 small widgets (e.g. switch) side by side&lt;br /&gt;
* timestamp : deliver the date time for the reading instead the value&lt;br /&gt;
* inline : positioning elements in a row, no line break&lt;br /&gt;
* top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
* left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
* right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
* blink : blink animatation for label or symbol widget&lt;br /&gt;
* verticalLine : Vertikale Line am rechten Rand&lt;br /&gt;
&lt;br /&gt;
== Positioning ==&lt;br /&gt;
&lt;br /&gt;
*container : new box or new row&lt;br /&gt;
*col-x-y : new column with x/y of width (col-1-3,col-2-3,col-1-2,col-1-4,col-1-8,col-1-5,col-2-5,col-3-5,col-4-5)&lt;br /&gt;
*inline : positioning elements in a row, no line break&lt;br /&gt;
*top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
*left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
*right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
*top-narrow : -15px closer on top (top-narrow-2x -&amp;gt; -30px; top-narrow-10 -&amp;gt; -10px)&lt;br /&gt;
*centered : horizontal centered&lt;br /&gt;
*left-align : align text left&lt;br /&gt;
*right-align : align text right&lt;br /&gt;
*wider : 15px extra space for the widget all around&lt;br /&gt;
*narrow : shorter distant to the widget above&lt;br /&gt;
*fullsize : 100% in width and height&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Zurzeit stehen 33 Widgets zur Verfügung:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/button button]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen Fhem-Befehl absetzen kann.&lt;br /&gt;
* [[#chart|chart]]: chart with similar capabilities as the FHEM plots &lt;br /&gt;
* [[#circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des &#039;circle&#039; im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clicksound clicksound]: Mit dem Widget &amp;quot;clicksound&amp;quot; können Sounds an Click-Events von Elementen gebunden werden. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clock clock]: Das Widget &amp;quot;clock&amp;quot; stellt eine einfach Uhr zur verfügung.&lt;br /&gt;
* [[#dimmer|dimmer]]: toogle button with a setter for on value&lt;br /&gt;
* [[#homestatus|homestatus]]: selector for 4 states (1=home, 2=night, 3=away, 4=holiday)&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/iframe iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe. &lt;br /&gt;
* [[#image|image]]: insert an image, the URL is given by a reading&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/klimatrend klimatrend]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.&lt;br /&gt;
* [[#label|label]]: ein state als Text anzeigen (Farbe einstellbar)&lt;br /&gt;
* [[#level|level]]: vertical/horizontal bar to show values between min/max value&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/multistatebutton multistatebutton]: Variante des push-Widgets das den set-Befehl abhängig vom gelesenen Status ändert.&lt;br /&gt;
* [[#pagetab|pagetab]]: Element to smoothly exchange the whole page with another page&lt;br /&gt;
* [[#playstream|playstream]]: Abspielen eines Webradio-Streams per Button&lt;br /&gt;
* [[#popup|popup]]: a popup dialog which open on click on another widget &lt;br /&gt;
* [[#progress|progress]]: round symbolic display for percent values&lt;br /&gt;
* [[#push|push]]: send any command to Fhem e.g. up / down&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads&lt;br /&gt;
* [[#rotor|rotor]]: Umschalten von zwei oder mehr Widgets an einer Position&lt;br /&gt;
* [[#select|select]]: Combobox to provide a list for selection&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: zum anzeigen und einstellen einer Uhrzeit.&lt;br /&gt;
* [[#simplechart|simplechart]]: simple XY line chart for one value (reads directly from Fhem log file) &lt;br /&gt;
* [[#slider|slider]]: vertical slider to select between min/max value&lt;br /&gt;
* [[#switch|switch]]: Toggle any command to Fhem (e.g. on / off)&lt;br /&gt;
* [[#symbol|symbol]]: State als Symbol darstellen (z.B. Fenster offen)&lt;br /&gt;
* [[#thermostat|thermostat]]: dial for heater thermostates to set desired value and show current value&lt;br /&gt;
* [[#volume|volume]]: dial to set a single value (e.g. 0-60)&lt;br /&gt;
* [[#weather|weather]]: insert an icon or image, represending a weather literal&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/wind_direction wind_direction]: Zeigt die Windrichtung auf einer Windrose an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------&lt;br /&gt;
&lt;br /&gt;
Für alle Widgets gilt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+allgemeine Attribute&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-type&lt;br /&gt;
|Widget-Typ&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-device&lt;br /&gt;
|Fhem-Name des Gerätes (mit dem Befehl &#039;list&#039; bekommt man im Fhem die kpl. Liste)&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|CSS-Klassen für Aussehen und Formatierung des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;chart&amp;quot;&amp;gt;&#039;&#039;&#039;CHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung) or array of names if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log) or or array of names if more than one graph shall be displayed&lt;br /&gt;
|&#039;-&#039; or omitting this data means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;) or or array of columnspecs if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-style&lt;br /&gt;
|name of the graph style to be used (e.g. &#039;SVGplot l0&#039; or &#039;ftui l0dash&#039;) or or array of styles if more than one graph shall be displayed using different stlyes. The standard fhem plot styles can be used furthermore there are some more predefined styles existing (details see css file). Own styles can be specified e.g. in the fhem-table-ui-user.css file.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ptype&lt;br /&gt;
|name of the plot type (e.g. &#039;lines&#039; or &#039;fa-cog&#039;) or or array of plottypes if more than one graph shall be displayed. All fhem plot styles are supported. Additionally it is possible to specify symbols (currently supported are font awesome (&#039;fa-...&#039;), open automation (&#039;oa-...&#039;) and fhem symbols (&#039;fs-...&#039;))&lt;br /&gt;
|&#039;lines&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-uaxis&lt;br /&gt;
|name of the axis to be used (&#039;primary&#039; or &#039;secondary&#039;) or or array of axis&#039; to be used if more than one graph shall be displayed. The &#039;primary&#039; axis is labelled on the left side, the &#039;secondary&#039; axis is labelled on the right side&lt;br /&gt;
|&#039;primary&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-legend&lt;br /&gt;
|caption of the graph (used in the legend and at the cursor) or an array of legend texts if more than one graph shall be displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue_sec&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue_sec&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines (related to primary axis). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically.&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick lines (in minutes). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_start&lt;br /&gt;
|number of days back from now for the start of the plot (0 means the plot starts from today 0:00). Additionally the x-axis start value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_end&lt;br /&gt;
|number of days back from now for the end of the plot (-1 means the plot ends today 24:00). Additionally the x-axis end value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|-1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-nofulldays&lt;br /&gt;
|switch to activate/deactivate rounding of the xaxis start and end values to full days (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext&lt;br /&gt;
|text to be shown besides the primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext_sec&lt;br /&gt;
|text to be shown besides the secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks for primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-crosshair&lt;br /&gt;
|switch to activate/deactivate the crosshair cursor (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cursorgroup&lt;br /&gt;
|number to define coupling of the crosshair cursor. The cursors of all charts having the same number are coupled and move together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-scrollgroup&lt;br /&gt;
|number to define coupling of the scrolling (shift and zoom). All charts having the same number are scrolled (shifted and zoomed) together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-showlegend&lt;br /&gt;
|switch to activate/deactivate the initial display of the legend window (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit_sec&lt;br /&gt;
|unit of the value to show beside of each Y ticks for secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixed size for width (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixed size for height (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks, nobuttons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; can be omitted in this case the default value &amp;quot;-&amp;quot; will be used. This means that the current logfile is going to be used.&lt;br /&gt;
&lt;br /&gt;
There are several buttons that control the dynamic behaviour of the chart. The &amp;lt;-, -&amp;gt;, + and - buttons shift and zoom the displayed data. The &amp;quot;legend&amp;quot; and &amp;quot;cursor&amp;quot; buttons are switching on and off the display of the legend window and the crosshair cursor respectively.&lt;br /&gt;
&lt;br /&gt;
When the legend window is displayed, a click on the legend text shows/hides the respective graph. The legend window can be dragged to other positions on desktop browsers (currently not yet working for iOS and Android).&lt;br /&gt;
&lt;br /&gt;
The crosshair cursor currently only works dynamically on desktop browsers. On iOS and Android you have to tap on the screen to set the cursor to a new position.&lt;br /&gt;
&lt;br /&gt;
There is a number of css styles that control the visible appearance of the chart. The following classes are supported:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!CSS class name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
!.chart-background&lt;br /&gt;
|Color etc. for the chart background&lt;br /&gt;
|-&lt;br /&gt;
!.text.axes&lt;br /&gt;
|Font and color for the chart axes&lt;br /&gt;
|-&lt;br /&gt;
!.buttons&lt;br /&gt;
|Size and color for the buttons (shift etc.)&lt;br /&gt;
|-&lt;br /&gt;
!.gridlines&lt;br /&gt;
|Size and color for gridlines generally&lt;br /&gt;
|-&lt;br /&gt;
!.xaxis&lt;br /&gt;
|Font, size and color for xaxis&lt;br /&gt;
|-&lt;br /&gt;
!.yaxis&lt;br /&gt;
|Font, size and color for yaxis&lt;br /&gt;
|-&lt;br /&gt;
!.xticks&lt;br /&gt;
|Font, size and color for xticks&lt;br /&gt;
|-&lt;br /&gt;
!.yticks&lt;br /&gt;
|Font, size and color for yticks&lt;br /&gt;
|-&lt;br /&gt;
!.crosshair&lt;br /&gt;
|Font, size and color (foreground/background) for the crosshair cursor&lt;br /&gt;
|-&lt;br /&gt;
!.caption&lt;br /&gt;
|Font, size and color for text buttons for legend and cursor switching&lt;br /&gt;
|-&lt;br /&gt;
!.legend&lt;br /&gt;
|Font, size and background color for legend window&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_chart|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;CIRCLEMENU&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-item-diameter&lt;br /&gt;
|diameter of the circle&lt;br /&gt;
|52&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-circle-radius&lt;br /&gt;
|radius of each item, in pixel&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-direction&lt;br /&gt;
|position of the items in relation to the center&lt;br /&gt;
|&#039;full&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-close-after&lt;br /&gt;
|closing time of the circle-menu&lt;br /&gt;
|(item-count + 1s) or a minimum of 4s&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|keepopen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Optionen für data-direction: top | right | bottom | left | top-right | top-left | bottom-right | bottom-left | top-half | right-half | bottom-half | left-half | full | vertical | horizontal&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_circlemenu|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;DIMMER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|(&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value for ON status to set&lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|value for OFF status to set&lt;br /&gt;
|value of data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-dim&lt;br /&gt;
|name of the reading responsible for dim (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|fa-lightbulb-o&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_dimmer|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;HOMESTATUS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|array of fix names to show only in the UI as an alias to the real states&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the data-get-on array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-version&lt;br /&gt;
|name of the status model e.g. &#039;residents&#039;,&#039;roommate&#039;,&#039;guest&#039; &lt;br /&gt;
|(default NULL)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default version has 4 states: &#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039; The default aliases are &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;; data-version=&#039;residents&#039; or &#039;roommate&#039; or &#039;guest&#039; has 5 states (&#039;home&#039;,&#039;asleep&#039;,&#039;absent&#039;,&#039;gone&#039;,&#039;gotosleep&#039;) They have these aliases &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;,&#039;Retire&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_homestatus|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;image&amp;quot;&amp;gt;&#039;&#039;&#039;IMAGE&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get an URL from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-size&lt;br /&gt;
|width of the image in px or %, the height scales proportionally&lt;br /&gt;
|50%&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the image to show (use data-url or data-device + data-get, not both)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-refresh&lt;br /&gt;
|Interval in seconds for image refresh for usage together with data-url&lt;br /&gt;
|900&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_image|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;label&amp;quot;&amp;gt;&#039;&#039;&#039;LABEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fix&lt;br /&gt;
|keeping a specified number of decimals. &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; non-numeric&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-part&lt;br /&gt;
|split position of the space separated value to show or an RegEx&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-get&lt;br /&gt;
|name of the DEVICE:Reading to colorize the label &lt;br /&gt;
|data-device:data-get&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|an array of numeric values to affect the colour of the Label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-part&lt;br /&gt;
|part number of the space separated value to show or a RegEx &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; all&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-unit&lt;br /&gt;
|add a unit after a numeric value. use encoded strings e.g. &amp;quot;%B0C%0A&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-substitution&lt;br /&gt;
|regex-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|small, large, big, bigger, thin, red, green, blue, darker, timestamp, w1x, w2x, w3x, fixedlabel, icon, bg-limit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit der Class &#039;fixedlabel&#039; kann man Label einbauen, die einen festen Text (direkt im HTML) haben, aber trotzdem die Farbe per Reading Value beeinflusst werden könnte.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;icon&#039; kann man Label einbauen, die wie Icons aussehen. Als Hintergrund gibt es &#039;icon round&#039; (rund), &#039;icon square&#039; (Rechteck mit abgerundeten Ecken) und &#039;icon squareborder&#039; (Rechteck mit abgerundeten Ecken und einem zusätzlichen Rand).&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;bg-limit&#039; wird der Hintergrund des Icon auf grün oder rot gesetzt, passend zum on/off Status des data-limits.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_label|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;level&amp;quot;&amp;gt;&#039;&#039;&#039;LEVEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|&#039;0&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|&#039;100&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|a array of numeric or RegEx values to affect the colour of the label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|mini, horizontal&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_level|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;PAGETAB&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the new page to show&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&#039;fa-power-off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|color of OFF state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|color of Off state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|array of status to assign a special icon-list from data-icons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the a data-get-on array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|warn, activate (as additionals for data-icons)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_pagetab|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;playstream&amp;quot;&amp;gt;&#039;&#039;&#039;PLAYSTREAM&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL des Radio-Streams&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the control state from FHEM&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for PLAY status to get. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for STOP status to get. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-volume&lt;br /&gt;
|name of the reading to get the volume value (0-100) &lt;br /&gt;
|volume&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_playstream|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;popup&amp;quot;&amp;gt;&#039;&#039;&#039;POPUP&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading where to get the alert value from&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value which trigger to open the dialog&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value which trigger to close the dialog &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_popup|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;progress&amp;quot;&amp;gt;&#039;&#039;&#039;PROGRESS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set or name of the reading which helds the max value&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|novalue, percent&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_progress|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;push&amp;quot;&amp;gt;&#039;&#039;&#039;PUSH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
| name of the reading to set on FHEM (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value to send when the the button get pressed oder ein Array zwischen dessen Werten umgeschaltet werden kann&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-doubleclick&lt;br /&gt;
|timeout to wait for a second click or touch. &#039;0&#039; disables the doubleclick feature. &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-countdown&lt;br /&gt;
|secondes for the countdown progress control &lt;br /&gt;
|autodetect from &#039;on-for-timer&#039; command&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|fix color attribute for OFF state or DEVICE:READING for dynamic setting &lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|fix color attribute for Off state or DEVICE:READING for dynamic setting&lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_push|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;rotor&amp;quot;&amp;gt;&#039;&#039;&#039;ROTOR&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; | data-delay&lt;br /&gt;
|time in millisecondes to wait until next list item get shown&lt;br /&gt;
|3500&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fade, rotate&lt;br /&gt;
|&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Ohne Angabe von class erfolgt keine Animation.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_rotor|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;select&amp;quot;&amp;gt;&#039;&#039;&#039;SELECT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading that get the selected item of the list&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|name of the reading to set on Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-list&lt;br /&gt;
|name of the reading to get a :-separated list from Fhem&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-items&lt;br /&gt;
|an array of fix items to show in the selection box (alternative if data-list is empty)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|an array of fix names to show only in the selection box as an alias to the real items&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command to send to Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-quote&lt;br /&gt;
|characters to enclose the send value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|wider, w1x, w2x, w3x, large, big&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_select|Link zu einem Beispiel]]&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;simplechart&amp;quot;&amp;gt;&#039;&#039;&#039;SIMPLECHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log)&lt;br /&gt;
|&#039;-&#039; means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY &lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY &lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick line (in Minuten)&lt;br /&gt;
|360 minutes&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago&lt;br /&gt;
|number of days back from now &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-caption&lt;br /&gt;
|name of the chart to show as text &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_simplechart|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; kann man auch weglassen, dann greift der Defaultwert &amp;quot;-&amp;quot;. Damit wird das neuste Logfile gelesen.&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;slider&amp;quot;&amp;gt;&#039;&#039;&#039;SLIDER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-value&lt;br /&gt;
|wenn true wird beim sliden der Wert angezeigt&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|width for horizontal sliders&lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|height for vertical sliders &lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|Aussehen/Ausrichtung&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für class steht mini, horizontal und negated (0 liegt oben) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_slider|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;switch&amp;quot;&amp;gt;&#039;&#039;&#039;SWITCH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert, bei dem zum Status ON geschaltet werden soll. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert, bei dem zum Status OFF geschaltet werden soll. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf ON geschaltet wurde  &lt;br /&gt;
|Wert von data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf OFF geschaltet wurde &lt;br /&gt;
|Wert von data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|Kommando Name (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) &amp;lt;br /&amp;gt;(z.B setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des Font-Awesome Icon. &lt;br /&gt;
|&#039;fa-lightbulb-o&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Name des Font-Awesome Hintergrund Icon. &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Widget Farbe beim Status ON &lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Widget Farbe beim Status OFF &lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-get-on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;data-get-off&amp;lt;/code&amp;gt; accept also RegEx values. e.g. data-get-on=&amp;quot;[0-9]{1,3}|on&amp;quot; means set switch on if STATE is a numeric value or &#039;on&#039;. data-get-off=&amp;quot;!on&amp;quot; means accept all but the data-get-on value (negation)&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_switch|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;symbol&amp;quot;&amp;gt;&#039;&#039;&#039;SYMBOL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dual state notation&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get. &lt;br /&gt;
|&#039;open&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get. &lt;br /&gt;
|&#039;closed&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des font-awesome-Symbols  &lt;br /&gt;
|&#039;ftui-window&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Hintergrundsymbol&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
multi state notation&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-states&lt;br /&gt;
|array of states. &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|array of colors related to the data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-colors&lt;br /&gt;
|array of background-colors related to the data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
data-get-on,data-get-off and data-states accept also RegEx values. The value for one icon can also contain an additional animatation CSS name, e.g. &amp;quot;fa-exclamation-triangle fa-blink&amp;quot; for a blinking Symbol&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_symbol|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;THERMOSTAT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-temp&lt;br /&gt;
|reading for measured temperature of thermostates&lt;br /&gt;
|&#039;measured-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-valve&lt;br /&gt;
|reading for valve position of thermostates&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minColor&lt;br /&gt;
|Farbe des Keises für Min&lt;br /&gt;
| #4477FF&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxColor&lt;br /&gt;
|Farbe des Kreises für Max, zwischen Min und Max wird linear interpoliert &lt;br /&gt;
| #FF0000&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-step&lt;br /&gt;
|step size for value adjustment e.g. 0.5 &lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-bgColor&lt;br /&gt;
|Die Farbe der Kreises zwischen den ticks&lt;br /&gt;
|&#039;transparent&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fgColor&lt;br /&gt;
|Die Farbe der zahl im Kreismittelpunkt&lt;br /&gt;
|#bbbbbb&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-tkColor&lt;br /&gt;
|Die Farbe der ticks&lt;br /&gt;
|#696969&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleOffset&lt;br /&gt;
|Start der ticks im Kreis (in Winkelgraden, 0 = oben)&lt;br /&gt;
| -120&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleArc&lt;br /&gt;
|Bereich der ticks im Kreis (in Winkelgraden)&lt;br /&gt;
|240&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|big, readonly&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_thermostat|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;volume&amp;quot;&amp;gt;&#039;&#039;&#039;VOLUME&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem &lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;rigth&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|small, hue-tick, hue-front, hue-back, dim-tick ,dim-front, dim-back&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_volume|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;weather&amp;quot;&amp;gt;&#039;&#039;&#039;WEATHER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the weather literal from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-imageset&lt;br /&gt;
|collection of images to display current weather situation. Possible values: &#039;meteocons&#039;, &#039;kleinklima&#039;&lt;br /&gt;
|&#039;meteocons&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-image-path&lt;br /&gt;
|path to the images of the selected imageset&lt;br /&gt;
|/images/weather/&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_weather|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Beispiele ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_chart&amp;quot;&amp;gt;&#039;&#039;&#039;Chart&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display a chart with similar capabilities as the FHEM plots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;normal&amp;quot;&amp;gt;&lt;br /&gt;
	data-type=&amp;quot;chart&amp;quot;&lt;br /&gt;
	data-logdevice=&#039;[&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Predicted&amp;quot;]&#039;&lt;br /&gt;
	data-columnspec=&#039;[&amp;quot;4:Garden.T:15:&amp;quot;,&amp;quot;10:Garden.T:0:delta-h&amp;quot;,&amp;quot;10:Garden.T:0:delta-d&amp;quot;,&amp;quot;4:predicted.*:15:&amp;quot;]&#039;&lt;br /&gt;
	data-style=&#039;[&amp;quot;ftui l0fill&amp;quot;,&amp;quot;ftui l1fill&amp;quot;,&amp;quot;ftui l2&amp;quot;,&amp;quot;ftui l3dot&amp;quot;]&#039;&lt;br /&gt;
	data-ptype=&#039;[&amp;quot;lines&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;cubic&amp;quot;]&#039;&lt;br /&gt;
	data-uaxis=&#039;[&amp;quot;primary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;primary&amp;quot;]&#039;&lt;br /&gt;
	data-legend=&#039;[&amp;quot;Temperature&amp;quot;,&amp;quot;Rain/hour&amp;quot;,&amp;quot;Rain/day&amp;quot;,&amp;quot;Predicted Temp.&amp;quot;]&#039;&lt;br /&gt;
	data-yunit=&amp;quot;°C&amp;quot;&lt;br /&gt;
	data-ytext=&amp;quot;Temperature&amp;quot;&lt;br /&gt;
	data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-yunit_sec=&amp;quot;mm&amp;quot;&lt;br /&gt;
	data-ytext_sec=&amp;quot;Rain (mm)&amp;quot;&lt;br /&gt;
	data-height=&amp;quot;250&amp;quot;&lt;br /&gt;
	data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
	data-daysago_start=&amp;quot;2013-08-13T00:00:00&amp;quot;&lt;br /&gt;
	data-daysago_end=&amp;quot;2013-08-14T00:00:00&amp;quot;&lt;br /&gt;
	data-cursorgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-scrollgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-xticks=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:chart_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;Circlemenu&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cover a lot of other button behind one single button&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;circlemenu&amp;quot; class=&amp;quot;cell circlemenu&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-icon=&amp;quot;fa-wrench&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -6&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-6&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -2&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level 0&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;0&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +3&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +9&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +C&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;12&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Woofer&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:circlemenu_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;Dimmer&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget Beispiel für Philips Hue&lt;br /&gt;
&lt;br /&gt;
Minimalvariante&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;!off&amp;quot; data-get-off=&amp;quot;off&amp;quot;&lt;br /&gt;
        data-set=&amp;quot;pct&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Anzeige der Dimstufe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
       data-get=&amp;quot;onoff&amp;quot;&lt;br /&gt;
       data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
       data-set=&amp;quot;&amp;quot;&lt;br /&gt;
       data-set-on=&amp;quot;on&amp;quot; data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
       data-dim=&amp;quot;pct&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget für MilightDevice&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot;&lt;br /&gt;
  data-device=&amp;quot;SonstWas&amp;quot;&lt;br /&gt;
  data-get=&amp;quot;brightness&amp;quot;&lt;br /&gt;
  data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-get-on=&amp;quot;[1-9][0-9]*&amp;quot;&lt;br /&gt;
  data-set-on=&amp;quot;on&amp;quot;&lt;br /&gt;
  data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
  data-dim=&amp;quot;dim&amp;quot;&lt;br /&gt;
  data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-max=&amp;quot;100&amp;quot;&lt;br /&gt;
&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;Homestatus&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel rechts im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
       data-get-on=&#039;[&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;]&#039;&lt;br /&gt;
       data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;]&#039;&lt;br /&gt;
       data-icons=&#039;[&amp;quot;fa-home&amp;quot;,&amp;quot;fa-bed&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-suitcase&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel links im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-get-on=&#039;[&amp;quot;home&amp;quot;,&amp;quot;asleep&amp;quot;,&amp;quot;absent&amp;quot;,&amp;quot;gone&amp;quot;,&amp;quot;gotosleep&amp;quot;]&#039;&lt;br /&gt;
        data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;,&amp;quot;Retire&amp;quot;]&#039;&lt;br /&gt;
        data-icons=&#039;[&amp;quot;fa-fire&amp;quot;,&amp;quot;fa-film&amp;quot;,&amp;quot;fa-plus&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-tint&amp;quot;]&#039;&lt;br /&gt;
        data-version=&#039;residents&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:homestatus_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_image&amp;quot;&amp;gt;&#039;&#039;&#039;Image&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erzeugt ein Widget mit einem Bild aus dem www, das alle 5 Sekunden aktualisiert wird (hier eine Wetterkarte vom DWD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot;&lt;br /&gt;
     data-size=&amp;quot;80%&amp;quot;&lt;br /&gt;
     data-url=&amp;quot;http://www.dwd.de/wundk/wetter/de/Deutschland.jpg&amp;quot;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:image_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for how to add an image to the dashboard which its URL is delivered by a Fhem module like PROPLANTA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot; data-device=&amp;quot;Wetter1&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDayIcon&amp;quot; &lt;br /&gt;
     data-size=&amp;quot;40px&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_label&amp;quot;&amp;gt;&#039;&#039;&#039;Label&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
STATE   T: 20.0 H: 61&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;2&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; data-part=&amp;quot;4&amp;quot; &lt;br /&gt;
     data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But the same result can reached by getting single readings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
humidity    58&lt;br /&gt;
temperature 20.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;temperature&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;humidity&amp;quot; data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to influence the color of the label according to value limits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;OutTemp&amp;quot; &lt;br /&gt;
     data-limits=&#039;[-73,10,23]&#039; &lt;br /&gt;
     data-colors=&#039;[&amp;quot;#6699FF&amp;quot;,&amp;quot;#AA6900&amp;quot;,&amp;quot;#FF0000&amp;quot;]&#039; &lt;br /&gt;
     data-unit=&amp;quot;%B0C%0A&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a widget for shutter via push: show state and set up/down&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;wzRollo&amp;quot; &lt;br /&gt;
     data-get-on=&amp;quot;up&amp;quot; &lt;br /&gt;
     data-get-off=&amp;quot;down&amp;quot; &lt;br /&gt;
     data-icon=&amp;quot;fa-bars&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;Rollo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a label for a time value in short format with usage of RegEx.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;(\d\d\.\d\d\.).*&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to show two labels in one line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunrise&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;bis&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunset&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des UV-Indexes und der Abhängigkeit der anzuzeigenden Farbe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc0_uv&amp;quot;&lt;br /&gt;
        data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot; &lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc0_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc1_uv&amp;quot;&lt;br /&gt;
	data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot;&lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc1_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:label_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des Labels als Icon.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon round bg-red cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon square bg-blue cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon squareborder cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;PowerAV_Sw&amp;quot; data-colors=&#039;[&amp;quot;red&amp;quot;,&amp;quot;green&amp;quot;]&#039; data-limits=&#039;[&amp;quot;off&amp;quot;,&amp;quot;on&amp;quot;]&#039; class=&amp;quot;icon round bg-limit cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Label_tabletUI_icon.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;Pagetab&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tab menu to switch smoothly between multiple pages. Multiple pagetabs in a template file: menu.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt;MENU&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index.html&amp;quot;  data-icon=&amp;quot;fa-home&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_2.html&amp;quot; data-icon=&amp;quot;fa-sliders&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_3.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_4.html&amp;quot; data-icon=&amp;quot;fa-hotel&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_5.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_6.html&amp;quot; data-icon=&amp;quot;fa-database&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_7.html&amp;quot; data-icon=&amp;quot;fa-fax&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_playstream&amp;quot;&amp;gt;&#039;&#039;&#039;Playstream&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt einen Knopf zum direkten Abspielen eines Webradio-Streams.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;playstream&amp;quot; data-url=&amp;quot;http://radioeins.de/stream&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Radio eins&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_push&amp;quot;&amp;gt;&#039;&#039;&#039;Push&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a push button widget to trigger all devices on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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=&amp;quot;on&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei horizontale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei quadratische vertikale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_rotor&amp;quot;&amp;gt;&#039;&#039;&#039;Rotor&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a rotor widget, which switches between to days of weather forecast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;rotor&amp;quot; class=&amp;quot;fade&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Heute&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Morgen&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_select&amp;quot;&amp;gt;&#039;&#039;&#039;Select&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt zwei Comboboxen zur Auswahl des Eingang eines 2-Zonen-AV-Receivers. Die Liste für Zone2 ist fest, die Liste für Zone1 wird von Fhem übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell wider&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline wider&amp;quot;&amp;gt;Zone2&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiverZ2&amp;quot; data-items=&#039;[&amp;quot;Airplay&amp;quot;,&amp;quot;Webradio&amp;quot;,&amp;quot;BD/DVD&amp;quot;,&amp;quot;PHONO&amp;quot;]&#039; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;Zone1&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-list=&amp;quot;inputs&amp;quot; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:select_tabeltUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_slider&amp;quot;&amp;gt;&#039;&#039;&#039;Slider&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slider mit einstellbaren Werten von 10 bis 90:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot; &lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;10&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;90&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Light1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Horizontal angeordneter Slider:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;0&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;100&amp;quot; &lt;br /&gt;
     class=&amp;quot;horizontal&amp;quot; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_switch&amp;quot;&amp;gt;&#039;&#039;&#039;Switch&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schalter. Usage of RegEx pattern for state request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; class=&amp;quot;cell&amp;quot; &lt;br /&gt;
            data-device=&amp;quot;MILIGHT_Zone1_Wohnzimmer&amp;quot; &lt;br /&gt;
            data-get-on=&amp;quot;on.*&amp;quot;&lt;br /&gt;
            data-get-off=&amp;quot;off&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine Gruppe von Schaltern, um zwischen vier verschiedenen Werten eines device umzuschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell left&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert1).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert1&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert1&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert2).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert2&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert2&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert3).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert3&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert3&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert4).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert4&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert4&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_symbol&amp;quot;&amp;gt;&#039;&#039;&#039;Symbol&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;wert1&amp;quot;,&amp;quot;wert2&amp;quot;,&amp;quot;wert3&amp;quot;]&#039; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-arrow-up&amp;quot;,&amp;quot;fa-user&amp;quot;,&amp;quot;fa-arrow-down&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;SeaGreen&amp;quot;,&amp;quot;SlateBlue&amp;quot;,&amp;quot;IndianRed&amp;quot;]&#039; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon with blink and spin animation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-exclamation-triangle fa-blink&amp;quot;,&amp;quot;fa-exclamation-circle&amp;quot;,&amp;quot;fa-cog fa-spin&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;Crimson&amp;quot;,&amp;quot;GoldenRod&amp;quot;,&amp;quot;SeaGreen&amp;quot;]&#039; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;Wert1&amp;quot;,&amp;quot;Wert2&amp;quot;,&amp;quot;Wert3&amp;quot;]&#039; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with RegEx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
     data-icons=&#039;[&amp;quot;oa-measure_battery_100&amp;quot;,&amp;quot;oa-measure_battery_75&amp;quot;,&amp;quot;oa-measure_battery_50&amp;quot;,&amp;quot;oa-measure_battery_25&amp;quot;,&amp;quot;oa-measure_battery_0&amp;quot;]&#039;&lt;br /&gt;
     data-get-on=&#039;[&amp;quot;3\\.[0-9]&amp;quot;,&amp;quot;2\\.[789]&amp;quot;,&amp;quot;2\\.[456]&amp;quot;,&amp;quot;2\\.[123]&amp;quot;,&amp;quot;((2\\.0)|([01]\\.[0-9]))&amp;quot;]&#039;&lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with greater-equal compare and 90° rotated symbols&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
    data-icons=&#039;[&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_25 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_50 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_75 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;]&#039;&lt;br /&gt;
    data-get-on=&#039;[&amp;quot;0&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;2.4&amp;quot;,&amp;quot;2.7&amp;quot;,&amp;quot;3.0&amp;quot;]&#039;&lt;br /&gt;
    data-on-colors=&#039;[&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;Thermostat&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure as data-device=&#039;...&#039; that item which delivers temp and desired-temp as reading.&lt;br /&gt;
&lt;br /&gt;
Default parameters are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data-get=&amp;quot;desired-temp&amp;quot; data-temp=&amp;quot;measured-temp&amp;quot; data-set=&amp;quot;desired-temp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefor for HomaMatic HM-CC-RT-DN this is sufficient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&#039;KH_Clima&#039; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The long format looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;KH_Clima&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;desired-temp&amp;quot; &lt;br /&gt;
     data-temp=&amp;quot;measured-temp&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for MAX!:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&amp;quot;HZ_Tuer&amp;quot; &lt;br /&gt;
    data-valve=&amp;quot;valveposition&amp;quot; &lt;br /&gt;
    data-get=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    data-temp=&amp;quot;temperature&amp;quot; &lt;br /&gt;
    data-set=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The wigets will show the valve value only in case of a valid data-valve attribute. The default for data-valve ist null. That means, a empty data-valve attribute hides the valve label for the widget.&lt;br /&gt;
&lt;br /&gt;
[[Datei:thermostat.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_weather&amp;quot;&amp;gt;&#039;&#039;&#039;Weather&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Widget fügt ein dem Wetter entsprechendes Bild ein. Die Daten können durch Fhem-Module wie [[PROPLANTA]], [[OPENWEATHER]] und [[Weather]] bereitgestellt werden. &lt;br /&gt;
Add &#039;big&#039; or &#039;bigger&#039; to CSS class to get a bigger weather icon.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;weather&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;Weather&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDay&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:weather.png]]&lt;br /&gt;
&lt;br /&gt;
== Icon-Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* Eingebaute Icons: Diese haben das ftui-Präfix. Zurzeit sind folgende verfügbar: ftui-window, ftui-door&lt;br /&gt;
&lt;br /&gt;
* Mehr als 500 Icons von &amp;quot;http://fortawesome.github.io/Font-Awesome/icons&amp;quot; verfügbar. Einfach den Icon-Namen angeben (Präfix &amp;quot;fa-&amp;quot; nicht vergessen, Z.B. &amp;lt;code&amp;gt;data-icon=&amp;quot;fa-volume-up&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Es stehen auch Openautomation Font-Files zur Verfügung. Wer sie nutzen möchte, muss folgende Stylesheets in die index.html hinzufügen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/openautomation.css&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/fhemSVG.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese font icons haben das Präfix &#039;fs-&#039; bzw. &#039;oa-&#039;.&lt;br /&gt;
&lt;br /&gt;
Beispiel bei einem Schalter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&#039;dummy1&#039; data-icon=&amp;quot;oa-secur_locked&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und so als großes Symbol:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-icon=&amp;quot;oa-status_frost&amp;quot;&lt;br /&gt;
        data-on-color=&amp;quot;#bb3232&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;on&amp;quot;&lt;br /&gt;
        data-get-off=&amp;quot;!on&amp;quot;&lt;br /&gt;
        class=&amp;quot;bigger&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Icons kann man auch etwas dicker darstellen mit den Zusatz bold: &amp;lt;code&amp;gt;data-icon=&amp;quot;oa-secur_locked bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Namen der verfügbaren Icons findet man auch in den CSS Files (openautomation.css / fhemSVG.css)&lt;br /&gt;
&lt;br /&gt;
== Spezial ==&lt;br /&gt;
Folgender Befehl setzt einen direkten Befehl an Fhem ab (&amp;lt;code&amp;gt;set dummy1 off&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div onclick=&amp;quot;setFhemStatus(&#039;set dummy1 off&#039;)&amp;quot;&amp;gt;All off!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM_Tablet_UI/FAQ|FHEM Tablet UI FAQ]] zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,34233.0.html Forums-Beitrag]&lt;br /&gt;
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,37378.0.html User-Demos]&lt;br /&gt;
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14280</id>
		<title>FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=14280"/>
		<updated>2016-02-20T09:54:13Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: /* Widgets -- Beispiele */ Label Icon bei den Beispielen hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Oberfläche für Fhem&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=34233&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=n.a.&lt;br /&gt;
|ModOwner=setstate ({{Link2FU|7023|Forum}})&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:tablet_ui.png|200px|thumb|right|Fhem Tablet UI]]&lt;br /&gt;
FHEM Tablet UI ist ein leichtgewichtiges aber funktionsreiches Framework zum Steuern und Überwachen von in Fhem integrierten Geräten. Zahlreiche Widgets können sehr flexibel und leicht per HTML Code konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird die Installation und Konfiguration des FHEM Tablet UI beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{Todo|alle Widgets hier übernehmen, Übersetzung, weitere Beispiele aus dem Forum einfügen (evtl. mit Link!?)}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Dieses User Interface für Tablets benötigt &amp;lt;u&amp;gt;keine&amp;lt;/u&amp;gt; zusätzliche Frameworks, wie PHP, MySQL oder SmartVisu.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen ist nur ein Standard-Fhem mit HTTPSRV Modul und ein beliebiger Standard-Browser  mit Javascript auf einem beliebigen Betriebssystem oder Webviewcontrol.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Befehls-Eingabefeld eingeben: &amp;lt;code&amp;gt;define TABLETUI HTTPSRV ftui/ ./www/tablet Tablet-UI&amp;lt;/code&amp;gt;&lt;br /&gt;
* Im Verzeichnis ./fhem/www/tablet die Datei index-example.html in index.html umbenennen oder eine neue index.html erzeugen und diese index.html wie nachfolgend beschrieben editieren.&lt;br /&gt;
&lt;br /&gt;
Das UI ist über den Link &amp;quot;Tablet-UI&amp;quot; auf der Fhem-Hauptseite oder durch Direktaufruf der URL &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;Fhem-url&amp;gt;:8083/fhem/tablet/index.html&amp;lt;/nowiki&amp;gt;&amp;quot; zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Hinweise zu einer manuellen Installation und weitere Infos sind auf der Projektseite https://github.com/knowthelist/fhem-tablet-ui zu finden.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update des UI durch Eingabe von: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
kann seit dem 24.12.2015 die URL zum normalen Updatebefehl von FHEM hinzugefügt werden. Mit einen &amp;quot;update check&amp;quot; sieht man dann  gleich alle Updates aus beiden &amp;quot;Welten&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Weitere Widgets ==&lt;br /&gt;
&lt;br /&gt;
=== Widgets for Fhem-tablet-ui ===&lt;br /&gt;
Zusätzlich zu den bei der Installation des Tablet UI direkt zur Verfügung stehenden Widgets, gibt es eine weitere Widget-Quelle von nesges unter https://github.com/nesges/Widgets-for-fhem-tablet-ui. Die Widgets aus dieser Quelle müssen für eine Nutzung separat installiert werden.&lt;br /&gt;
&lt;br /&gt;
Dazu folgenden Befehl in die Fhem-Befehlszeile eingeben: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/controls_widgets-for-fhem-tablet-ui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Näheres zur Installation unter [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/Installation Wiki: Installation]. &lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der einzelnen Widgets befindet sich ebenfalls [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki im Github-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration der angezeigten Widgets erfolgt in der Datei &#039;&#039;&#039;index.html&#039;&#039;&#039; im Hauptordner &#039;tablet&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metadaten-Konfiguration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Refresh sofort, alle 15 Minuten ein voller Refresh (shortpoll) statt alle 30 Sekunden ein voller Refresh&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;longpoll&amp;quot; content=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drag&amp;amp;Drop deaktivieren&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&#039;gridster_disable&#039; content=&#039;1&#039;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Toast messages deaktivieren&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&#039;toast&#039; content=&#039;1&#039;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größe des Basis-Rasters (data-sizey=1/data-sizex=1)&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_base_width&amp;quot; content=&amp;quot;116&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_base_height&amp;quot; content=&amp;quot;131&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abstände der Gridsterelemente verkleinern:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;meta name=&amp;quot;widget_margin&amp;quot; content=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Layout und das Aussehen des UI kann durch die Klassen-Attribute beeinflusst werden. Verfügbare Klassen sind:&lt;br /&gt;
&lt;br /&gt;
container, left, right, cell, narrow, darker, big, bigger, small&lt;br /&gt;
&lt;br /&gt;
== Farbe ==&lt;br /&gt;
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form oder als RGB-Wert anzugeben. Zum Beispiel: Hex: #A3CFA3 RBG: rgb(163, 207, 163).&lt;br /&gt;
&lt;br /&gt;
Knallige Farben wie #ff0000 für Rot oder #00ff00 für Grün sollten vermieden werden. Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.&lt;br /&gt;
&lt;br /&gt;
Hilfreich bei der Suche nach den Farbwerten ist der color picker: http://www.w3schools.com/tags/ref_colorpicker.asp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CSS Class description ==&lt;br /&gt;
&lt;br /&gt;
Not all widgets support all classes&lt;br /&gt;
&lt;br /&gt;
* readonly : changing of state is not allowed&lt;br /&gt;
* wider : 25px extra space for the widget to the top&lt;br /&gt;
* narrow : shorter distant to the widget above&lt;br /&gt;
* w1x, w2x, w3x : set the widget to a fix width: 1x, 2x, 3x width&lt;br /&gt;
* mini : lowest diameter for volume widget&lt;br /&gt;
* small : font 80% size (label), small diameter for volume widget&lt;br /&gt;
* medium : font 120% size&lt;br /&gt;
* large : font 150% size&lt;br /&gt;
* big : font 200% size&lt;br /&gt;
* bigplus : font 270% size&lt;br /&gt;
* bigger : font 320% size&lt;br /&gt;
* bigger.thin : font 450% size&lt;br /&gt;
* grande : font 600% size&lt;br /&gt;
* gigantic: font 144px size + 120px line-height&lt;br /&gt;
* thin : font thin&lt;br /&gt;
* darker : forecolor in gray&lt;br /&gt;
* hue-tick : draw ticks in color range&lt;br /&gt;
* hue-front : draw handle in color range&lt;br /&gt;
* hue-back : draw background in color range&lt;br /&gt;
* dim-tick : draw ticks in brightness range&lt;br /&gt;
* dim-front : draw handle in brightness range&lt;br /&gt;
* dim-back : draw background in brightness range&lt;br /&gt;
* red : foreground color red&lt;br /&gt;
* green : foreground color green&lt;br /&gt;
* blue : foreground color blue&lt;br /&gt;
* doublebox-v : container to place 2 small widgets (e.g. switch) one above the other&lt;br /&gt;
* doublebox-h : container to place 2 small widgets (e.g. switch) side by side&lt;br /&gt;
* timestamp : deliver the date time for the reading instead the value&lt;br /&gt;
* inline : positioning elements in a row, no line break&lt;br /&gt;
* top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
* left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
* right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
* blink : blink animatation for label or symbol widget&lt;br /&gt;
* verticalLine : Vertikale Line am rechten Rand&lt;br /&gt;
&lt;br /&gt;
== Positioning ==&lt;br /&gt;
&lt;br /&gt;
*container : new box or new row&lt;br /&gt;
*col-x-y : new column with x/y of width (col-1-3,col-2-3,col-1-2,col-1-4,col-1-8,col-1-5,col-2-5,col-3-5,col-4-5)&lt;br /&gt;
*inline : positioning elements in a row, no line break&lt;br /&gt;
*top-space : 15px extra on top (top-space-2x -&amp;gt; 30px; top-space-3x -&amp;gt; 45px)&lt;br /&gt;
*left-space : 15px extra on left (left-space-2x -&amp;gt; 30px; left-space-3x -&amp;gt; 45px)&lt;br /&gt;
*right-space : 15px extra on right (right-space-2x -&amp;gt; 30px; right-space-3x -&amp;gt; 45px)&lt;br /&gt;
*top-narrow : -15px closer on top (top-narrow-2x -&amp;gt; -30px; top-narrow-10 -&amp;gt; -10px)&lt;br /&gt;
*centered : horizontal centered&lt;br /&gt;
*left-align : align text left&lt;br /&gt;
*right-align : align text right&lt;br /&gt;
*wider : 15px extra space for the widget all around&lt;br /&gt;
*narrow : shorter distant to the widget above&lt;br /&gt;
*fullsize : 100% in width and height&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Zurzeit stehen 33 Widgets zur Verfügung:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/button button]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen Fhem-Befehl absetzen kann.&lt;br /&gt;
* [[#chart|chart]]: chart with similar capabilities as the FHEM plots &lt;br /&gt;
* [[#circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des &#039;circle&#039; im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clicksound clicksound]: Mit dem Widget &amp;quot;clicksound&amp;quot; können Sounds an Click-Events von Elementen gebunden werden. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/clock clock]: Das Widget &amp;quot;clock&amp;quot; stellt eine einfach Uhr zur verfügung.&lt;br /&gt;
* [[#dimmer|dimmer]]: toogle button with a setter for on value&lt;br /&gt;
* [[#homestatus|homestatus]]: selector for 4 states (1=home, 2=night, 3=away, 4=holiday)&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/iframe iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe. &lt;br /&gt;
* [[#image|image]]: insert an image, the URL is given by a reading&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/klimatrend klimatrend]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.&lt;br /&gt;
* [[#label|label]]: ein state als Text anzeigen (Farbe einstellbar)&lt;br /&gt;
* [[#level|level]]: vertical/horizontal bar to show values between min/max value&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/multistatebutton multistatebutton]: Variante des push-Widgets das den set-Befehl abhängig vom gelesenen Status ändert.&lt;br /&gt;
* [[#pagetab|pagetab]]: Element to smoothly exchange the whole page with another page&lt;br /&gt;
* [[#playstream|playstream]]: Abspielen eines Webradio-Streams per Button&lt;br /&gt;
* [[#popup|popup]]: a popup dialog which open on click on another widget &lt;br /&gt;
* [[#progress|progress]]: round symbolic display for percent values&lt;br /&gt;
* [[#push|push]]: send any command to Fhem e.g. up / down&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads&lt;br /&gt;
* [[#rotor|rotor]]: Umschalten von zwei oder mehr Widgets an einer Position&lt;br /&gt;
* [[#select|select]]: Combobox to provide a list for selection&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: zum anzeigen und einstellen einer Uhrzeit.&lt;br /&gt;
* [[#simplechart|simplechart]]: simple XY line chart for one value (reads directly from Fhem log file) &lt;br /&gt;
* [[#slider|slider]]: vertical slider to select between min/max value&lt;br /&gt;
* [[#switch|switch]]: Toggle any command to Fhem (e.g. on / off)&lt;br /&gt;
* [[#symbol|symbol]]: State als Symbol darstellen (z.B. Fenster offen)&lt;br /&gt;
* [[#thermostat|thermostat]]: dial for heater thermostates to set desired value and show current value&lt;br /&gt;
* [[#volume|volume]]: dial to set a single value (e.g. 0-60)&lt;br /&gt;
* [[#weather|weather]]: insert an icon or image, represending a weather literal&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/wind_direction wind_direction]: Zeigt die Windrichtung auf einer Windrose an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------&lt;br /&gt;
&lt;br /&gt;
Für alle Widgets gilt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+allgemeine Attribute&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-type&lt;br /&gt;
|Widget-Typ&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-device&lt;br /&gt;
|Fhem-Name des Gerätes (mit dem Befehl &#039;list&#039; bekommt man im Fhem die kpl. Liste)&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|CSS-Klassen für Aussehen und Formatierung des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;chart&amp;quot;&amp;gt;&#039;&#039;&#039;CHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung) or array of names if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log) or or array of names if more than one graph shall be displayed&lt;br /&gt;
|&#039;-&#039; or omitting this data means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;) or or array of columnspecs if more than one graph shall be displayed&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-style&lt;br /&gt;
|name of the graph style to be used (e.g. &#039;SVGplot l0&#039; or &#039;ftui l0dash&#039;) or or array of styles if more than one graph shall be displayed using different stlyes. The standard fhem plot styles can be used furthermore there are some more predefined styles existing (details see css file). Own styles can be specified e.g. in the fhem-table-ui-user.css file.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ptype&lt;br /&gt;
|name of the plot type (e.g. &#039;lines&#039; or &#039;fa-cog&#039;) or or array of plottypes if more than one graph shall be displayed. All fhem plot styles are supported. Additionally it is possible to specify symbols (currently supported are font awesome (&#039;fa-...&#039;), open automation (&#039;oa-...&#039;) and fhem symbols (&#039;fs-...&#039;))&lt;br /&gt;
|&#039;lines&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-uaxis&lt;br /&gt;
|name of the axis to be used (&#039;primary&#039; or &#039;secondary&#039;) or or array of axis&#039; to be used if more than one graph shall be displayed. The &#039;primary&#039; axis is labelled on the left side, the &#039;secondary&#039; axis is labelled on the right side&lt;br /&gt;
|&#039;primary&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-legend&lt;br /&gt;
|caption of the graph (used in the legend and at the cursor) or an array of legend texts if more than one graph shall be displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue_sec&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for primary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue_sec&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY for secondary axis. A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines (related to primary axis). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically.&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick lines (in minutes). A value of &#039;auto&#039; means that the value is calculated from the data displayed dynamically&lt;br /&gt;
|&#039;auto&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_start&lt;br /&gt;
|number of days back from now for the start of the plot (0 means the plot starts from today 0:00). Additionally the x-axis start value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago_end&lt;br /&gt;
|number of days back from now for the end of the plot (-1 means the plot ends today 24:00). Additionally the x-axis end value can be set here unsing standard data formats like (&#039;2013-10-23&#039;), the time portion of the string is only used when &amp;lt;code&amp;gt;data-nofulldays&amp;lt;/code&amp;gt; is &#039;true&#039;.&lt;br /&gt;
|-1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-nofulldays&lt;br /&gt;
|switch to activate/deactivate rounding of the xaxis start and end values to full days (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext&lt;br /&gt;
|text to be shown besides the primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-ytext_sec&lt;br /&gt;
|text to be shown besides the secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks for primary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-crosshair&lt;br /&gt;
|switch to activate/deactivate the crosshair cursor (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cursorgroup&lt;br /&gt;
|number to define coupling of the crosshair cursor. The cursors of all charts having the same number are coupled and move together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-scrollgroup&lt;br /&gt;
|number to define coupling of the scrolling (shift and zoom). All charts having the same number are scrolled (shifted and zoomed) together.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-showlegend&lt;br /&gt;
|switch to activate/deactivate the initial display of the legend window (&#039;true&#039; or &#039;false&#039;)&lt;br /&gt;
|&#039;false&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit_sec&lt;br /&gt;
|unit of the value to show beside of each Y ticks for secondary y axis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixed size for width (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixed size for height (in&amp;amp;nbsp;% or px)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks, nobuttons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; can be omitted in this case the default value &amp;quot;-&amp;quot; will be used. This means that the current logfile is going to be used.&lt;br /&gt;
&lt;br /&gt;
There are several buttons that control the dynamic behaviour of the chart. The &amp;lt;-, -&amp;gt;, + and - buttons shift and zoom the displayed data. The &amp;quot;legend&amp;quot; and &amp;quot;cursor&amp;quot; buttons are switching on and off the display of the legend window and the crosshair cursor respectively.&lt;br /&gt;
&lt;br /&gt;
When the legend window is displayed, a click on the legend text shows/hides the respective graph. The legend window can be dragged to other positions on desktop browsers (currently not yet working for iOS and Android).&lt;br /&gt;
&lt;br /&gt;
The crosshair cursor currently only works dynamically on desktop browsers. On iOS and Android you have to tap on the screen to set the cursor to a new position.&lt;br /&gt;
&lt;br /&gt;
There is a number of css styles that control the visible appearance of the chart. The following classes are supported:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!CSS class name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
!.chart-background&lt;br /&gt;
|Color etc. for the chart background&lt;br /&gt;
|-&lt;br /&gt;
!.text.axes&lt;br /&gt;
|Font and color for the chart axes&lt;br /&gt;
|-&lt;br /&gt;
!.buttons&lt;br /&gt;
|Size and color for the buttons (shift etc.)&lt;br /&gt;
|-&lt;br /&gt;
!.gridlines&lt;br /&gt;
|Size and color for gridlines generally&lt;br /&gt;
|-&lt;br /&gt;
!.xaxis&lt;br /&gt;
|Font, size and color for xaxis&lt;br /&gt;
|-&lt;br /&gt;
!.yaxis&lt;br /&gt;
|Font, size and color for yaxis&lt;br /&gt;
|-&lt;br /&gt;
!.xticks&lt;br /&gt;
|Font, size and color for xticks&lt;br /&gt;
|-&lt;br /&gt;
!.yticks&lt;br /&gt;
|Font, size and color for yticks&lt;br /&gt;
|-&lt;br /&gt;
!.crosshair&lt;br /&gt;
|Font, size and color (foreground/background) for the crosshair cursor&lt;br /&gt;
|-&lt;br /&gt;
!.caption&lt;br /&gt;
|Font, size and color for text buttons for legend and cursor switching&lt;br /&gt;
|-&lt;br /&gt;
!.legend&lt;br /&gt;
|Font, size and background color for legend window&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_chart|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;CIRCLEMENU&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-item-diameter&lt;br /&gt;
|diameter of the circle&lt;br /&gt;
|52&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-circle-radius&lt;br /&gt;
|radius of each item, in pixel&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-direction&lt;br /&gt;
|position of the items in relation to the center&lt;br /&gt;
|&#039;full&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-close-after&lt;br /&gt;
|closing time of the circle-menu&lt;br /&gt;
|(item-count + 1s) or a minimum of 4s&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|keepopen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Optionen für data-direction: top | right | bottom | left | top-right | top-left | bottom-right | bottom-left | top-half | right-half | bottom-half | left-half | full | vertical | horizontal&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_circlemenu|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;DIMMER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|(&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value for ON status to set&lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|value for OFF status to set&lt;br /&gt;
|value of data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-dim&lt;br /&gt;
|name of the reading responsible for dim (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|value of data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|fa-lightbulb-o&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_dimmer|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;HOMESTATUS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|array of fix names to show only in the UI as an alias to the real states&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the data-get-on array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-version&lt;br /&gt;
|name of the status model e.g. &#039;residents&#039;,&#039;roommate&#039;,&#039;guest&#039; &lt;br /&gt;
|(default NULL)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default version has 4 states: &#039;1&#039;,&#039;2&#039;,&#039;3&#039;,&#039;4&#039; The default aliases are &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;; data-version=&#039;residents&#039; or &#039;roommate&#039; or &#039;guest&#039; has 5 states (&#039;home&#039;,&#039;asleep&#039;,&#039;absent&#039;,&#039;gone&#039;,&#039;gotosleep&#039;) They have these aliases &#039;Home&#039;,&#039;Night&#039;,&#039;Away&#039;,&#039;Holiday&#039;,&#039;Retire&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_homestatus|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;image&amp;quot;&amp;gt;&#039;&#039;&#039;IMAGE&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get an URL from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-size&lt;br /&gt;
|width of the image in px or %, the height scales proportionally&lt;br /&gt;
|50%&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the image to show (use data-url or data-device + data-get, not both)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-refresh&lt;br /&gt;
|Interval in seconds for image refresh for usage together with data-url&lt;br /&gt;
|900&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_image|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;label&amp;quot;&amp;gt;&#039;&#039;&#039;LABEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fix&lt;br /&gt;
|keeping a specified number of decimals. &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; non-numeric&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-part&lt;br /&gt;
|split position of the space separated value to show or an RegEx&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-get&lt;br /&gt;
|name of the DEVICE:Reading to colorize the label &lt;br /&gt;
|data-device:data-get&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|an array of numeric values to affect the colour of the Label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits-part&lt;br /&gt;
|part number of the space separated value to show or a RegEx &lt;br /&gt;
|&#039;-1&#039; -&amp;gt; all&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-unit&lt;br /&gt;
|add a unit after a numeric value. use encoded strings e.g. &amp;quot;%B0C%0A&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-substitution&lt;br /&gt;
|regex-substitution to apply on the value. Standard regex notation (s/regex/subst/modifier) is expected&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|small, large, big, bigger, thin, red, green, blue, darker, timestamp, w1x, w2x, w3x, fixedlabel, icon, bg-limit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Mit der Class &#039;fixedlabel&#039; kann man Label einbauen, die einen festen Text (direkt im HTML) haben, aber trotzdem die Farbe per Reading Value beeinflusst werden könnte.&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;icon&#039; kann man Label einbauen, die wie Icons aussehen. Als Hintergrund gibt es &#039;icon round&#039; (rund), &#039;icon square&#039; (Rechteck mit abgerundeten Ecken) und &#039;icon squareborder&#039; (Rechteck mit abgerundeten Ecken und einem zusätzlichen Rand).&amp;lt;br&amp;gt;&lt;br /&gt;
Mit der Class &#039;bg-limit&#039; wird der Hintergrund des Icon auf grün oder rot gesetzt, passend zum on/off Status des data-limits.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_label|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;level&amp;quot;&amp;gt;&#039;&#039;&#039;LEVEL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|&#039;0&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|&#039;100&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|a array of color values to affect the colour of the label according to the limit value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-limits&lt;br /&gt;
|a array of numeric or RegEx values to affect the colour of the label&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|mini, horizontal&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_level|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;PAGETAB&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL of the new page to show&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&#039;fa-power-off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|color of OFF state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|color of ON state&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|color of Off state&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|array of status to assign a special icon-list from data-icons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|array of icons related to the a data-get-on array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|warn, activate (as additionals for data-icons)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_pagetab|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;playstream&amp;quot;&amp;gt;&#039;&#039;&#039;PLAYSTREAM&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-url&lt;br /&gt;
|URL des Radio-Streams&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the control state from FHEM&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for PLAY status to get. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for STOP status to get. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-volume&lt;br /&gt;
|name of the reading to get the volume value (0-100) &lt;br /&gt;
|volume&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_playstream|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;popup&amp;quot;&amp;gt;&#039;&#039;&#039;POPUP&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading where to get the alert value from&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value which trigger to open the dialog&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value which trigger to close the dialog &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_popup|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;progress&amp;quot;&amp;gt;&#039;&#039;&#039;PROGRESS&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set or name of the reading which helds the max value&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|novalue, percent&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_progress|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;push&amp;quot;&amp;gt;&#039;&#039;&#039;PUSH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
| name of the reading to set on FHEM (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|value to send when the the button get pressed oder ein Array zwischen dessen Werten umgeschaltet werden kann&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|name of the font-awesome icon&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-doubleclick&lt;br /&gt;
|timeout to wait for a second click or touch. &#039;0&#039; disables the doubleclick feature. &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-countdown&lt;br /&gt;
|secondes for the countdown progress control &lt;br /&gt;
|autodetect from &#039;on-for-timer&#039; command&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|name of the font-awesome icon for background &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|fix color attribute for OFF state or DEVICE:READING for dynamic setting &lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|fix color attribute for Off state or DEVICE:READING for dynamic setting&lt;br /&gt;
|#505050&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_push|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;rotor&amp;quot;&amp;gt;&#039;&#039;&#039;ROTOR&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; | data-delay&lt;br /&gt;
|time in millisecondes to wait until next list item get shown&lt;br /&gt;
|3500&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fade, rotate&lt;br /&gt;
|&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Ohne Angabe von class erfolgt keine Animation.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_rotor|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;select&amp;quot;&amp;gt;&#039;&#039;&#039;SELECT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading that get the selected item of the list&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|name of the reading to set on Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-list&lt;br /&gt;
|name of the reading to get a :-separated list from Fhem&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-items&lt;br /&gt;
|an array of fix items to show in the selection box (alternative if data-list is empty)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-alias&lt;br /&gt;
|an array of fix names to show only in the selection box as an alias to the real items&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command to send to Fhem (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-quote&lt;br /&gt;
|characters to enclose the send value&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|wider, w1x, w2x, w3x, large, big&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_select|Link zu einem Beispiel]]&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;simplechart&amp;quot;&amp;gt;&#039;&#039;&#039;SIMPLECHART&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logdevice&lt;br /&gt;
|name of the logdevice (e.g. FileLog_WohnzimmerHeizung)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-logfile&lt;br /&gt;
|name of the logfile (e.g. WohnzimmerHeizung-2015.log)&lt;br /&gt;
|&#039;-&#039; means current logfile&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-columnspec&lt;br /&gt;
|definition for how to find the values (e.g. &amp;quot;4:meas.*:1:int&amp;quot;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minvalue&lt;br /&gt;
|min Y value to Show or an array of values for dynamic minY &lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxvalue&lt;br /&gt;
|max Y value to Show or an array of values for dynamic maxY &lt;br /&gt;
|30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yticks&lt;br /&gt;
|value distance between Y tick lines&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-xticks&lt;br /&gt;
|time range between each X tick line (in Minuten)&lt;br /&gt;
|360 minutes&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-daysago&lt;br /&gt;
|number of days back from now &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-caption&lt;br /&gt;
|name of the chart to show as text &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-yunit&lt;br /&gt;
|unit of the value to show beside of each Y ticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|fixe size for width (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|fixe size for height (in % or px)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|fullsize, noticks&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_simplechart|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-logfile&amp;lt;/code&amp;gt; kann man auch weglassen, dann greift der Defaultwert &amp;quot;-&amp;quot;. Damit wird das neuste Logfile gelesen.&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;div id=&amp;quot;slider&amp;quot;&amp;gt;&#039;&#039;&#039;SLIDER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger)&lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|100&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on&lt;br /&gt;
|value where the slider moves to max&lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off&lt;br /&gt;
|value where the slider moves to min&lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-value&lt;br /&gt;
|wenn true wird beim sliden der Wert angezeigt&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-width&lt;br /&gt;
|width for horizontal sliders&lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-height&lt;br /&gt;
|height for vertical sliders &lt;br /&gt;
|&#039;120px&#039;, for mini &#039;60px&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|Aussehen/Ausrichtung&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für class steht mini, horizontal und negated (0 liegt oben) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_slider|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;switch&amp;quot;&amp;gt;&#039;&#039;&#039;SWITCH&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML-Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default-Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert, bei dem zum Status ON geschaltet werden soll. &lt;br /&gt;
|&#039;on&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert, bei dem zum Status OFF geschaltet werden soll. &lt;br /&gt;
|&#039;off&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf ON geschaltet wurde  &lt;br /&gt;
|Wert von data-get-on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert, der zu Fhem gesendet werden soll, wenn das Widget auf OFF geschaltet wurde &lt;br /&gt;
|Wert von data-get-off&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-cmd&lt;br /&gt;
|Kommando Name (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) &amp;lt;br /&amp;gt;(z.B setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des Font-Awesome Icon. &lt;br /&gt;
|&#039;fa-lightbulb-o&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Name des Font-Awesome Hintergrund Icon. &lt;br /&gt;
|&#039;fa-circle&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Widget Farbe beim Status ON &lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Widget Farbe beim Status OFF &lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data-get-on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;data-get-off&amp;lt;/code&amp;gt; accept also RegEx values. e.g. data-get-on=&amp;quot;[0-9]{1,3}|on&amp;quot; means set switch on if STATE is a numeric value or &#039;on&#039;. data-get-off=&amp;quot;!on&amp;quot; means accept all but the data-get-on value (negation)&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_switch|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;symbol&amp;quot;&amp;gt;&#039;&#039;&#039;SYMBOL&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dual state notation&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|value for ON status to get. &lt;br /&gt;
|&#039;open&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|value for OFF status to get. &lt;br /&gt;
|&#039;closed&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icon&lt;br /&gt;
|Name des font-awesome-Symbols  &lt;br /&gt;
|&#039;ftui-window&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icon&lt;br /&gt;
|Hintergrundsymbol&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-background-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-background-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-on-color&lt;br /&gt;
|Farbe für ON-Zustand.&lt;br /&gt;
|&#039;#aa6900&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-off-color&lt;br /&gt;
|Farbe für OFF-Zustand.&lt;br /&gt;
|&#039;#505050&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
multi state notation&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Name des Reading, was gelesen werden soll&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-states&lt;br /&gt;
|array of states. &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-icons&lt;br /&gt;
|Array mit Icons zu data-states Array&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-colors&lt;br /&gt;
|array of colors related to the data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-background-colors&lt;br /&gt;
|array of background-colors related to the data-states array&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
data-get-on,data-get-off and data-states accept also RegEx values. The value for one icon can also contain an additional animatation CSS name, e.g. &amp;quot;fa-exclamation-triangle fa-blink&amp;quot; for a blinking Symbol&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_symbol|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;THERMOSTAT&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-temp&lt;br /&gt;
|reading for measured temperature of thermostates&lt;br /&gt;
|&#039;measured-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;desired-temp&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-valve&lt;br /&gt;
|reading for valve position of thermostates&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-minColor&lt;br /&gt;
|Farbe des Keises für Min&lt;br /&gt;
| #4477FF&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-maxColor&lt;br /&gt;
|Farbe des Kreises für Max, zwischen Min und Max wird linear interpoliert &lt;br /&gt;
| #FF0000&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-step&lt;br /&gt;
|step size for value adjustment e.g. 0.5 &lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-bgColor&lt;br /&gt;
|Die Farbe der Kreises zwischen den ticks&lt;br /&gt;
|&#039;transparent&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-fgColor&lt;br /&gt;
|Die Farbe der zahl im Kreismittelpunkt&lt;br /&gt;
|#bbbbbb&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-tkColor&lt;br /&gt;
|Die Farbe der ticks&lt;br /&gt;
|#696969&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleOffset&lt;br /&gt;
|Start der ticks im Kreis (in Winkelgraden, 0 = oben)&lt;br /&gt;
| -120&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-angleArc&lt;br /&gt;
|Bereich der ticks im Kreis (in Winkelgraden)&lt;br /&gt;
|240&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|big, readonly&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_thermostat|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;volume&amp;quot;&amp;gt;&#039;&#039;&#039;VOLUME&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get from Fhem &lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|command to send to Fhem (set &amp;lt;device&amp;gt; &amp;lt;command&amp;gt; &amp;lt;value&amp;gt;)&lt;br /&gt;
|&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;rigth&amp;quot; |data-cmd&lt;br /&gt;
|name of the command (&amp;lt;command&amp;gt; &amp;lt;device&amp;gt; &amp;lt;value&amp;gt;) (e.g. setstate, set, setreading, trigger) &lt;br /&gt;
|&#039;set&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-min&lt;br /&gt;
|minimal value to set&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-max&lt;br /&gt;
|maximal value to set&lt;br /&gt;
|70&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|small, hue-tick, hue-front, hue-back, dim-tick ,dim-front, dim-back&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_volume|Link zu einem Beispiel]] (fehlt noch)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;weather&amp;quot;&amp;gt;&#039;&#039;&#039;WEATHER&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!HTML Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|name of the reading to get the weather literal from Fhem&lt;br /&gt;
|&#039;STATE&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-imageset&lt;br /&gt;
|collection of images to display current weather situation. Possible values: &#039;meteocons&#039;, &#039;kleinklima&#039;&lt;br /&gt;
|&#039;meteocons&#039;&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-image-path&lt;br /&gt;
|path to the images of the selected imageset&lt;br /&gt;
|/images/weather/&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[#Beispiel_weather|Link zu einem Beispiel]]&lt;br /&gt;
&lt;br /&gt;
== Widgets -- Beispiele ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_chart&amp;quot;&amp;gt;&#039;&#039;&#039;Chart&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Display a chart with similar capabilities as the FHEM plots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;normal&amp;quot;&amp;gt;&lt;br /&gt;
	data-type=&amp;quot;chart&amp;quot;&lt;br /&gt;
	data-logdevice=&#039;[&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Predicted&amp;quot;]&#039;&lt;br /&gt;
	data-columnspec=&#039;[&amp;quot;4:Garden.T:15:&amp;quot;,&amp;quot;10:Garden.T:0:delta-h&amp;quot;,&amp;quot;10:Garden.T:0:delta-d&amp;quot;,&amp;quot;4:predicted.*:15:&amp;quot;]&#039;&lt;br /&gt;
	data-style=&#039;[&amp;quot;ftui l0fill&amp;quot;,&amp;quot;ftui l1fill&amp;quot;,&amp;quot;ftui l2&amp;quot;,&amp;quot;ftui l3dot&amp;quot;]&#039;&lt;br /&gt;
	data-ptype=&#039;[&amp;quot;lines&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;cubic&amp;quot;]&#039;&lt;br /&gt;
	data-uaxis=&#039;[&amp;quot;primary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;primary&amp;quot;]&#039;&lt;br /&gt;
	data-legend=&#039;[&amp;quot;Temperature&amp;quot;,&amp;quot;Rain/hour&amp;quot;,&amp;quot;Rain/day&amp;quot;,&amp;quot;Predicted Temp.&amp;quot;]&#039;&lt;br /&gt;
	data-yunit=&amp;quot;°C&amp;quot;&lt;br /&gt;
	data-ytext=&amp;quot;Temperature&amp;quot;&lt;br /&gt;
	data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-yunit_sec=&amp;quot;mm&amp;quot;&lt;br /&gt;
	data-ytext_sec=&amp;quot;Rain (mm)&amp;quot;&lt;br /&gt;
	data-height=&amp;quot;250&amp;quot;&lt;br /&gt;
	data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
	data-daysago_start=&amp;quot;2013-08-13T00:00:00&amp;quot;&lt;br /&gt;
	data-daysago_end=&amp;quot;2013-08-14T00:00:00&amp;quot;&lt;br /&gt;
	data-cursorgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-scrollgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-xticks=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:chart_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_circlemenu&amp;quot;&amp;gt;&#039;&#039;&#039;Circlemenu&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cover a lot of other button behind one single button&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;circlemenu&amp;quot; class=&amp;quot;cell circlemenu&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-icon=&amp;quot;fa-wrench&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -6&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-6&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level -2&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;-2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level 0&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;0&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +3&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +9&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&amp;lt;div data-type=&amp;quot;push&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; &lt;br /&gt;
               data-set=&amp;quot;remoteControl subwoofer-temporary-level +C&amp;quot; &lt;br /&gt;
               data-icon=&amp;quot;&amp;quot;&amp;gt;12&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Woofer&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:circlemenu_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_dimmer&amp;quot;&amp;gt;&#039;&#039;&#039;Dimmer&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget Beispiel für Philips Hue&lt;br /&gt;
&lt;br /&gt;
Minimalvariante&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;!off&amp;quot; data-get-off=&amp;quot;off&amp;quot;&lt;br /&gt;
        data-set=&amp;quot;pct&amp;quot;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Anzeige der Dimstufe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot; data-device=&amp;quot;HUEDevice1&amp;quot;&lt;br /&gt;
       data-get=&amp;quot;onoff&amp;quot;&lt;br /&gt;
       data-get-on=&amp;quot;1&amp;quot; data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
       data-set=&amp;quot;&amp;quot;&lt;br /&gt;
       data-set-on=&amp;quot;on&amp;quot; data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
       data-dim=&amp;quot;pct&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimmer Widget für MilightDevice&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;dimmer&amp;quot;&lt;br /&gt;
  data-device=&amp;quot;SonstWas&amp;quot;&lt;br /&gt;
  data-get=&amp;quot;brightness&amp;quot;&lt;br /&gt;
  data-get-off=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-get-on=&amp;quot;[1-9][0-9]*&amp;quot;&lt;br /&gt;
  data-set-on=&amp;quot;on&amp;quot;&lt;br /&gt;
  data-set-off=&amp;quot;off&amp;quot;&lt;br /&gt;
  data-dim=&amp;quot;dim&amp;quot;&lt;br /&gt;
  data-min=&amp;quot;0&amp;quot;&lt;br /&gt;
  data-max=&amp;quot;100&amp;quot;&lt;br /&gt;
&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_homestatus&amp;quot;&amp;gt;&#039;&#039;&#039;Homestatus&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel rechts im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
       data-get-on=&#039;[&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;]&#039;&lt;br /&gt;
       data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;]&#039;&lt;br /&gt;
       data-icons=&#039;[&amp;quot;fa-home&amp;quot;,&amp;quot;fa-bed&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-suitcase&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel links im Bild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;homestatus&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-get-on=&#039;[&amp;quot;home&amp;quot;,&amp;quot;asleep&amp;quot;,&amp;quot;absent&amp;quot;,&amp;quot;gone&amp;quot;,&amp;quot;gotosleep&amp;quot;]&#039;&lt;br /&gt;
        data-alias=&#039;[&amp;quot;Home&amp;quot;,&amp;quot;Night&amp;quot;,&amp;quot;Away&amp;quot;,&amp;quot;Holiday&amp;quot;,&amp;quot;Retire&amp;quot;]&#039;&lt;br /&gt;
        data-icons=&#039;[&amp;quot;fa-fire&amp;quot;,&amp;quot;fa-film&amp;quot;,&amp;quot;fa-plus&amp;quot;,&amp;quot;fa-car&amp;quot;,&amp;quot;fa-tint&amp;quot;]&#039;&lt;br /&gt;
        data-version=&#039;residents&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:homestatus_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_image&amp;quot;&amp;gt;&#039;&#039;&#039;Image&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erzeugt ein Widget mit einem Bild aus dem www, das alle 5 Sekunden aktualisiert wird (hier eine Wetterkarte vom DWD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot;&lt;br /&gt;
     data-size=&amp;quot;80%&amp;quot;&lt;br /&gt;
     data-url=&amp;quot;http://www.dwd.de/wundk/wetter/de/Deutschland.jpg&amp;quot;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:image_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for how to add an image to the dashboard which its URL is delivered by a Fhem module like PROPLANTA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;image&amp;quot; data-device=&amp;quot;Wetter1&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDayIcon&amp;quot; &lt;br /&gt;
     data-size=&amp;quot;40px&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_label&amp;quot;&amp;gt;&#039;&#039;&#039;Label&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
STATE   T: 20.0 H: 61&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;2&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; data-part=&amp;quot;4&amp;quot; &lt;br /&gt;
     data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But the same result can reached by getting single readings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
humidity    58&lt;br /&gt;
temperature 20.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;temperature&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Temperatur&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;THSensorWZ&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;humidity&amp;quot; data-unit=&amp;quot;%&amp;quot; class=&amp;quot;cell big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Luftfeuchte&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to influence the color of the label according to value limits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;OutTemp&amp;quot; &lt;br /&gt;
     data-limits=&#039;[-73,10,23]&#039; &lt;br /&gt;
     data-colors=&#039;[&amp;quot;#6699FF&amp;quot;,&amp;quot;#AA6900&amp;quot;,&amp;quot;#FF0000&amp;quot;]&#039; &lt;br /&gt;
     data-unit=&amp;quot;%B0C%0A&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a widget for shutter via push: show state and set up/down&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;wzRollo&amp;quot; &lt;br /&gt;
     data-get-on=&amp;quot;up&amp;quot; &lt;br /&gt;
     data-get-off=&amp;quot;down&amp;quot; &lt;br /&gt;
     data-icon=&amp;quot;fa-bars&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;Rollo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a label for a time value in short format with usage of RegEx.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-part=&amp;quot;(\d\d\.\d\d\.).*&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to show two labels in one line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunrise&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;bis&lt;br /&gt;
   &amp;lt;div type=&amp;quot;label&amp;quot; device=&amp;quot;OnSunset&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des UV-Indexes und der Abhängigkeit der anzuzeigenden Farbe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc0_uv&amp;quot;&lt;br /&gt;
        data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot; &lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc0_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;wider cell bigger&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot;&lt;br /&gt;
        data-get=&amp;quot;fc1_uv&amp;quot;&lt;br /&gt;
	data-limits=&amp;quot;[-2, 2, 5, 7, 10]&amp;quot;&lt;br /&gt;
	data-colors=&#039;[&amp;quot;#66FF33&amp;quot;,&amp;quot;#FFFF00&amp;quot;,&amp;quot;#FF6600&amp;quot;,&amp;quot;#FF0000&amp;quot;,&amp;quot;#993399&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot; data-device=&amp;quot;ProVorhersage&amp;quot; data-get=&amp;quot;fc1_date&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:label_tabletUI.jpg]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Anzeige des Labels als Icon.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon round bg-red cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon square bg-blue cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-get=&amp;quot;input&amp;quot; class=&amp;quot;icon squareborder cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;PowerAV_Sw&amp;quot; data-colors=&#039;[&amp;quot;red&amp;quot;,&amp;quot;green&amp;quot;]&#039; data-limits=&#039;[&amp;quot;off&amp;quot;,&amp;quot;on&amp;quot;]&#039; class=&amp;quot;icon round bg-limit cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Label_tabletUI_icon.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_pagetab&amp;quot;&amp;gt;&#039;&#039;&#039;Pagetab&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tab menu to switch smoothly between multiple pages. Multiple pagetabs in a template file: menu.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt;MENU&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index.html&amp;quot;  data-icon=&amp;quot;fa-home&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_2.html&amp;quot; data-icon=&amp;quot;fa-sliders&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_3.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_4.html&amp;quot; data-icon=&amp;quot;fa-hotel&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_5.html&amp;quot; data-icon=&amp;quot;fa-music&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_6.html&amp;quot; data-icon=&amp;quot;fa-database&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div data-type=&amp;quot;pagetab&amp;quot; data-url=&amp;quot;index_7.html&amp;quot; data-icon=&amp;quot;fa-fax&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_playstream&amp;quot;&amp;gt;&#039;&#039;&#039;Playstream&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt einen Knopf zum direkten Abspielen eines Webradio-Streams.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;playstream&amp;quot; data-url=&amp;quot;http://radioeins.de/stream&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Radio eins&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_push&amp;quot;&amp;gt;&#039;&#039;&#039;Push&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for how to create a push button widget to trigger all devices on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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=&amp;quot;on&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei horizontale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für zwei quadratische vertikale Buttons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell&amp;quot;&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=&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=&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:push2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_rotor&amp;quot;&amp;gt;&#039;&#039;&#039;Rotor&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a rotor widget, which switches between to days of weather forecast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;rotor&amp;quot; class=&amp;quot;fade&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Heute&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc0_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;darker&amp;quot;&amp;gt;Morgen&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;big&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_weatherDay&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;fc1_tempMax&amp;quot; data-unit=&amp;quot;%B0C%0A&amp;quot; class=&amp;quot;large&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_select&amp;quot;&amp;gt;&#039;&#039;&#039;Select&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt zwei Comboboxen zur Auswahl des Eingang eines 2-Zonen-AV-Receivers. Die Liste für Zone2 ist fest, die Liste für Zone1 wird von Fhem übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell wider&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline wider&amp;quot;&amp;gt;Zone2&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiverZ2&amp;quot; data-items=&#039;[&amp;quot;Airplay&amp;quot;,&amp;quot;Webradio&amp;quot;,&amp;quot;BD/DVD&amp;quot;,&amp;quot;PHONO&amp;quot;]&#039; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;inline&amp;quot;&amp;gt;Zone1&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div data-type=&amp;quot;select&amp;quot; data-device=&amp;quot;AvReceiver&amp;quot; data-list=&amp;quot;inputs&amp;quot; data-get=&amp;quot;input&amp;quot; data-set=&amp;quot;input&amp;quot; class=&amp;quot;cell w2x&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:select_tabeltUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_slider&amp;quot;&amp;gt;&#039;&#039;&#039;Slider&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Slider mit einstellbaren Werten von 10 bis 90:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot; &lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;10&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;90&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Light1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Horizontal angeordneter Slider:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;slider&amp;quot;&lt;br /&gt;
     data-device=&#039;Dummy1&#039; &lt;br /&gt;
     data-min=&amp;quot;0&amp;quot; &lt;br /&gt;
     data-max=&amp;quot;100&amp;quot; &lt;br /&gt;
     class=&amp;quot;horizontal&amp;quot; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:slider_tabletUI2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_switch&amp;quot;&amp;gt;&#039;&#039;&#039;Switch&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schalter. Usage of RegEx pattern for state request:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;switch&amp;quot; class=&amp;quot;cell&amp;quot; &lt;br /&gt;
            data-device=&amp;quot;MILIGHT_Zone1_Wohnzimmer&amp;quot; &lt;br /&gt;
            data-get-on=&amp;quot;on.*&amp;quot;&lt;br /&gt;
            data-get-off=&amp;quot;off&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch.png]]&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine Gruppe von Schaltern, um zwischen vier verschiedenen Werten eines device umzuschalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;cell left&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert1).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert1&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert1&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert2).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert2&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert2&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert3).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert3&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert3&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
      data-get-off=&amp;quot;((?!Wert4).)*&amp;quot; &lt;br /&gt;
      data-get-on=&amp;quot;Wert4&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;cell&amp;quot;&amp;gt;Wert4&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:switch4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_symbol&amp;quot;&amp;gt;&#039;&#039;&#039;Symbol&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;wert1&amp;quot;,&amp;quot;wert2&amp;quot;,&amp;quot;wert3&amp;quot;]&#039; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-arrow-up&amp;quot;,&amp;quot;fa-user&amp;quot;,&amp;quot;fa-arrow-down&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;SeaGreen&amp;quot;,&amp;quot;SlateBlue&amp;quot;,&amp;quot;IndianRed&amp;quot;]&#039; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a tristate icon with blink and spin animation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;dummy1&amp;quot; &lt;br /&gt;
     data-icons=&#039;[&amp;quot;fa-exclamation-triangle fa-blink&amp;quot;,&amp;quot;fa-exclamation-circle&amp;quot;,&amp;quot;fa-cog fa-spin&amp;quot;]&#039; &lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;Crimson&amp;quot;,&amp;quot;GoldenRod&amp;quot;,&amp;quot;SeaGreen&amp;quot;]&#039; &lt;br /&gt;
     data-get-on=&#039;[&amp;quot;Wert1&amp;quot;,&amp;quot;Wert2&amp;quot;,&amp;quot;Wert3&amp;quot;]&#039; &amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with RegEx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
     data-icons=&#039;[&amp;quot;oa-measure_battery_100&amp;quot;,&amp;quot;oa-measure_battery_75&amp;quot;,&amp;quot;oa-measure_battery_50&amp;quot;,&amp;quot;oa-measure_battery_25&amp;quot;,&amp;quot;oa-measure_battery_0&amp;quot;]&#039;&lt;br /&gt;
     data-get-on=&#039;[&amp;quot;3\\.[0-9]&amp;quot;,&amp;quot;2\\.[789]&amp;quot;,&amp;quot;2\\.[456]&amp;quot;,&amp;quot;2\\.[123]&amp;quot;,&amp;quot;((2\\.0)|([01]\\.[0-9]))&amp;quot;]&#039;&lt;br /&gt;
     data-on-colors=&#039;[&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for a battery level control with greater-equal compare and 90° rotated symbols&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&amp;quot;BadHeizung&amp;quot; data-get=&amp;quot;batteryLevel&amp;quot;&lt;br /&gt;
    data-icons=&#039;[&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_25 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_50 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_75 fa-rotate-90&amp;quot;,&amp;quot;oa-measure_battery_0 fa-rotate-90&amp;quot;]&#039;&lt;br /&gt;
    data-get-on=&#039;[&amp;quot;0&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;2.4&amp;quot;,&amp;quot;2.7&amp;quot;,&amp;quot;3.0&amp;quot;]&#039;&lt;br /&gt;
    data-on-colors=&#039;[&amp;quot;#ad3333&amp;quot;,&amp;quot;#ad3333&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;,&amp;quot;#505050&amp;quot;]&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_thermostat&amp;quot;&amp;gt;&#039;&#039;&#039;Thermostat&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure as data-device=&#039;...&#039; that item which delivers temp and desired-temp as reading.&lt;br /&gt;
&lt;br /&gt;
Default parameters are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data-get=&amp;quot;desired-temp&amp;quot; data-temp=&amp;quot;measured-temp&amp;quot; data-set=&amp;quot;desired-temp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefor for HomaMatic HM-CC-RT-DN this is sufficient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&#039;KH_Clima&#039; class=&amp;quot;cell&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The long format looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;KH_Clima&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;desired-temp&amp;quot; &lt;br /&gt;
     data-temp=&amp;quot;measured-temp&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example for MAX!:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;thermostat&amp;quot; data-device=&amp;quot;HZ_Tuer&amp;quot; &lt;br /&gt;
    data-valve=&amp;quot;valveposition&amp;quot; &lt;br /&gt;
    data-get=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    data-temp=&amp;quot;temperature&amp;quot; &lt;br /&gt;
    data-set=&amp;quot;desiredTemperature&amp;quot; &lt;br /&gt;
    class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The wigets will show the valve value only in case of a valid data-valve attribute. The default for data-valve ist null. That means, a empty data-valve attribute hides the valve label for the widget.&lt;br /&gt;
&lt;br /&gt;
[[Datei:thermostat.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Beispiel_weather&amp;quot;&amp;gt;&#039;&#039;&#039;Weather&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Widget fügt ein dem Wetter entsprechendes Bild ein. Die Daten können durch Fhem-Module wie [[PROPLANTA]], [[OPENWEATHER]] und [[Weather]] bereitgestellt werden. &lt;br /&gt;
Add &#039;big&#039; or &#039;bigger&#039; to CSS class to get a bigger weather icon.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;weather&amp;quot; &lt;br /&gt;
     data-device=&amp;quot;Weather&amp;quot; &lt;br /&gt;
     data-get=&amp;quot;fc0_weatherDay&amp;quot; &lt;br /&gt;
     class=&amp;quot;cell big&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:weather.png]]&lt;br /&gt;
&lt;br /&gt;
== Icon-Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* Eingebaute Icons: Diese haben das ftui-Präfix. Zurzeit sind folgende verfügbar: ftui-window, ftui-door&lt;br /&gt;
&lt;br /&gt;
* Mehr als 500 Icons von &amp;quot;http://fortawesome.github.io/Font-Awesome/icons&amp;quot; verfügbar. Einfach den Icon-Namen angeben (Präfix &amp;quot;fa-&amp;quot; nicht vergessen, Z.B. &amp;lt;code&amp;gt;data-icon=&amp;quot;fa-volume-up&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Es stehen auch Openautomation Font-Files zur Verfügung. Wer sie nutzen möchte, muss folgende Stylesheets in die index.html hinzufügen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/openautomation.css&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/lib/fhemSVG.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese font icons haben das Präfix &#039;fs-&#039; bzw. &#039;oa-&#039;.&lt;br /&gt;
&lt;br /&gt;
Beispiel bei einem Schalter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div data-type=&amp;quot;switch&amp;quot; data-device=&#039;dummy1&#039; data-icon=&amp;quot;oa-secur_locked&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und so als großes Symbol:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-device=&#039;dummy1&#039;&lt;br /&gt;
        data-icon=&amp;quot;oa-status_frost&amp;quot;&lt;br /&gt;
        data-on-color=&amp;quot;#bb3232&amp;quot;&lt;br /&gt;
        data-get-on=&amp;quot;on&amp;quot;&lt;br /&gt;
        data-get-off=&amp;quot;!on&amp;quot;&lt;br /&gt;
        class=&amp;quot;bigger&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Icons kann man auch etwas dicker darstellen mit den Zusatz bold: &amp;lt;code&amp;gt;data-icon=&amp;quot;oa-secur_locked bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Namen der verfügbaren Icons findet man auch in den CSS Files (openautomation.css / fhemSVG.css)&lt;br /&gt;
&lt;br /&gt;
== Spezial ==&lt;br /&gt;
Folgender Befehl setzt einen direkten Befehl an Fhem ab (&amp;lt;code&amp;gt;set dummy1 off&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     &amp;lt;div onclick=&amp;quot;setFhemStatus(&#039;set dummy1 off&#039;)&amp;quot;&amp;gt;All off!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM_Tablet_UI/FAQ|FHEM Tablet UI FAQ]] zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,34233.0.html Forums-Beitrag]&lt;br /&gt;
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,37378.0.html User-Demos]&lt;br /&gt;
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Label_tabletUI_icon.png&amp;diff=14279</id>
		<title>Datei:Label tabletUI icon.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Label_tabletUI_icon.png&amp;diff=14279"/>
		<updated>2016-02-20T09:53:24Z</updated>

		<summary type="html">&lt;p&gt;Amenophis86: Beispiel um Label als Icon zu nutzen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispiel um Label als Icon zu nutzen.&lt;/div&gt;</summary>
		<author><name>Amenophis86</name></author>
	</entry>
</feed>