<?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=SirUli</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=SirUli"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/SirUli"/>
	<updated>2026-04-10T02:42:06Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ABFALL&amp;diff=30709</id>
		<title>ABFALL</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ABFALL&amp;diff=30709"/>
		<updated>2019-06-10T18:04:59Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Falsche Namensreferenz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Filtern von (Abfall-)Terminen aus einem Calendar.&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=48237&lt;br /&gt;
|ModForumArea=Codeschnipsel&lt;br /&gt;
|ModTechName=57_ABFALL.pm&lt;br /&gt;
|ModOwner=Constantin / {{Link2FU|14026|uniqueck}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[ABFALL]] ist ein (inoffizielles, nicht Bestandteil der Distribution) Hilfsmodul, das bestimmte Termine aus einem bestehenden Kalender des Moduls [[Calendar]] in Readings übernimmt. &lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss ein [[Calendar]]-Objekt definiert sein. Der dabei benutzte Name muss in der Definition des ABFALL-Objekts spezifiziert werden.&lt;br /&gt;
Es können auch mehrere Calendar Objekte übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Sonderzeichen aus dem Namen der Termine, werden entfernt um die Namen der generierten Readings FHEM tauglich zu machen, für die Werte der Readings bleiben diese allerdings erhalten.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Mit folgendem Befehl kann das Modul direkt in den Standard FHEM Update Prozess eingeklinkt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
Um es nur zu installieren, kann auch einfach nur das Command&lt;br /&gt;
:&amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsstrang ===&lt;br /&gt;
:&amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
:&amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Define ===&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;Name&amp;gt; ABFALL &amp;lt;calendarname&amp;gt;,&amp;lt;calendarname2&amp;gt;,...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erläuterung der Parameter im &#039;&#039;&#039;define&#039;&#039;&#039;:&lt;br /&gt;
;&amp;lt;calendarname&amp;gt;&lt;br /&gt;
:Name des &#039;&#039;&#039;Calendar&#039;&#039;&#039; Kalenders &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;define AbfallGoogleCalender Calendar ical url https://......&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define myABFALL ABFALL AbfallGoogleCalender&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Werte aktualisieren ===&lt;br /&gt;
Die Werte aktualisieren sich abhängig vom [[notify]] der entsprechenden Calendar Instanz, welche im define angegeben wurde(n).&lt;br /&gt;
&lt;br /&gt;
=== Weitere Attribute ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Attribut&lt;br /&gt;
!Werteliste&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |calendarname_praefix&lt;br /&gt;
|0 und 1&lt;br /&gt;
|soll der Kalendername als praefix dem Reading vorangestellt werden, sollte bei nur einem Kalender auf 0 gesetzt werden&lt;br /&gt;
|1 - praefix wird vorangestellt, sofern mehrere Kalender angegeben wurden, ansonsten 0 - praefix wird nicht vorangestellt&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |abfall_clear_reading_regex&lt;br /&gt;
|&lt;br /&gt;
|regex zum Entfernen von Anteilen aus dem Termin, dieser wird vor dem Entfernen von Sonderzeichen aus den Namen der Termine angewandt.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |disable&lt;br /&gt;
|0 und 1&lt;br /&gt;
|deaktiviert das Modul&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |weekday_mapping&lt;br /&gt;
|&lt;br /&gt;
|Mapping, wie die Readings der Tage angezeigt werden sollen, zum Beispiel So Mo Di Mi Do Fr Sa&lt;br /&gt;
|Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |delimiter_text_reading&lt;br /&gt;
|&lt;br /&gt;
|Wenn zwei Abholungen an ein und demselben Tag existieren, wird dieses Trennzeichen genutzt, um die beiden (oder mehrere) Werte zu einem Text zu verbinden. Nur relevant für die Readings next_text und now_text&lt;br /&gt;
|und&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |delimiter_reading&lt;br /&gt;
|&lt;br /&gt;
|wie attribute delimiter_text_reading, allerdings nur für die readings next und now&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |filter&lt;br /&gt;
|&lt;br /&gt;
|regex zum Filtern der Namen der Termine aus den Kalendern, so dass nur solche genutzt werden, welche diesem Filter entsprechen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiel(e) ==&lt;br /&gt;
=== Einbindung ins Tablet UI ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div data-device=&amp;quot;myABFALL&amp;quot; data-type=&amp;quot;symbol&amp;quot; class=&amp;quot;bigger warn wider&amp;quot; &lt;br /&gt;
          data-get=&amp;quot;next&amp;quot; data-get-warn=&amp;quot;.*(\d+).*&amp;quot; &lt;br /&gt;
          data-get-on=&#039;[&amp;quot;Restmuell_.*&amp;quot;,&amp;quot;Wertstoff_.*&amp;quot;]&#039;&lt;br /&gt;
          data-colors=&#039;[&amp;quot;#000&amp;quot;,&amp;quot;#6EB54C&amp;quot;]&#039; &lt;br /&gt;
          data-icons=&#039;[&amp;quot;fa-trash-o&amp;quot;,&amp;quot;fa-trash-o&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einbindung ins Tablet UI, erweitert ===&lt;br /&gt;
Fallen die Leerungen zweier verschiedener Tonnen nicht auf den selben Tag, reicht es normalerweise, nur ein Symbol auf der Oberfläche zu platzieren und dieses dann dynamisch zu befüllen. In folgendem Beispiel werden folgende Anforderungen umgesetzt:&lt;br /&gt;
* Anzeige unterschiedlicher Symbole bzw. Farben für Papiertonne, Restmülltonne, Biotonne und gelbe Säcke&lt;br /&gt;
* Anzeige der verbleibenden Tage bis zur Leerung als &amp;quot;Warn&amp;quot;-Marker in Rot, aber nur, wenn die Leerung innerhalb der nächsten 2 Tage ist&lt;br /&gt;
* Blinken des Symbols, wenn die nächste Leerung morgen ansteht&lt;br /&gt;
* Rotation des Symbols, wenn die nächste Leerung noch am selben Tag ansteht. Nach einer bestimmten Uhrzeit (z.B. 9 Uhr morgens) soll dann auf die nächste Tonne geschaltet werden&lt;br /&gt;
* Anzeige des Datums bzw. von &amp;quot;heute&amp;quot; oder &amp;quot;morgen&amp;quot; unter dem Symbol als Label&lt;br /&gt;
&lt;br /&gt;
Zur Datumsanzeige wird eine kleine Hilfsfunktion in die 99_myUtils eingebaut. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub datumHeuteMorgen($){&lt;br /&gt;
		my $compareDate = shift;&lt;br /&gt;
		my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);&lt;br /&gt;
		$year += 1900; $mon += 1; &lt;br /&gt;
		my $heute = sprintf(&#039;%02d.%02d.%04d&#039;, $mday, $mon, $year);&lt;br /&gt;
		($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time+86400);&lt;br /&gt;
		$year += 1900; $mon += 1;&lt;br /&gt;
		my $morgen = sprintf(&#039;%02d.%02d.%04d&#039;, $mday, $mon, $year);&lt;br /&gt;
		return &amp;quot;heute&amp;quot; if $compareDate eq $heute;&lt;br /&gt;
		return &amp;quot;morgen&amp;quot; if $compareDate eq $morgen;&lt;br /&gt;
		return $compareDate;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Funktion wird in den userReadings des Abfall-Moduls verwendet. Das Abfallmodul erzeugt eine Gruppe von Readings mit dem Namen now_*, wenn die Leerung am selben Tag ansteht, bzw. genau dann, wenn der Termin im zu Grunde liegenden Kalender gerade aktiv ist. In diesem Beispiel liegt dem Kalender-Modul ein Google-Kalender zu Grunde, bei dem die Termine immer von 0 Uhr bis 9 Uhr morgens eingetragen sind. Dadurch wird erreicht, dass die Anzeige nach 9 Uhr weiterspringt, weil dann die now-Readings verschwinden.&lt;br /&gt;
&lt;br /&gt;
Folgende userReadings werden zum Abfallmodul hinzugefügt, welches in diesem Beispiel &amp;quot;myABFALL&amp;quot; genannt ist:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr myABFALL userReadings ftui_datum {ReadingsVal(&amp;quot;myABFALL&amp;quot;,&amp;quot;now_text&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;&amp;quot; ? datumHeuteMorgen(ReadingsVal(&amp;quot;myABFALL&amp;quot;,&amp;quot;next_date&amp;quot;,&amp;quot;&amp;quot;)) : &amp;quot;heute&amp;quot;;},ftui_next {ReadingsVal(&amp;quot;myABFALL&amp;quot;,&amp;quot;now_text&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;&amp;quot; ? ReadingsVal(&amp;quot;myABFALL&amp;quot;,&amp;quot;next&amp;quot;,&amp;quot;&amp;quot;) : ReadingsVal(&amp;quot;myABFALL&amp;quot;,&amp;quot;now&amp;quot;,&amp;quot;&amp;quot;).&amp;quot;_0&amp;quot;;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Reading &amp;quot;ftui_next&amp;quot; bildet die Grundlage für das Symbol in TabletUI, das Reading &amp;quot;ftui_datum&amp;quot; wird für das Label genutzt. &lt;br /&gt;
&lt;br /&gt;
Somit lässt sich ganze in FTUI wie folgt darstellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div data-device=&amp;quot;myABFALL&amp;quot; &lt;br /&gt;
                     data-type=&amp;quot;symbol&amp;quot;&lt;br /&gt;
                     data-get=&amp;quot;ftui_next&amp;quot;&lt;br /&gt;
                     data-get-on=&#039;[&amp;quot;Biotonne_0$&amp;quot;,&amp;quot;Biotonne_1$&amp;quot;,&amp;quot;Biotonne_.*&amp;quot;,&amp;quot;GelberSack_0$&amp;quot;,&amp;quot;GelberSack_1$&amp;quot;,&amp;quot;GelberSack_.*&amp;quot;,&amp;quot;Papiertonne_0$&amp;quot;,&amp;quot;Papiertonne_1$&amp;quot;,&amp;quot;Papiertonne_.*&amp;quot;,&amp;quot;Restmuelltonne_0$&amp;quot;,&amp;quot;Restmuelltonne_1$&amp;quot;,&amp;quot;Restmuelltonne_.*&amp;quot;]&#039;&lt;br /&gt;
                     data-get-warn=&amp;quot;.*([0|1|2]).*&amp;quot;&lt;br /&gt;
                     data-colors=&#039;[&amp;quot;#8B4513&amp;quot;,&amp;quot;#8B4513&amp;quot;,&amp;quot;#8B4513&amp;quot;,&amp;quot;#f4e946&amp;quot;,&amp;quot;#f4e946&amp;quot;,&amp;quot;#f4e946&amp;quot;,&amp;quot;#2d9e1c&amp;quot;,&amp;quot;#2d9e1c&amp;quot;,&amp;quot;#2d9e1c&amp;quot;,&amp;quot;#696969&amp;quot;,&amp;quot;#696969&amp;quot;,&amp;quot;#696969&amp;quot;]&#039;&lt;br /&gt;
                     class=&amp;quot;large warn&amp;quot;&lt;br /&gt;
                     data-icons=&#039;[&amp;quot;fa-trash-o fa-spin&amp;quot;,&amp;quot;fa-trash-o blink&amp;quot;,&amp;quot;fa-trash-o&amp;quot;,&amp;quot;fs-bag fa-spin&amp;quot;,&amp;quot;fs-bag blink&amp;quot;,&amp;quot;fs-bag&amp;quot;,&amp;quot;fs-dustbin fa-spin&amp;quot;,&amp;quot;fs-dustbin blink&amp;quot;,&amp;quot;fs-dustbin&amp;quot;,&amp;quot;fa-trash fa-spin&amp;quot;,&amp;quot;fa-trash blink&amp;quot;,&amp;quot;fa-trash&amp;quot;]&#039;&lt;br /&gt;
                     /&amp;gt;&lt;br /&gt;
                &amp;lt;div data-device=&amp;quot;myABFALL&amp;quot; data-get=&amp;quot;ftui_datum&amp;quot; data-type=&amp;quot;label&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für Jede Tonne werden hier drei Zustände unterschieden und einzeln in &amp;quot;data-get-on&amp;quot;, &amp;quot;data-on-colors&amp;quot; und &amp;quot;data-icons&amp;quot; zugeordnet. Daher haben diese Listen jeweils 12 Einträge.&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigung ===&lt;br /&gt;
==== DOIF ====&lt;br /&gt;
====== TelegramBot Beispiel ======&lt;br /&gt;
&amp;lt;pre&amp;gt;[myABFALL:next_days] == 1) ( set fhemBot message &#039;Morgen wird [myABFALL:next_text] abgeholt&#039;)&lt;br /&gt;
[myABFALL:now_text] ne &amp;quot;&amp;quot;) ( set fhemBot message &#039;Heute wird [myABFALL:now_text] abgeholt&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Pushbullet Beispiel ======&lt;br /&gt;
&lt;br /&gt;
Die morgigen Leerungen per Push um 19:30 mittels Pushbullet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define dAbfallmorgen doif ([19:30] and [myABFALL:next_days] == 1) ( msg |Morgen wird [myABFALL:next_text] abgeholt)&lt;br /&gt;
&lt;br /&gt;
attr dAbfallmorgen do always&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die heutigen Leerungen per Push um 07:00 mittels Pushbullet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define dAbfallheute doif ([07:00] and [myABFALL:now_text] ne &amp;quot;&amp;quot;) ( msg |Heute wird [myABFALL:now_text] abgeholt)&lt;br /&gt;
&lt;br /&gt;
attr dAbfallheute do always&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Forenthema {{Link2Forum|Topic=50177|LinkText=Abfall Visualisierung mit Bilderrahmen}}&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Knxd&amp;diff=18750</id>
		<title>Knxd</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Knxd&amp;diff=18750"/>
		<updated>2017-01-22T18:05:10Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Removing typos and &amp;quot;-i&amp;quot; is taken care of by systemd (Docs: &amp;quot;-i           -- /lib/systemd/system/knxd.socket does this for us&amp;quot;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= knxd mit einem IP Gateway einrichten =&lt;br /&gt;
Damit fhem auf den KNX Bus zugreifen kann, benötigt man ein passendes Interface&lt;br /&gt;
&lt;br /&gt;
Es gibt:&lt;br /&gt;
&lt;br /&gt;
* RS232&lt;br /&gt;
* USB&lt;br /&gt;
* IP&lt;br /&gt;
&lt;br /&gt;
Ich beschreibe die Einrichtung von knxd mit einem IP Gateway auf einen Raspberry Pi2 mit Wheezy oder Jessie.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. als erstes müssen folgende Pakete installiert werden (Referenz Debian Jessie):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get update&lt;br /&gt;
sudo apt-get install debhelper cdbs automake libtool libusb-1.0-0-dev git-core build-essential libsystemd-daemon-dev dh-systemd libev-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
(Bei Debian Jessie-Lite fehlt noch mehr)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. knxd herunterladen und installieren&#039;&#039;&#039;&lt;br /&gt;
Achtung: Wenn Abhängigkeiten fehlen, dann installiere diese nach. Nicht einfach mittels &amp;quot;-d&amp;quot; diese übergehen!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/knxd/knxd.git&lt;br /&gt;
cd knxd&lt;br /&gt;
dpkg-buildpackage -b -uc&lt;br /&gt;
cd ..&lt;br /&gt;
sudo dpkg -i knxd_*.deb knxd-tools_*.deb&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&#039;&#039;&#039;1. Ohne systemd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es muss als nächstes die Konfigurationsdatei editiert werden.&lt;br /&gt;
&lt;br /&gt;
das geht mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/default/knxd &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dann folgende Einträge anpassen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DAEMON_ARGS=&amp;quot;-u /tmp/eib -u /var/run/knx -i -b ipt:192.168.188.XX&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_KNXD=YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2. Mit systemd z. B. für Debian Jessie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei bei Jessie hat sich wegen der Nutzung von systemd geändert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/knxd.conf &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dann folgende Einträge anpassen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS=&amp;quot;-u /tmp/eib -u /var/run/knx -b ipt:192.168.188.XX&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_KNXD=YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== knxd Status überprüfen ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/knxd status&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&#039;&#039;&#039;Wie wird eibd vorher deinstalliert?&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -r /usr/local/bin/{eibd,knxtool,group*} /usr/local/lib/lib{eib,pthsem}*.so* /usr/local/include/pth*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;folgender Fehler: dpkg-buildpackage: Fehler: Fehler-Exitstatus von debian/rules build war 2&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install git-core build-essential&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[[Benutzer:Marthinx]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/knxd/knxd Github knxd]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Einrichten_knxd_mit_MDT_SCN-IP000.02&amp;diff=18745</id>
		<title>Einrichten knxd mit MDT SCN-IP000.02</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Einrichten_knxd_mit_MDT_SCN-IP000.02&amp;diff=18745"/>
		<updated>2017-01-22T13:31:03Z</updated>

		<summary type="html">&lt;p&gt;SirUli: pthsem ist keine Abhängigkeit mehr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==  Vorwort ==&lt;br /&gt;
Im Rahmen einer Machbarkeitsstudie ging es um das Thema Zählererfassung im betrieblichen Umfeld. Dazu sollten diverse Techniken und Bus-Systeme mit einbezogen werden. &lt;br /&gt;
Als eine Art (halb privates) Nebenprojekt kam auch die Verknüpfung zwischen FHEM und einem KNX-Zählerbaustein zum Einsatz.&lt;br /&gt;
Es gibt hier im Wiki zwar schon die Beschreibung [[Einrichten_von_eibd_für_das_Weinzierl_IP_730_Interface]], aber diese beschäftigt sich mit anderer Hardware und dem eib-daemon.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
===Hardware===&lt;br /&gt;
:* MDT IP-Interface SCN-IP000.02. Wird später als IP-Tunneling-Device verwendet. Adresse wird über DHCP bezogen. &#039;&#039;&#039;Sollte geändert werden&#039;&#039;&#039;&lt;br /&gt;
:* MDT 4fach Binäreingang BE-04000.01. Dient als Zählermodul&lt;br /&gt;
:* MDT Spannungsversorgung STV-0160.01. Achtung! Es kann keine Standard 24V Spannungsversorgung verwendet werden, da diese nicht die für KNX benötigte Drossel enthält&lt;br /&gt;
===Software===&lt;br /&gt;
:* FHEM 5.7 Installation auf Raspberry Pi 3, gemäß Anleitung (folgt!), &#039;&#039;&#039;Raspian Jessie&#039;&#039;&#039;&lt;br /&gt;
:* ETS 5.0 wird für die Konfiguration der KNX-Komponenten benötigt. Kostenfreie Demo-Lizenz. Beschränkt auf 5 Geräte. Download von [https://knx.org/knx-de/software/ets/herunterladen/index.php KNX.org] &lt;br /&gt;
:* Katalog-Datei für die ETS vom Binär-Eingang. Quelle: [http://www.mdt.de/Downloads_Produktdatenbanken.html MDT-Homepage]&lt;br /&gt;
&lt;br /&gt;
==Installation von knxd==&lt;br /&gt;
KNX-Daemon für Linux installieren: [[Knxd#Installation]]&lt;br /&gt;
&lt;br /&gt;
==Konfiguration von knxd==&lt;br /&gt;
:* &#039;&#039;/etc/knxd.conf&#039;&#039; anlegen. Relevant ist nur die letzte Zeile. Die originale Datei enthält eine für das System nicht funktionierende Konfiguration. Daher wird der gesamte Inhalt der Datei hier dokumentiert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# configuration for knxd.service&lt;br /&gt;
#KNXD_OPTS=&amp;quot;-u /tmp/eib -b ip:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# The default options are &amp;quot;-u /tmp/eib -b ip:&amp;quot;&lt;br /&gt;
# which tell knxd to route between all of&lt;br /&gt;
#  /tmp/eib (legacy socket (-u))&lt;br /&gt;
#  multicast client (-b ip:).&lt;br /&gt;
# The knxd.socket file also tells knxd to listen to&lt;br /&gt;
#  /run/eib (socket activation via systemd)&lt;br /&gt;
#  TCP port 6720 (socket activation via systemd)&lt;br /&gt;
&lt;br /&gt;
# *** DO NOT use &amp;quot;-u&amp;quot; / &amp;quot;-u /run/knx&amp;quot; or &amp;quot;-i&amp;quot; / &amp;quot;-i 6720&amp;quot; here.&lt;br /&gt;
# Systemd already does that on behalf of knxd, via &#039;knx.socket&#039;.&lt;br /&gt;
&lt;br /&gt;
# If you have KNX hardware on a serial port or USB, add the appropriate&lt;br /&gt;
# &amp;quot;-b TYPE:…&amp;quot; option. In this case, you probably want to set up a multicast&lt;br /&gt;
# server, not a client (i.e. use &amp;quot;-D -T -R -S&amp;quot;, not &amp;quot;-b ip:&amp;quot;).&lt;br /&gt;
# DO NOT use both.&lt;br /&gt;
#&lt;br /&gt;
# If your KNX hardware is a KNX/IP gateway that doesn&#039;t do multicast,&lt;br /&gt;
# use &amp;quot;-b ipt:192.168.1.2&amp;quot; (or its DNS name) to talk to it.&lt;br /&gt;
#&lt;br /&gt;
# KNX MUST NOT have more than one path between any two devices. Thus,&lt;br /&gt;
# you need to make sure that the KNX/IP gateway does not route multicast&lt;br /&gt;
# before you use both &amp;quot;-S&amp;quot; and &amp;quot;-b ipt:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
# The default bus address of knxd is 0.0.1. If that&#039;s in use in your KNX&lt;br /&gt;
# network (or if you run more than one knxd on your network), set a&lt;br /&gt;
# different address (-e 15.0.99).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Run `knxd --help` to get a complete list of available options and drivers.&lt;br /&gt;
&lt;br /&gt;
## DO NOT use the following options:&lt;br /&gt;
## -i           -- /lib/systemd/system/knxd.socket does this for us&lt;br /&gt;
## -u /run/knx  -- likewise&lt;br /&gt;
## -d           -- /lib/systemd/system/knxd.service expects knxd to run in the foreground&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# This file is ignored when NOT using systemd: edit /etc/default/knxd instead #&lt;br /&gt;
###############################################################################&lt;br /&gt;
KNXD_OPTS=&amp;quot;-e 1.0.240  -b ipt:192.168.0.88&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;192.168.0.88&#039;&#039; ist exemplarisch für die IP-Adresse eures KNX-Gateways.&lt;br /&gt;
&lt;br /&gt;
:* Der Daemon sollte auch einem Jessie-System mit dem System starten.&lt;br /&gt;
Der Status des KNX-Dienstes kann mit &#039;&#039;systemctl status knxd.service&#039;&#039; geprüft werden. Die Ausgabe sollte so ähnlich aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rasspi-fhem99:~# systemctl status knxd.service&lt;br /&gt;
● knxd.service - KNX Daemon&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/knxd.service; enabled)&lt;br /&gt;
   Active: active (running) since Mo 2016-04-11 13:35:53 CEST; 14s ago&lt;br /&gt;
 Main PID: 1258 (knxd)&lt;br /&gt;
   CGroup: /system.slice/knxd.service&lt;br /&gt;
           └─1258 /usr/bin/knxd -e 1.0.240 -b ipt:192.168.0.88&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wichtig ist, dass die IP-Adresse des Gateways und die eib-Adresse (1.0.240) in der letzten Zeile stehen.&lt;br /&gt;
&lt;br /&gt;
Der Dienst kann auch manuell gestartet und gestoppt werden:&lt;br /&gt;
Start:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start knxd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beenden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop knxd.service&lt;br /&gt;
systemctl stop knxd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Achtung! wird der Dienst beendet während FHEM in benutzt, &#039;&#039;&#039;hängt sich FHEM auf&#039;&#039;&#039; und muss neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
* Definition des IP-Gateways in FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define KNX TUL eibd:192.168.0.1 1.0.240&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;192.168.0.1&#039;&#039; Adresse des KNX-Daemons, i.d.R. localhost&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;1.0.240&#039;&#039; EIB-Adresse für FHEM/KNXD&lt;br /&gt;
&lt;br /&gt;
Nach dem FHEM-Neustart sollte das neue Device &amp;quot;KNX&amp;quot; den Status &amp;quot;Initialized&amp;quot; haben.&lt;br /&gt;
&lt;br /&gt;
== Installation/Konfiguration ETS==&lt;br /&gt;
Die ETS wird benötigt um KNX-Sensoren/Aktoren zu parametrieren und ihnen EIB-konforme Adressen zuzuweisen.&lt;br /&gt;
Ich empfehle an dieser Stelle das Dokument &amp;quot;Grundlagenwissen zum KNX Standard&amp;quot;, welches von [https://www.google.de/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0ahUKEwi9w-O74ojMAhVBfxoKHeXKByAQFggkMAA&amp;amp;url=http%3A%2F%2Fwww.knx.org%2Ffileadmin%2Fdownloads%2F08%2520-%2520KNX%2520Flyers%2FGrundlagenwissen%2520zum%2520KNX%2520Standard%2FGrundlagenwissen_zum_KNX_Standard_German.pdf&amp;amp;usg=AFQjCNETdgrIp23RbSTx-E8Q0qFuNH1hBw&amp;amp;cad=rja KNX.org] heruntergeladen werden kann.&lt;br /&gt;
&lt;br /&gt;
===Einrichtung des Binäreingangs BE-04000-01 in ETS===&lt;br /&gt;
* Bevor der Binär-Eingang benutzt werden kann,  muss dieser in ETS konfiguriert werden.&lt;br /&gt;
Dazu wird in ETS zunächst ein Projekt angelegt. Als &amp;quot;Linientyp&amp;quot; wird TP (Twisted Pair) definiert.&lt;br /&gt;
Das IP-Gateway wird von der ETS selbstständig gefunden.&lt;br /&gt;
* Bevor das Gerät selbst in ETS angezeigt werden kann, muss eine Struktur für das Gerät erzeugt werden:&lt;br /&gt;
[[Datei:Ets struktur.png]]&lt;br /&gt;
&lt;br /&gt;
1 Gebäudestruktur: Haus -&amp;gt; Keller -&amp;gt; Unterverteilung&lt;br /&gt;
&lt;br /&gt;
2 Adressstruktur:  &amp;quot;1 Haupt&amp;quot; -&amp;gt; &amp;quot;1/1 Mittel&amp;quot; -&amp;gt; &amp;quot;1/1/1 Schalter&amp;quot;   1.1.1 ist demnach die spätere Adresse für Schalteingang A des 4fach Geräts&lt;br /&gt;
&lt;br /&gt;
3 Katalog-Import: Hier wird der Katalog für das Gerät importiert. Dieser wird dann per DragNDrop auf die erstellte Struktur &amp;quot;Unterverteilung&amp;quot; gezogen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Jetzt kann das Gerät &amp;quot;Binäreingang 4-fach...&amp;quot; parametriert werden. Dazu im mittleren Fenster den Reiter &amp;quot;Parameter&amp;quot; wählen&lt;br /&gt;
[[Datei:Geraet parametrieren.png]]&lt;br /&gt;
&lt;br /&gt;
Hier kann jetzt für jeden Eingang des Bausteins die entsprechende Funktion eingestellt werden, z.B. Schalter, Zähler, usw.&lt;br /&gt;
* Aus dem unteren Fenster werden nun per Drag N Drop die erstellten Gruppenadressen auf die jeweiligen Eingänge des Geräts gezogen. Damit wird auch die EIB-Adresse für jeden Eingang festgelegt.&lt;br /&gt;
* Jetzt muss das Gerät noch programmiert werden. Dazu Programmieren -&amp;gt; Physikalische Adresse und Applikationsprogramm&lt;br /&gt;
&lt;br /&gt;
=== Installation/Konfiguration FHEM===&lt;br /&gt;
* In FHEM sollten jetzt die neu erzeugten EIB-Geräte angezeigt werden. Voraussetzung ist ein aktiviertes AutoCreate in &#039;&#039;fhem.cfg&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define autocreate autocreate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*[[Datei:Fhem eib.png]]&lt;br /&gt;
&lt;br /&gt;
* Der Schalteingang wird als Glühbirne dargestellt&lt;br /&gt;
* Beim Zählereingang steht nur der Zählerstand als HEX-Zahl. In der ETS lässt sich für den Zähleingang festlegen, wie oft er Counter-Werte übertragen soll, z.B. alle 30 Impulse sollen übermittelt werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Knxd&amp;diff=18742</id>
		<title>Knxd</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Knxd&amp;diff=18742"/>
		<updated>2017-01-22T13:21:49Z</updated>

		<summary type="html">&lt;p&gt;SirUli: pthsem is no&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= knxd mit einem IP Gateway einrichten =&lt;br /&gt;
Damit fhem auf den KNX Bus zugreifen kann, benötigt man ein passendes Interface&lt;br /&gt;
&lt;br /&gt;
Es gibt:&lt;br /&gt;
&lt;br /&gt;
* RS232&lt;br /&gt;
* USB&lt;br /&gt;
* IP&lt;br /&gt;
&lt;br /&gt;
Ich beschreibe die Einrichtung von knxd mit einem IP Gateway auf einen Raspberry Pi2 mit Wheezy oder Jessie.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. als erstes müssen folgende Pakete installiert werden (Referenz Debian Jessie):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get update&lt;br /&gt;
sudo apt-get install debhelper cdbs automake libtool libusb-1.0-0-dev git-core build-essential libsystemd-daemon-dev dh-systemd libev-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
(Bei Debian Jessie-Lite fehlt noch mehr)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. knxd herunterladen und installieren&#039;&#039;&#039;&lt;br /&gt;
Achtung: Wenn Abhängigkeiten fehlen, dann installiere diese nach. Nicht einfach mittels &amp;quot;-d&amp;quot; diese übergehen!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/knxd/knxd.git&lt;br /&gt;
cd knxd&lt;br /&gt;
dpkg-buildpackage -b -uc&lt;br /&gt;
cd ..&lt;br /&gt;
sudo dpkg -i knxd_*.deb knxd-tools_*.deb&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&#039;&#039;&#039;1. Ohne systemd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es muss als nächstes die Konfigurationsdatei editiert werden.&lt;br /&gt;
&lt;br /&gt;
das geht mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/default/knxd &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dann folgende Einträge anpassen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DAEMON_ARGS=&amp;quot;-u /tmp/eib -u /var/run/knx -i -b ipt:192.168.188.XX&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_KNXD=YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2. Mit systemd z. B. für Debian Jessie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei bei Jessie hat sich wegen der Nutzung von systemd geändert:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/knxd.conf &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
dann folgende Einträge anpassen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
KNXD_OPTS==&amp;quot;-u /tmp/eib -u /var/run/knx -i -b ipt:192.168.188.XX&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_KNXD=YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== knxd Status überprüfen ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/knxd status&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&#039;&#039;&#039;Wie wird eibd vorher deinstalliert?&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -r /usr/local/bin/{eibd,knxtool,group*} /usr/local/lib/lib{eib,pthsem}*.so* /usr/local/include/pth*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;folgender Fehler: dpkg-buildpackage: Fehler: Fehler-Exitstatus von debian/rules build war 2&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install git-core build-essential&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[[Benutzer:Marthinx]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/knxd/knxd Github knxd]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AMAD&amp;diff=17810</id>
		<title>AMAD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AMAD&amp;diff=17810"/>
		<updated>2016-12-15T18:59:49Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Formatierung und Typos.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern von Adroidgeräten und Anzeige von bestimmten Informationen dieser Geräte&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=74_AMAD.pm&lt;br /&gt;
|ModOwner=CoolTux &amp;lt;br /&amp;gt;([http://forum.fhem.de/index.php?action=profile;u=13684 Forum] / [[Benutzer:CoolTux|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Vorwort==&lt;br /&gt;
===Warum AMAD2===&lt;br /&gt;
Bei der Entwicklung von AMAD musste ich auf Grund meines damaligen Wissenstandes ein einfaches Konzept zum Erhalt von Daten wählen. Hierfür wählte ich das Prinzip des pullens. Die Daten wurden alle 3 min vom Gerät angefordert.&lt;br /&gt;
Mit AMAD2, also der 2. Version von AMAD werden die Daten nun vom Androidgerät selbst nach FHEM gepusht. So kommen Statusänderungen quasi in Echtzeit als Reading ins Device.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Vorstellung==&lt;br /&gt;
Dieses Modul liefert, &#039;&#039;&#039;in Verbindung mit der Android APP Automagic&#039;&#039;&#039;, diverse Informationen von Android Geräten. &lt;br /&gt;
Die AndroidAPP Automagic (welche nicht von mir stammt und 2.90 Euro kostet) funktioniert wie Tasker, ist aber bei weitem User freundlicher.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
Im Auslieferiungszustand werden folgende Zustände dargestellt:&lt;br /&gt;
* installierte Android Version&lt;br /&gt;
* Zustand von Automagic auf dem Gerät&lt;br /&gt;
* Spracheingabe&lt;br /&gt;
* Bluetooth An/Aus&lt;br /&gt;
* Zustand einer definierten App (läuft aktiv im Vordergrund oder nicht?)&lt;br /&gt;
* verbundene Bluetoothgeräte, inklusive deren MAC Adresse&lt;br /&gt;
* aktuell abgespieltes Musikalbum des verwendeten Mediaplayers&lt;br /&gt;
* aktuell abgespielter Musikinterpret des verwendeten Mediaplayers&lt;br /&gt;
* aktuell abgespielter Musiktitel des verwendeten Mediaplayers&lt;br /&gt;
* Status des Androidgerätes - Online/Offline&lt;br /&gt;
* nächster Alarmtag&lt;br /&gt;
* nächste Alarmzeit&lt;br /&gt;
* Batteriestatus in %&lt;br /&gt;
* Ladestatus - Netztei angeschlossen / nicht angeschlossen&lt;br /&gt;
* Bildschirmstatus An/Aus&lt;br /&gt;
* Bildschirmhelligkeit&lt;br /&gt;
* Vollbildmodus An/Aus&lt;br /&gt;
* Bildschirmausrichtung Auto/Landscape/Portrait&lt;br /&gt;
* Standardlautstärke&lt;br /&gt;
* Media Lautstärke&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Mit etwas Einarbeitung können jegliche Informationen welche Automagic bereit stellt, in FHEM angezeigt werden. Hierzu bedarf es lediglich eines eigenen Flows welcher seine Daten an die AMADCommBridge sendet. Das Modul gibt auch die Möglichkeit Androidgeräte zu steuern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Modul gibt Dir auch die Möglichkeit Deine Androidgeräte zu steuern. So können folgende Aktionen durchgeführt werden:&lt;br /&gt;
* Bluetooth Ein/Aus schalten&lt;br /&gt;
* zu einem bestimmten Bluetoothgerät wechseln/verbinden&lt;br /&gt;
* Status des Gerätes (Online,Offline)&lt;br /&gt;
* Mediaplayer steuern (Play, Stop, nächster Titel, vorheriger Titel)&lt;br /&gt;
* nächste Alarmzeit setzen&lt;br /&gt;
* ein Benachrichtigungston abspielen (Notificationsound)&lt;br /&gt;
* eine App auf dem Gerät öffnen&lt;br /&gt;
* eine URL im Browser öffnen&lt;br /&gt;
* Bildschirm An/Aus machen&lt;br /&gt;
* Bildschirmhelligkeit einstellen&lt;br /&gt;
* Vollbildmodus einschalten&lt;br /&gt;
* eine Nachricht senden welche am Bildschirm angezeigt wird&lt;br /&gt;
* Bildschirmausrichtung einstellen (Auto,Landscape,Portrait)&lt;br /&gt;
* neuen Statusreport des Gerätes anfordern&lt;br /&gt;
* Systembefehle setzen (Reboot)&lt;br /&gt;
* eine Nachricht senden welche angesagt wird (TTS)&lt;br /&gt;
* Medienlautstärke regeln&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
Für all diese Aktionen und Informationen wird auf dem Androidgerät die App Automagic und ein so genannter Flow benötigt. Automagic Premium könnt Ihr Euch aus dem App Store installieren wohingegen die Flows im Ordner $FHEMINSTALL/FHEM/lib/ unter dem Dateinamen 74_AMADautomagicFlowset&#039;&#039;$VERSION&#039;&#039;.xml zu finden sind, wobei &#039;&#039;$VERSION&#039;&#039; die höchste sein sollte. Diese Datei müsst ihr auf das Gerät kopieren (Ort ist nicht entscheidend, nach dem Import kann die Datei theoretisch gelöscht werden).&lt;br /&gt;
&lt;br /&gt;
== AutomagicApp Anweisung ==&lt;br /&gt;
* installiert die App&lt;br /&gt;
* importiert das Flowset 74_AMADautomagicFlowset$VERSION.xml aus dem Ordner $INSTALLFHEM/FHEM/lib/ auf Eurem Androidgerät (Menü -&amp;gt; Verwalten -&amp;gt; Flows importierten). &#039;&#039;&#039;Wichtig: &#039;&#039;&#039; Die Flows dürfen noch nicht aktiviert werden!&lt;br /&gt;
&lt;br /&gt;
==Definition in FHEM==&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; AMAD &amp;lt;IP-ADRESSE&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;!!! Wichtig - Es dürfen ausschließlich nur IP Adressen verwendet werden, keine FQDN !!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define WandTabletWohnzimmer AMAD 192.168.0.23&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Anweisung im Beispiel erstellt zwei neue AMAD-Devices im Raum AMAD:&lt;br /&gt;
* &amp;quot;WandTabletWohnzimmer&amp;quot;, wobei der Parameter &amp;lt;IP-ADRESSE&amp;gt; die IP Adresse des Android Gerätes festlegt. &amp;lt;em&amp;gt;!!!Comming Soon!!! Wer den Port ändern möchte, kann dies über das Attribut &amp;quot;port&amp;quot; tun. Ihr solltet aber wissen was Ihr tut, da dieser Port im HTTP Request Trigger der beiden Flows eingestellt ist. Demzufolge muß der Port dort auch geändert werden.&amp;lt;/em&amp;gt;&lt;br /&gt;
* &amp;quot;AMADCommBridge&amp;quot;, welches als Kommunikationsbrücke vom Androidgerät zu FHEM dient. Wenn notwendig kann der Port für die Bridge ohne Probleme im Bridge Device mittels dem Attribut &amp;quot;port&amp;quot; verändert werden.&lt;br /&gt;
&lt;br /&gt;
===AMAD Communication Bridge===&lt;br /&gt;
Beim ersten anlegen einer AMAD Deviceinstanz wird, wie angesprochen, automatisch ein Gerät Namens AMADCommBridge im Raum AMAD angelegt. Dieses Gerät dient zur Kommunikation vom Androidgerät zu FHEM ohne das zuvor eine Anfrage von FHEM aus ging. Damit das Androidgerät die IP von FHEM kennt, &#039;&#039;&#039;muss&#039;&#039;&#039; diese sofort nach dem anlegen der Bridge über den set Befehl in ein entsprechendes Reading in die Bridge geschrieben werden. &#039;&#039;&#039;DAS IST SUPER WICHTIG UND FÜR DIE FUNKTION DER BRIDGE NOTWENDIG.&#039;&#039;&#039;&lt;br /&gt;
Bitte führt hierzu folgenden Befehl aus:&lt;br /&gt;
&amp;lt;code&amp;gt;set AMADCommBridge fhemServerIP &amp;lt;FHEM-IP&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als zweites Reading könnt ihr &#039;&#039;expertMode&#039;&#039; setzen. Mit diesem Reading wird eine unmittelbare Kommunikation vom Gerät zu FHEM erreicht ohne die Einschränkung, über ein Notify gehen zu müssen und nur reine set Befehle ausführen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Aktivierung ===&lt;br /&gt;
Nach der erfolgreichen Konfiguration des FHEM Moduls und der Automagic App können nun die Flows auf dem Gerät aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Sofern die Geräteinstanz korrekt angelegt wurde und die fhemServerIP in der CommBridge gesetzt wurde, sollten nach spätestens 15 Sekunden bereits die ersten Readings reinkommen. Nun wird alle 15 Sekunden probiert einen Status Request erfolgreich ab zu schließen. Wenn der Status sich über einen längeren Zeitraum nicht auf &amp;quot;activ&amp;quot; ändert, sollte man im Log nach eventuellen Fehlern suchen.&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit einer Abfrage des Status jeglicher Geräte in FHEM über das Androidgerät und Auswertung auf dem Androidgerät.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
Erstelle einen Flow mit einer HTTP Request Aktion mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
URL&lt;br /&gt;
http://{global_fhemip}:8090&lt;br /&gt;
&lt;br /&gt;
REQUEST METHODE&lt;br /&gt;
POST&lt;br /&gt;
&lt;br /&gt;
CONTENT TYP&lt;br /&gt;
Genereller Text&lt;br /&gt;
text/plain&lt;br /&gt;
&lt;br /&gt;
DATEN&lt;br /&gt;
(hier kommen die drei Werte für ein ReadingsVal Aufruf rein, getrennt durch Leerzeichen)&lt;br /&gt;
TempFeuchtSensorSchlafzimmer temperature 300&lt;br /&gt;
&lt;br /&gt;
(haken)Setze eigenen Header&lt;br /&gt;
FHEMDEVICE: {global_fhemdevice}&lt;br /&gt;
FHEMCMD: readingsval&lt;br /&gt;
&lt;br /&gt;
SPEICHERE ANTWORT ...&lt;br /&gt;
Variable&lt;br /&gt;
&lt;br /&gt;
VARIABLE&lt;br /&gt;
response&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du erhältst dann den Rückgabewert in der Response-Variablen. Diesen kannst Du dann innerhalb Deines Flows weiter verarbeiten z.B. in einem Text für eine Ansage.&lt;br /&gt;
&lt;br /&gt;
==Readings==&lt;br /&gt;
* airplanemode - Status des Flugmodus&lt;br /&gt;
* androidVersion - aktuell installierte Androidversion&lt;br /&gt;
* automagicState - Statusmeldungen von der AutomagicApp &#039;&#039;&#039;(Voraussetzung Android &amp;gt;4.3). Wer ein Android &amp;gt;4.3 hat und im Reading steht &amp;quot;wird nicht unterstützt&amp;quot;, muß in den Androideinstellungen unter Ton und Benachrichtigungen -&amp;gt; Benachrichtigungszugriff ein Haken setzen für Automagic&#039;&#039;&#039;&lt;br /&gt;
* bluetooth on/off - ist auf dem Gerät Bluetooth an oder aus&lt;br /&gt;
* checkActiveTask - Zustand einer zuvor definierten APP. 0=nicht aktiv oder nicht aktiv im Vordergrund, 1=aktiv im Vordergrund, &#039;&#039;&#039;siehe Hinweis unten&#039;&#039;&#039;&lt;br /&gt;
* connectedBTdevices - eine Liste der verbundenen Gerät&lt;br /&gt;
* connectedBTdevicesMAC - eine Liste der MAC Adressen aller verbundender BT Geräte&lt;br /&gt;
* currentMusicAlbum - aktuell abgespieltes Musikalbum des verwendeten Mediaplayers&lt;br /&gt;
* currentMusicApp - aktuell verwendeter Mediaplayers&lt;br /&gt;
* currentMusicArtist - aktuell abgespielter Musikinterpret des verwendeten Mediaplayers&lt;br /&gt;
* currentMusicTrack - aktuell abgespielter Musiktitel des verwendeten Mediaplayers&lt;br /&gt;
* daydream - on/off Daydream gestartet oder nicht&lt;br /&gt;
* deviceState - Status des Androidgerätes / unknown, online, offline&lt;br /&gt;
* doNotDisturb - aktueller Status des nicht stören Modus&lt;br /&gt;
* dockingState - undocked/docked Status ob das Gerät in einer Dockinstation ist oder nicht.&lt;br /&gt;
* flow_SetCommands - active/inactive, gibt den Status des SetCommands Flow wieder&lt;br /&gt;
* flow_informations - active/inactive, gibt den Status des Informations Flow wieder&lt;br /&gt;
* flowsetVersionAtDevice - aktuell installiertes Flowset auf dem Device&lt;br /&gt;
* intentRadioName - zu letzt eingestellter Intent Radio Name&lt;br /&gt;
* intentRadioState - Status des IntentRadio Players&lt;br /&gt;
* keyguardSet - 0/1 Displaysperre gesetzt 0=nein 1=ja, bedeutet nicht das sie gerade aktiv ist&lt;br /&gt;
* lastSetCommandError - letzte Fehlermeldung vom set Befehl&lt;br /&gt;
* lastSetCommandState - letzter Status vom set Befehl, Befehl erfolgreich/nicht erfolgreich gesendet&lt;br /&gt;
* lastStatusRequestError - letzte Fehlermeldung vom statusRequest Befehl&lt;br /&gt;
* lastStatusRequestState - letzter Status vom statusRequest Befehl, Befehl erfolgreich/nicht erfolgreich gesendet&lt;br /&gt;
* nextAlarmDay - aktiver Alarmtag&lt;br /&gt;
* nextAlarmState - aktueller Status des Androidinternen Weckers&lt;br /&gt;
* nextAlarmTime - aktive Alarmzeit&lt;br /&gt;
* powerLevel - Status der Batterie in %&lt;br /&gt;
* powerPlugged - Netzteil angeschlossen? 0=NEIN, 1|2=JA&lt;br /&gt;
* screen - on locked/unlocked, off locked/unlocked zeigt an ob der Bildschirm an oder aus ist und gleichzeitig gesperrt oder nicht gesperrt&lt;br /&gt;
* screenBrightness - Bildschirmhelligkeit von 0-255&lt;br /&gt;
* screenFullscreen - Vollbildmodus (On,Off)&lt;br /&gt;
* screenOrientation - (Landscape,Portrait) Bildschirmausrichtung&lt;br /&gt;
* screenOrientationMode - (auto, manual) Modus für die Ausrichtung&lt;br /&gt;
* state - aktueller Status des Devices&lt;br /&gt;
* volume - Media Lautstärkewert&lt;br /&gt;
* volumeNotification - Benachrichtigungs Lautstärke&lt;br /&gt;
&lt;br /&gt;
Beim Reading checkActivTask muß zuvor der Packagename der zu prüfenden App als Attribut checkActiveTask angegeben werden. Beispiel: attr Nexus10Wohnzimmer checkActiveTask com.android.chrome für den Chrome Browser. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Befehle==&lt;br /&gt;
&lt;br /&gt;
===Set===&lt;br /&gt;
* activateVoiceInput - schaltet die Spracheingabe ein&lt;br /&gt;
* bluetooth - Schaltet Bluetooth on/off&lt;br /&gt;
* clearNotificationBar - (All,Automagic) löscht alle Meldungen oder nur die Automagic Meldungen in der Statusleiste&lt;br /&gt;
* currentFlowsetUpdate - fürt ein Flowset Update auf dem Device aus&lt;br /&gt;
* deviceState - setzt den Device Status Online/Offline. Siehe Readings&lt;br /&gt;
* installFlowSource - installiert einen Flow auf dem Device, das XML File muss unter /tmp/ liegen und die Endung xml haben. &#039;&#039;&#039;Bsp:&#039;&#039;&#039; set TabletWohnzimmer installFlowSource WlanUebwerwachen.xml&lt;br /&gt;
* doNotDisturb - schaltet den nicht stören Modus, always immer Stören, never niemals stören, alarmClockOnly nur Wecker darf stören, onlyImportant nur wichtige Störungen&lt;br /&gt;
* mediaPlayer - steuert den Standard Mediaplayer. play, stop, Titel zürück, Titel vor.&lt;br /&gt;
* nextAlarmTime - setzt die Alarmzeit. Geht aber nur innerhalb der nächsten 24Std.&lt;br /&gt;
* notifySndFile - spielt die angegebende Mediadatei auf dem Androidgerät ab. &#039;&#039;&#039;Die aufzurufende Mediadatei muß sich im Ordner /storage/emulated/0/Notifications/ befinden.&#039;&#039;&#039;&lt;br /&gt;
* screenBrightness - setzt die Bildschirmhelligkeit, von 0-255.&lt;br /&gt;
* screenMsg - versendet eine Bildschirmnachricht&lt;br /&gt;
* sendintent - sendet einen Intentstring Bsp: set $AMADDEVICE sendIntent org.smblott.intentradio.PLAY url http://stream.klassikradio.de/live/mp3-192/stream.klassikradio.de/play.m3u name Klassikradio, der erste Befehl ist die Aktion un der zweite das Extra. Es können immer zwei Extras mitgegeben werden.&lt;br /&gt;
* statusRequest - Fordert einen neuen Statusreport beim Device an. Es können nicht von allen Readings per statusRequest die Daten geholt werden. Einige wenige geben nur bei Statusänderung ihren Status wieder.&lt;br /&gt;
* timer - setzt einen Timer innerhalb der als Standard definierten ClockAPP auf dem Device. Es können nur Sekunden angegeben werden.&lt;br /&gt;
* ttsMsg - versendet eine Nachricht welche als Sprachnachricht ausgegeben wird&lt;br /&gt;
* vibrate - lässt das Androidgerät vibrieren&lt;br /&gt;
* volume - setzt die Medialautstärke. Entweder die internen Lautsprecher oder sofern angeschlossen die Bluetoothlautsprecher und per Klinkenstecker angeschlossenen Lautsprecher, + oder - vor dem Wert reduziert die aktuelle Lautst&amp;amp;auml;rke um den Wert&lt;br /&gt;
* volumeNotification - setzt die Benachrichtigungslautstärke.&lt;br /&gt;
&lt;br /&gt;
===Set abhängig von gesetzten Attributen===&lt;br /&gt;
* changetoBtDevice - wechselt zu einem anderen Bluetooth Gerät. &#039;&#039;&#039;Attribut setBluetoothDevice muß gesetzt sein. Siehe Hinweis unten!&#039;&#039;&#039;&lt;br /&gt;
* openApp - öffnet eine ausgewählte App. &#039;&#039;&#039;Attribut setOpenApp&#039;&#039;&#039;&lt;br /&gt;
* openURL - öffnet eine URL im Standardbrowser, sofern kein anderer Browser über das Attribut setOpenUrlBrowser ausgewählt wurde. &#039;&#039;&#039;Bsp:&#039;&#039;&#039; &#039;&#039;attr Tablet setOpenUrlBrowser de.ozerov.fully|de.ozerov.fully.MainActivity&#039;&#039;, das erste ist der Package Name und das zweite der Class Name&lt;br /&gt;
* screen - on/off/lock/unlock schaltet den Bildschirm ein/aus oder sperrt/entsperrt ihn, in den Automagic Einstellungen muss &amp;quot;Admin Funktion&amp;quot; gesetzt werden sonst funktioniert &amp;quot;Screen off&amp;quot; nicht. &#039;&#039;&#039;Attribut setScreenOnForTimer&#039;&#039;&#039; ändert die Zeit wie lange das Display an bleiben soll!&lt;br /&gt;
* screenFullscreen - Schaltet den Vollbildmodus on/off. &#039;&#039;&#039;Attribut setFullscreen&#039;&#039;&#039;&lt;br /&gt;
* screenLock - Sperrt den Bildschirm mit Pinabfrage. &#039;&#039;&#039;Attribut setScreenlockPIN&#039;&#039;&#039; - hier die Pin dafür eingeben. Erlaubt sind nur Zahlen. Es müßen mindestens 4 bis max 16 Zeichen sein.&lt;br /&gt;
* screenOrientation - Schaltet die Bildschirmausrichtung Auto/Landscape/Portait. &#039;&#039;&#039;Attribut setScreenOrientation&#039;&#039;&#039;&lt;br /&gt;
* setAPSSID - setzt die Acces Point SSID um WLAN Sleeps zu verhindern&#039;&#039;&#039;&lt;br /&gt;
* setTtsMsgSpeed - setzt die Sprachgeschwindigkeit bei der Sprachausgabe &#039;&#039;&#039;(Werte zwischen 0.5 bis 4.0 in 0.5er Schritten) default ist 1.0&#039;&#039;&#039;&lt;br /&gt;
* setTtsMsgLang - setzt die Sprache der Sprachausgabe, (de-Deutsch - en Englisch) default ist de&#039;&#039;&#039;&lt;br /&gt;
* system - setzt Systembefehle ab (nur bei gerootetet Geräen). reboot,shutdown,airplanemodeON (kann nur aktiviert werden) &#039;&#039;&#039;Attribut root&#039;&#039;&#039;, in den Automagic Einstellungen muss &amp;quot;Root Funktion&amp;quot; gesetzt werden&lt;br /&gt;
* setNotifySndFilePath - setzt den korrekten Systempfad zur Notifydatei &#039;&#039;&#039;(default ist /storage/emulated/0/Notifications/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um openApp verwenden zu können, muss als Attribut der Package Name der App angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Um zwischen Bluetoothgeräten wechseln zu können, muß das Attribut setBluetoothDevice mit folgender Syntax gesetzt werden. &#039;&#039;attr &amp;lt;DEVICE&amp;gt; BTdeviceName1|MAC,BTDeviceName2|MAC&#039;&#039; Es muss zwingend darauf geachtet werden das beim BTdeviceName kein Leerzeichen vorhanden ist. Am besten zusammen oder mit Unterstrich. Achtet bei der MAC darauf das Ihr wirklich nach jeder zweiten Zahl auch einen : drin habt &#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &#039;&#039;attr Nexus10Wohnzimmer setBluetoothDevice Logitech_BT_Adapter|AB:12:CD:34:EF:32,Anker_A3565|GH:56:IJ:78:KL:76&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==STATE==&lt;br /&gt;
* initialized - Ist der Status kurz nach einem define..&lt;br /&gt;
* active - die Geräteinstanz ist im aktiven Status.&lt;br /&gt;
* disabled - die Geräteinstanz wurde über das Attribut disable deaktiviert&lt;br /&gt;
&lt;br /&gt;
==deviceState==&lt;br /&gt;
* online - Das Gerät ist online und kann set Befehle entgegennehmen.&lt;br /&gt;
* offline - Ein Gerät wird in den folgenden 3 Szenarien in den Status offline gesetzt:&lt;br /&gt;
** Das Gerät wird mittels shutdown über FHEM runtergefahren. &lt;br /&gt;
** Der Airplainmod (Flugmodus) wird über FHEM aktiviert. &lt;br /&gt;
** Es wurde mehr als 5 mal ein statusRequest erfolglos und mehr als 3 mal ein set Command erfolglos abgeschickt.&lt;br /&gt;
Es bleibt also dem User überlassen das Gerät nach erneuter Verfügbarkeit wieder in den Status online zu setzen. Das kann z.B. über das Presence Modul erzeugt werden (set DEVICE deviceState online)&lt;br /&gt;
&lt;br /&gt;
==Anwendungsbeispiele==&lt;br /&gt;
=== Lademanagement ===&lt;br /&gt;
Ich habe die Ladegeräte für meine Androidgeräte an Funkschaltsteckdosen. ein DOIF schaltet bei unter 30% die Steckdose ein und bei über 90% wieder aus.&lt;br /&gt;
&lt;br /&gt;
Hier mal ein einfaches DOIF Beispiel für ein Lademanagment&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
... DOIF ([Nexus5Handy:powerLevel] &amp;lt; 30) (set LadenetzteilNexus5Handy:FILTER=STATE=off on) DOELSEIF ([Nexus5Handy:powerLevel] &amp;gt; 90) (set LadenetzteilNexus5Handy:FILTER=STATE=on off) DOELSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wecker ===&lt;br /&gt;
Morgens lasse ich mich über mein Tablet im Schlafzimmer mit Musik wecken. Verwendet wird hierzu der wakeuptimer des RESIDENTS Modules. Das abspielen stoppe ich dann von Hand. Danach erfolgt noch eine Ansage wie das Wetter gerade ist und wird.&lt;br /&gt;
&lt;br /&gt;
=== Mediacenter ===&lt;br /&gt;
Mein 10&amp;quot; Tablet im Wohnzimmer ist Mediaplayer für das Wohnzimmer mit Bluetoothlautsprechern. Die Lautstärke wird automatisch runter gesetzt wenn die Fritzbox einen Anruf auf das Wohnzimmer Handgerät signalisiert.&lt;br /&gt;
&lt;br /&gt;
=== Sprachbefehl - Abfragen von Zuständen diverser Sensoren ===&lt;br /&gt;
Wenn ich die Spracheingabe aktiviere und nach der Temperatur im Wohnzimmer frage, bekomme ich diese angesagt.&lt;br /&gt;
&lt;br /&gt;
Der Teil im Feld Daten ist ein klassisches RadingsVal, halt nur ohne Komma und ohne Anführungszeichen&lt;br /&gt;
&lt;br /&gt;
WIRD GERADE ÜBERARBEITET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Schaltbefehle vom Androidgerät an FHEM senden ===&lt;br /&gt;
Hierfür richte bitte einen eigen Flow ein. Wie das genau geht, verrät Dir die Hilfe.&lt;br /&gt;
Um einen Schaltbefehl für FHEM zu erstellen, folgt nach dem Trigger eine Aktion als Script (Aktion Type: Script). Hier trägst Du folgendes ein&lt;br /&gt;
&lt;br /&gt;
setcmd = &amp;quot;LichtWohnzimmerLampeRechts on&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fhemcmd = &amp;quot;set&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In der ersten Zeile wird also der Schaltbefehl in der Variablem setcmd eingetragen und in der zweiten Zeile der FHEM Befehl in der Variablen fhemcmd.&lt;br /&gt;
&lt;br /&gt;
Danach müsst Ihr nur noch in einer weiteren Aktion den Flow &amp;quot;Send Data to AMADCommBridge&amp;quot; ausführen (Aktion Type: Flows ausführen). Die Aktion sollte bereits in Eurer Liste Vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot_20160717-134948.png|200px]]&lt;br /&gt;
[[Datei:Screenshot 17.07.2016 1-50-27.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Nun sollte Lampe1 angeschalten werden wenn der Flow ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bekannte Meldungen/Hinweise/Probleme ==&lt;br /&gt;
&amp;lt;code&amp;gt;PERL WARNING: Use of uninitialized value in hash element at /opt/fhem/FHEM/74_AMAD.pm line 14X&amp;lt;/code&amp;gt;&lt;br /&gt;
Ist ab Version 2.2.2 gefixt. [https://forum.fhem.de/index.php/topic,54433.0.html Dickes Danke an Andy(gandy)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn auf dem Android-Gerät die Fehlermeldung &#039;Accessibility service not running&#039; von Automagic kommt, oder im FHEM das reading state  &#039;Flow Informations mit Fehler beendet&#039; steht, dann muss der Accessibility Service auf dem Android-Device aktiviert werden: Einstellungen --&amp;gt; Bedienungshilfen --&amp;gt; Automagic Premium. Hier muss der Schalter auf &#039;an&#039; stehen. Sollte dies der Fall sein, hilft u.U. ein kurzes Aus- und wieder Einschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gerät wird oft als offline angezeigt und es können keine set Befehle abgesetzt werden.&lt;br /&gt;
Mit der AMAD Version 2.2 hielt eine neue Behandlung des deviceState Readings Einzug. Das Reading stellt nun den tatsächlichen Status des Gerätes gegenüber FHEM da. Bei vielen Android 6 Geräten kommt es aber auf Grund vom DeepSleep Modus zum wegfall der WLAN Verbindung. Hier hilft die neue KeepAlive Funktion in AMAD. Dafür muß lediglich unter &lt;br /&gt;
* Einstellungen --&amp;gt; Akku --&amp;gt; oben auf die drei Punkte - Akku Leistungsoptimierung --&amp;gt; alle Apps und dann Automagic auswählen und &amp;quot;Nicht optimieren&amp;quot;&lt;br /&gt;
ausgewählt werden. Alles andere macht das Modul selbst.&lt;br /&gt;
&lt;br /&gt;
==Ich sage Danke==&lt;br /&gt;
&#039;&#039;Der größte Dank geht an meinen Mentor Andre (justme1968), er hat mir mit hilfreichen Tips geholfen Perlcode zu verstehen und Spaß am programmieren zu haben.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Auch möchte ich mich bei Jens bedanken (jensb) welcher mir ebenfalls mit hilfreichen Tips bei meinen aller ersten Gehversuchen beim Perlcode schreiben unterstützt hat.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;So und nun noch ein besonderer Dank an pah (Prof. Dr. Peter Henning ), ohne seine Aussage &amp;quot;Keine Ahnung hatten wir alle mal, das ist keine Ausrede&amp;quot; hätte ich bestimmt nicht angefangen Interesse an Modulentwicklung zu zeigen :-)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Danke an Jürgen(ujaudio) und Andreas(scooty) die sich um die Übersetzung der Commandref ins Englische gekümmert haben&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Danke auch an Ronny(RoBra81) für seine tollte Idee und Umsetzung von eigenen AMAD Readings aus externen Flows.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TALKTOME_%26_TALKTOUSER_-_Sprachverarbeitung_f%C3%BCr_Nutzerinteraktionen&amp;diff=15880</id>
		<title>TALKTOME &amp; TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TALKTOME_%26_TALKTOUSER_-_Sprachverarbeitung_f%C3%BCr_Nutzerinteraktionen&amp;diff=15880"/>
		<updated>2016-07-22T08:42:01Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Verschiedene Hinweise (Gewünscht hier: https://forum.fhem.de/index.php/topic,54863.msg474625.html#msg474625 und Tippfehlerfixes)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModPurpose=Anbindung von RiveScript an FHEM&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=TALKTOME&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=42_TALKTOME.pm&lt;br /&gt;
|ModOwner=SirUli&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|Name=TALKTOUSER&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModPurpose=Nutzerverbindung zu TALKTOME&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=TALKTOUSER&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=42_TALKTOUSER.pm&lt;br /&gt;
|ModOwner=SirUli&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe der Module TALKTOME &amp;amp; TALKTOUSER und der Sprache RiveScript ist es möglich, Chatbots - bekannt von Webseiten wie IKEA und co - für FHEM einzusetzen, um Frage-Antwort-Dialoge zu bauen.&lt;br /&gt;
&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
Die Haupteigenschaften der Module sind:&lt;br /&gt;
* Anbindung von [http://rivescript.com/ RiveScript] an fhem&lt;br /&gt;
* Abruf von Readings, ReadingTimestamps, Attributen&lt;br /&gt;
* Absetzen von fhem Befehlen oder Aufruf von perl Funktionen&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
* Die Einrichtung von msg für Antworten an die diversen Geräte.&lt;br /&gt;
* Installation von RiveScript in der Version 2.0.1 (oder neuer, falls eine erscheinen sollte) via CPAN. ACHTUNG nicht via apt-get installieren, da die Version zu alt ist.&lt;br /&gt;
&lt;br /&gt;
==== msg ====&lt;br /&gt;
Bei der ersten Verwendung des Befehls &amp;quot;msg&amp;quot; wird ein Device namens globalMsg angelegt, was man aber dem Modul vorweg nehmen kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define globalMsg msgConfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation von RiveScript ====&lt;br /&gt;
Rufe cpan auf:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cpan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sieht dann etwa so aus:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cpan&lt;br /&gt;
Loading internal null logger. Install Log::Log4perl for logging messages&lt;br /&gt;
Terminal does not support AddHistory.&lt;br /&gt;
&lt;br /&gt;
cpan shell -- CPAN exploration and modules installation (v2.10)&lt;br /&gt;
Enter &#039;h&#039; for help.&lt;br /&gt;
&lt;br /&gt;
cpan[1]&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installiere dann Rivescript mit Hilfe des folgenden Kommandos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
install RiveScript&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls Fragen aufkommen, ob man Abhängigkeiten folgen soll, dann bitte richtig beantworten (yes) ;)&lt;br /&gt;
&lt;br /&gt;
=== Installation der Module ===&lt;br /&gt;
Geht wie immer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/SirUli/FHEM-TALKTO/master/controls_talkto.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend sollte man im Ordner FHEM drei zusätzliche Files (42_TALKTOME.pm, 42_TALKTOUSER.pm sowie TALKTOME.rive.template) finden. Letzteres benennt man nun um in TALKTOME.rive. An dieser Stelle darf man das File natürlich auch schon editieren - wenn man möchte und Rivescript versteht.&lt;br /&gt;
&lt;br /&gt;
Wenn man sich übrigens später sicher ist, dass man das dauerhaft nutzen will, würde ich das update command mit in den reguläre update Prozess einbinden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update add https://raw.githubusercontent.com/SirUli/FHEM-TALKTO/master/controls_talkto.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Definition ====&lt;br /&gt;
Dann geht es los mit der Definition des Chatbots an sich:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define FHEMTALKTOME TALKTOME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEMTALKTOME ist sozusagen nun der Bot, welcher zu Beginn noch deaktiviert ist. Bevor man diesen aktiviert, muss man den Pfad zum TALKTOME.rive File setzen. Ist dieses File im Ordner FHEM (sozusagen also wie Auslieferungszustand und oben beschrieben), so setzt man folgendes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr FHEMTALKTOME rsbrainfile ./FHEM/TALKTOME.rive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann kann man das Attribut &amp;quot;disable&amp;quot; entfernen. Für die Nutzerinteraktion kann man noch weitere Details eines Nutzer pflegen(derzeit nur den &amp;quot;richtigen&amp;quot; Namen), daher brauchen wir ein Benutzermodul, also z.B. für mich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define TALKTOUSER_ULI TALKTOUSER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACHTUNG EINSCHRÄNKUNG: Derzeit ist nur ein Nutzer sinnvoll - da keine Filterung in den Geräten vorhanden ist. Siehe [https://forum.fhem.de/index.php/topic,54863.msg464432.html#msg464432 ToDo-Liste im Forenthread]&lt;br /&gt;
&lt;br /&gt;
Nun kommt der wichtigste Teil - die Einbindung einer Quelle. Bei mir ist das nun Telegram, welches nun zwei zusätzliche Attribute via userattr bekommen muss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
talktouserMonitorReading talktouserModSourceDev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;(wenn du keine Ahnung hast: attr TELEGRAMBOT userattr talktouserMonitorReading talktouserModSourceDev)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was heissen die Attribute?&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;talktouserMonitorReading&amp;lt;/code&amp;gt;: Bezeichnet das Reading welches überwacht werden soll, im falle von Telegram ist dies auf &amp;quot;msgText&amp;quot; zu setzen&lt;br /&gt;
* &amp;lt;code&amp;gt;talktouserModSourceDev&amp;lt;/code&amp;gt;: Lässt eine Änderung des Quell Devices zu. So muss beispielsweise für Telegram, damit eine Antwort machbar ist, das Quelldevice verändert werden. Lokale Readings (also vom Quelldevice) werden mit &amp;lt;code&amp;gt;%%readingname%%&amp;lt;/code&amp;gt; angegeben, das device selbst ist &amp;lt;code&amp;gt;%DEVICE%&amp;lt;/code&amp;gt;. Für Telegram muss beispielsweise &amp;lt;code&amp;gt;%DEVICE%:@%%msgPeerId%%&amp;lt;/code&amp;gt; gesetzt werden, damit die Antworten ankommen.&lt;br /&gt;
&lt;br /&gt;
=== Wie legt man nun Dialoge an? ===&lt;br /&gt;
Dazu empfehle ich einmal durch das [https://www.rivescript.com/docs/tutorial Tutorial] ab den &amp;quot;First Steps&amp;quot; zu gehen und sich die Beispieldatei &amp;lt;code&amp;gt;FHEM/TALKTOME.rive.template&amp;lt;/code&amp;gt; zu Gemüte zu führen. Diese bietet schon so Kleinigkeiten wie &amp;quot;Wie heisst du&amp;quot; als Fragen oder die Frage nach dem Wetter (Geräte eben entsprechend austauschen!) oder den Raumtemperaturen.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich:&lt;br /&gt;
* Readings lassen sich per &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;readingsval BK_Wetter fc1_low_c Error&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt; auslesen&lt;br /&gt;
* Readings Timestamps lassen sich per &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;readingstimestamp LR_Wandthermostat temperature Error&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt; auslesen&lt;br /&gt;
* Attribute lassen sich per &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;attrval BK_Wetter fc1_low_c Error&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt; auslesen&lt;br /&gt;
* FHEM Kommandos kann man so ausführen:&amp;lt;code&amp;gt;&amp;lt;call&amp;gt;fhem set KU_SWITCH_COFFEE_Sw on&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Perl Methoden/Funktionen kann man so ausführen: &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;perl chatbot_beispielfunktion&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise:&lt;br /&gt;
* Wie aus den beispielen Erkennbar sind alle &#039;&#039;handler&#039;&#039;, also die Zeilen welche mit &amp;quot;+&amp;quot; beginnen, klein geschrieben und das ist Absicht!&lt;br /&gt;
* Standardmäßig werden die Zeichen &amp;lt;code&amp;gt;.,!?;:¡¿&amp;lt;/code&amp;gt; als überflüssige Satzzeichen behandelt und daher ausgefiltert. Will man nun (wie unten beschrieben) Telegram-Kommandos (welche mit / beginnen) ausführen lassen, so empfiehlt es sich, das Attribut rspunctuation auf &amp;lt;code&amp;gt;.,!?;:¡¿/&amp;lt;/code&amp;gt; zu setzen. Somit kann dann Rivescript aus &amp;quot;/Temperaturen&amp;quot; den Befehl &amp;quot;temperaturen&amp;quot; filtern und auf diesen reagieren.&lt;br /&gt;
&lt;br /&gt;
=== Was ist derzeit noch ToDo? ===&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,54863.msg464432.html#msg464432 Thread]&lt;br /&gt;
&lt;br /&gt;
= Umgesetzte Projekte =&lt;br /&gt;
&lt;br /&gt;
== Beleuchtungssteuerung mit Telegram ==&lt;br /&gt;
&lt;br /&gt;
=== Ziel ===&lt;br /&gt;
&lt;br /&gt;
Über Telegram soll es möglich sein, die Beleuchtung im Haus ein und auszuschalten.&lt;br /&gt;
&lt;br /&gt;
=== Ausgangssituation ===&lt;br /&gt;
&lt;br /&gt;
Bei mir haben die meisten Geräte im FHEM das Namensschema&lt;br /&gt;
&lt;br /&gt;
ET.ra.FU.Beschreibung&lt;br /&gt;
&lt;br /&gt;
wobei&lt;br /&gt;
&lt;br /&gt;
ET = Kürzel für Etage&lt;br /&gt;
ra = Kürzel für Raum&lt;br /&gt;
FU = Kürzel für Funktion&lt;br /&gt;
&lt;br /&gt;
So ist zum Beispiel die Lampe im Esszimmer über dem Esstisch OG.ez.LI.Esstisch.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung ===&lt;br /&gt;
&lt;br /&gt;
Zunächst wird ein Menü gebaut, welches als Antwort auf die Nachricht &amp;quot;Hauptmenü&amp;quot; über Telegram gesendet wird:&lt;br /&gt;
&lt;br /&gt;
.rive-Datei:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
! sub hauptmenü = hauptmenue&lt;br /&gt;
&lt;br /&gt;
+ [*] (abbrechen|hauptmenue) [*]&lt;br /&gt;
- Hauptmenü:&lt;br /&gt;
^ /Licht_Aus&lt;br /&gt;
^ /Licht_An&lt;br /&gt;
&lt;br /&gt;
+ leave&lt;br /&gt;
- Untermenü verlassen \n \s \n {@ hauptmenue}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;/&amp;quot; vor den einzelnen Menüpunkten sorgen dafür, dass diese im Telegram direkt anklickbar sind.&lt;br /&gt;
&lt;br /&gt;
Als nächstes werden zwei subs in der myUtils benötigt, um alle ein- bzw. ausgeschalteten Lampen zu ermitteln und als Antwort für Telegram zu formatieren:&lt;br /&gt;
&lt;br /&gt;
99_myUtils.pm:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub&lt;br /&gt;
chatBot_getLightsOn&lt;br /&gt;
{&lt;br /&gt;
  my @lights = devspec2array(&#039;.*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy&#039;);;&lt;br /&gt;
  my $msg = &amp;quot;Es sind folgende Lichter eingeschaltet:\n \n&amp;quot;;;&lt;br /&gt;
  my $room = &amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  if (@lights &amp;gt; 0 and defined($defs{$lights[0]})){&lt;br /&gt;
    foreach (@lights){&lt;br /&gt;
      if ($room ne AttrVal($_, &amp;quot;room&amp;quot;, $_))&lt;br /&gt;
      {&lt;br /&gt;
        if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
          $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Aus \n&amp;quot;; &lt;br /&gt;
        }&lt;br /&gt;
        $room = AttrVal($_, &amp;quot;room&amp;quot;, $_);&lt;br /&gt;
        $msg .= &amp;quot; \n&amp;quot;.$room.&amp;quot;: \n&amp;quot;; &lt;br /&gt;
      }&lt;br /&gt;
      $_ =~ s/\./__/g;&lt;br /&gt;
      $msg .= &amp;quot;/&amp;quot;.$_.&amp;quot; \n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
      $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Aus \n&amp;quot;; &lt;br /&gt;
    }&lt;br /&gt;
    $msg .= &amp;quot; \n/Alle_Aus&lt;br /&gt;
             \n \n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }else{&lt;br /&gt;
    $msg = &amp;quot;Es sind alle Lichter ausgeschaltet.&amp;quot;;;&lt;br /&gt;
    $msg .= &amp;quot;\n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }&lt;br /&gt;
  return $msg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub&lt;br /&gt;
chatBot_getLightsOff&lt;br /&gt;
{&lt;br /&gt;
  my @lights = devspec2array(&#039;.*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy&#039;);;&lt;br /&gt;
  my $msg = &amp;quot;Es sind folgende Lichter ausgeschaltet:\n \n&amp;quot;;;&lt;br /&gt;
  my $room = &amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  if (@lights &amp;gt; 0 and defined($defs{$lights[0]})){&lt;br /&gt;
    foreach (@lights){&lt;br /&gt;
      if ($room ne AttrVal($_, &amp;quot;room&amp;quot;, $_))&lt;br /&gt;
      {&lt;br /&gt;
        if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
          $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Ein \n&amp;quot;; &lt;br /&gt;
        }&lt;br /&gt;
        $room = AttrVal($_, &amp;quot;room&amp;quot;, $_);&lt;br /&gt;
        $msg .= &amp;quot; \n&amp;quot;.$room.&amp;quot;: \n&amp;quot;; &lt;br /&gt;
      }&lt;br /&gt;
      $_ =~ s/\./__/g;&lt;br /&gt;
      $msg .= &amp;quot;/&amp;quot;.$_.&amp;quot; \n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
      $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Ein \n&amp;quot;; &lt;br /&gt;
    }&lt;br /&gt;
    $msg .= &amp;quot; \n/Alle_Ein&lt;br /&gt;
             \n \n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }else{&lt;br /&gt;
    $msg = &amp;quot;Es sind alle Lichter eingeschaltet.&amp;quot;;;&lt;br /&gt;
    $msg .= &amp;quot;\n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }&lt;br /&gt;
  return $msg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Formatierung für Telegram erfolgt, indem die . durch __ ersetzt werden und ein / vorangestellt wird, damit es im Telegram anklickbar wird.&lt;br /&gt;
&lt;br /&gt;
Nun folge die Logik für RiveScript. Zunächst die Abfrage für die Auflistung der ein- bzw. ausgeschalteten Lampen (inklusive notwendiger Definitionen):&lt;br /&gt;
&lt;br /&gt;
.rive-Datei:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
! array levels  = eg og dg au&lt;br /&gt;
! array rooms   = ku ez ba fk sp ks wz bu sz&lt;br /&gt;
! array spacer  = __ _&lt;br /&gt;
&lt;br /&gt;
+ licht(@spacer)aus&lt;br /&gt;
- &amp;lt;call&amp;gt;perl chatBot_getLightsOn&amp;lt;/call&amp;gt;{topic=licht_aus}&lt;br /&gt;
&lt;br /&gt;
+ licht(@spacer)an&lt;br /&gt;
- &amp;lt;call&amp;gt;perl chatBot_getLightsOff&amp;lt;/call&amp;gt;{topic=licht_an}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend die Schaltfunktionen:&lt;br /&gt;
&lt;br /&gt;
.rive-Datei:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; topic licht_aus&lt;br /&gt;
&lt;br /&gt;
  + [*] (abbrechen|hauptmenue) [*]&lt;br /&gt;
  - {topic=random} {@ leave}&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}_{formal}&amp;lt;star9&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; off&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; off&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  + alle(@spacer)aus&lt;br /&gt;
  - Schalte alle Lichter aus \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy off&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)(*)(@spacer)aus&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}_{formal}&amp;lt;star4&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; off&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)aus&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; off&amp;lt;/call&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt; topic&lt;br /&gt;
&lt;br /&gt;
&amp;gt; topic licht_an&lt;br /&gt;
&lt;br /&gt;
  + [*] (abbrechen|hauptmenue) [*]&lt;br /&gt;
  - {topic=random} {@ leave}&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}_{formal}&amp;lt;star9&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + alle(@spacer)ein&lt;br /&gt;
  - Schalte alle Lichter ein \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)(*)(@spacer)ein&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}_{formal}&amp;lt;star4&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)ein&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein möglicher Dialog mit FHEM sähe dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hauptmenü&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hauptmenü:&lt;br /&gt;
/Licht_Aus&lt;br /&gt;
/Licht_An&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Licht_An&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Es sind folgende Lichter ausgeschaltet:&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Aussenwelt: &lt;br /&gt;
/AU__ho__LI__Markise &lt;br /&gt;
/AU__ho__LI__Terrasse &lt;br /&gt;
 &lt;br /&gt;
/Aussenwelt_Ein &lt;br /&gt;
 &lt;br /&gt;
Buero: &lt;br /&gt;
/DG__bu__LI__Flur &lt;br /&gt;
/DG__bu__LI__Schornstein &lt;br /&gt;
/DG__bu__LI__Schreibtisch &lt;br /&gt;
 &lt;br /&gt;
/Buero_Ein &lt;br /&gt;
 &lt;br /&gt;
Schlafzimmer: &lt;br /&gt;
/DG__sz__LI__Hinten_Halogen &lt;br /&gt;
/DG__sz__LI__Hinten_Led &lt;br /&gt;
/DG__sz__LI__Kleiderschrank &lt;br /&gt;
/DG__sz__LI__Vorn &lt;br /&gt;
 &lt;br /&gt;
/Schlafzimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Wohnzimmer: &lt;br /&gt;
/DG__wz__LI__Allgemein &lt;br /&gt;
 &lt;br /&gt;
/Wohnzimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Esszimmer: &lt;br /&gt;
/OG__ez__LI__Allgemein &lt;br /&gt;
/OG__ez__LI__Bogen &lt;br /&gt;
/OG__ez__LI__Esstisch &lt;br /&gt;
/OG__ez__LI__Vitrine &lt;br /&gt;
 &lt;br /&gt;
/Esszimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Flur_Kinder: &lt;br /&gt;
/OG__fk__LI__Allgemein &lt;br /&gt;
 &lt;br /&gt;
/Flur_Kinder_Ein &lt;br /&gt;
 &lt;br /&gt;
Hausflur: &lt;br /&gt;
/OG__hf__LI__Schuhschrank &lt;br /&gt;
/OG__hf__LI__Treppe &lt;br /&gt;
 &lt;br /&gt;
/Hausflur_Ein &lt;br /&gt;
 &lt;br /&gt;
Kinderschlafzimmer: &lt;br /&gt;
/OG__ks__LI__Allgemein &lt;br /&gt;
/OG__ks__LI__Bett &lt;br /&gt;
/OG__ks__LI__Sterne &lt;br /&gt;
 &lt;br /&gt;
/Kinderschlafzimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Kueche: &lt;br /&gt;
/OG__ku__LI__Besenschrank &lt;br /&gt;
/OG__ku__LI__Kuechenzeile &lt;br /&gt;
/OG__ku__LI__Kuehlschrank &lt;br /&gt;
/OG__ku__LI__Theke &lt;br /&gt;
 &lt;br /&gt;
/Kueche_Ein &lt;br /&gt;
 &lt;br /&gt;
Spielzimmer_Kinder: &lt;br /&gt;
/OG__sp__LI__Baggerheck_Schreibtisch &lt;br /&gt;
/OG__sp__LI__Baggerschaufel_Podest &lt;br /&gt;
 &lt;br /&gt;
/Spielzimmer_Kinder_Ein &lt;br /&gt;
 &lt;br /&gt;
Treppe: &lt;br /&gt;
/OG__tr__LI__Handlauf_Fenster &lt;br /&gt;
 &lt;br /&gt;
/Treppe_Ein &lt;br /&gt;
 &lt;br /&gt;
/Alle_Ein&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/Hauptmenue&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/OG__ku__LI__Kuechenzeile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Schalte Licht OG.ku.LI.Kuechenzeile ein&lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/OG__ku__LI__Kuechenschrank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Schalte Licht OG.ku.LI.Kuechenschrank ein &lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Untermenü verlassen &lt;br /&gt;
 &lt;br /&gt;
 Hauptmenü:&lt;br /&gt;
/Licht_Aus&lt;br /&gt;
/Licht_An&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Licht_Aus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Es sind folgende Lichter eingeschaltet:&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Kueche: &lt;br /&gt;
/OG__ku__LI__Kuechenschrank &lt;br /&gt;
/OG__ku__LI__Kuechenzeile &lt;br /&gt;
 &lt;br /&gt;
/Kueche_Aus &lt;br /&gt;
&lt;br /&gt;
/Alle_Aus&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Kueche_Aus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Schalte Licht in Kueche aus &lt;br /&gt;
 /Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beleuchtungssteuerung über Sprache ==&lt;br /&gt;
&lt;br /&gt;
Die Module können nicht nur eingesetzt werden, um mittels Telegram zu kommunizieren. Ein weiteres Beispiel ist der Einsatz als Spracherkennung für gesprochene Befehle über z.B. [[AMAD]]. Hier ist allerdings zum jetzigen Zeitpunkt noch keine gesprochene Antwort möglich und das Zieldevice für die Antwort kann nur hardcodiert hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Zunächst müssen in der AMADCommBridge die notwendigen Attribute gesetzt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr AMADCommBridge userattr talktouserMonitorReading talktouserModSourceDev &lt;br /&gt;
attr AMADCommBridge talktouserModSourceDev HandyRonny &lt;br /&gt;
attr AMADCommBridge talktouserMonitorReading receiveVoiceCommand &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss noch die Logik für RiveScript hinterlegt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Aus den gesprochenen Räumen werden die Kürzel ermittelt&lt;br /&gt;
! person badezimmer = OG.ba.&lt;br /&gt;
! person buero = DG.bu.&lt;br /&gt;
! person esszimmer = OG.ez.&lt;br /&gt;
! person flur_kinder = OG.fk.&lt;br /&gt;
! person hausflur = OG.hf.&lt;br /&gt;
! person kinderschlafzimmer = OG.ks.&lt;br /&gt;
! person kueche = OG.ku.&lt;br /&gt;
! person schlafzimmer = DG.sz.&lt;br /&gt;
! person spielzimmer_kinder = OG.sp.&lt;br /&gt;
! person treppe = OG.tr.&lt;br /&gt;
! person unten_kueche = EG.uk.&lt;br /&gt;
! person unten_stube = EG.st.&lt;br /&gt;
! person waschhaus = EG.wh.&lt;br /&gt;
! person wohnzimmer = DG.wz.&lt;br /&gt;
&lt;br /&gt;
// Aus den gesprochenen Befehlen werden die FHEM Befehle ermittelt&lt;br /&gt;
! person ein = on&lt;br /&gt;
! person an = on&lt;br /&gt;
! person aus = off&lt;br /&gt;
&lt;br /&gt;
// einige Ersetzungen, um nicht immer den konkreten Begriff verwenden zu müssen&lt;br /&gt;
! sub büro = buero&lt;br /&gt;
! sub küche = kueche&lt;br /&gt;
! sub bad = badezimmer&lt;br /&gt;
! sub flur kinder = flur_kinder&lt;br /&gt;
! sub kinderflur = flur_kinder&lt;br /&gt;
! sub spielzimmer kinder = spielzimmer_kinder&lt;br /&gt;
! sub spielzimmer = spielzimmer_kinder&lt;br /&gt;
! sub kinderspielzimmer = spielzimmer_kinder&lt;br /&gt;
! sub kinderzimmer = spielzimmer_kinder&lt;br /&gt;
! sub kueche unten = unten_kueche&lt;br /&gt;
// Die Deckenlampe heißt meistens Allgemein&lt;br /&gt;
! sub decke = allgemein&lt;br /&gt;
&lt;br /&gt;
// Ersetzungen, um einen anderen Satzbau zu erlauben&lt;br /&gt;
! sub einschalten = ein&lt;br /&gt;
! sub anschalten = an&lt;br /&gt;
! sub anmachen = an&lt;br /&gt;
! sub ausmachen = aus&lt;br /&gt;
! sub ausschalten = aus&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************\&lt;br /&gt;
 * Lichtsteuerung per Sprache                                                *&lt;br /&gt;
\*****************************************************************************/&lt;br /&gt;
! array schaltenaliaseinschalten		= an|ein&lt;br /&gt;
! array schaltenaliasausschalten		= aus&lt;br /&gt;
! array schaltenaliashandlung   		= an|ein|aus&lt;br /&gt;
! array schaltenaliasartikel			  = der|die|das&lt;br /&gt;
! array schaltenaliasfuellwoerter		= schalte|mach&lt;br /&gt;
! array schaltenaliasorte				    = in|am|auf|an|im|auf dem&lt;br /&gt;
! array schaltenaliashoeflich 	    = bitte&lt;br /&gt;
! array roomsfull                   = badezimmer|buero|esszimmer|flur_kinder|hausflur|kinderschlafzimmer|kueche|schlafzimmer|spielzimmer_kinder|treppe|unten_kueche|unten_stube|waschhaus|wohnzimmer&lt;br /&gt;
&lt;br /&gt;
// einzelnes Licht ein- bzw. ausschalten&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht im Wohnzimmer an der Decke (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] (@roomsfull) [@schaltenaliasorte] [@schaltenaliasartikel] _ (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set lightroom={person}&amp;lt;star1&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ &amp;lt;set lightname={formal}&amp;lt;star2&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
^ Licht &amp;lt;get lightroom&amp;gt;&amp;lt;get lightname&amp;gt; wird &amp;lt;star3&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get lightroom&amp;gt;.*&amp;lt;get lightname&amp;gt;.* {person}&amp;lt;star3&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// einzelnes Licht ein- bzw. ausschalten - anderer Satzbau&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht an der Decke im Wohnzimmer (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set lightroom={person}&amp;lt;star2&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ &amp;lt;set lightname={formal}&amp;lt;star1&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
^ Licht &amp;lt;get lightroom&amp;gt;&amp;lt;get lightname&amp;gt; wird &amp;lt;star3&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get lightroom&amp;gt;.*&amp;lt;get lightname&amp;gt;.* {person}&amp;lt;star3&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// einzelnes Licht mit zweiteiligem Namen ein- bzw. ausschalten&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht im Schlafzimmer hinten halogen (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] zwei worte _ _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set lightroom={person}&amp;lt;star3&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ &amp;lt;set lightname={formal}&amp;lt;star1&amp;gt;{/formal}_{formal}&amp;lt;star2&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
^ Licht &amp;lt;get lightroom&amp;gt;&amp;lt;get lightname&amp;gt; wird &amp;lt;star4&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get lightroom&amp;gt;.*&amp;lt;get lightname&amp;gt;.* {person}&amp;lt;star4&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Licht in einem Zimmer ein- bzw. ausschalten&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht im Schlafzimmer (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] (@roomsfull) (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set light={person}&amp;lt;star1&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ Licht {formal}&amp;lt;star1&amp;gt;{/formal} wird &amp;lt;star2&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get light&amp;gt;.* {person}&amp;lt;star2&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kann sind zum Beispiel für die Lampe am Küchenschrank folgende Sprachbefehle möglich (Begriffe in eckigen Klammen, wie z.B. [bitte] sind optional; durch | getrennte Begriffe in Klammern stellen Alternativen dar):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus)&lt;br /&gt;
[schalte|mache] [bitte] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus)&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[schalte|mache] [bitte] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[bitte] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus)[schalten|machen]&lt;br /&gt;
[bitte] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus)[schalten|machen]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird die konkrete Lampe weggelassen, so wird das Licht im gesamten Raum ein-/ausgeschaltet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[schalte|mache] [bitte] [das] Licht [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[bitte] [das] Licht [in] [der] Küche (an|ein|aus)[schalten|machen]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da ich auch Lampen habe, deren Beschreibung aus zwei durch _ getrennten Begriffen besteht (z.B. OG.sp.LI.Baggerschaufel_Podest ist die vordere Glühbirne einer Baggerlampe, welche ein Podest beleuchtet), habe ich zwei Möglichkeiten eingebaut, diese zu schalten:&lt;br /&gt;
&lt;br /&gt;
1. Ankündigung, dass es sich um einen Begriff mit zwei Worten handelt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Küche [an] [der] zwei Worte Baggerschaufel Podest (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(weitere Alternativen zum Satzbau wie oben)&lt;br /&gt;
&lt;br /&gt;
2. Die Beschreibung wird beim schalten generell zwischen zwei &amp;quot;.*&amp;quot; gesetzt, so dass alle Devices geschaltet werden, auf welche die Beschreibung zutrifft. Dadurch führen auch die folgenden Befehle (in allen oben beschriebenen Satzbauvarianten) zum Erfolg:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Küche [am] Podest (an|ein|aus)&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Küche [an] [der] Baggerschaufel (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch ist zu beachten, dass z.B. bei den beiden Lampen DG.sz.LI.Hinten_Led und DG.sz.LI.Hinten_Halogen mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Schlafzimmer hinten (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
beide Lampen geschaltet werden und mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Schlafzimmer Halogen (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nur eine der beiden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
* Forumsartikel [https://forum.fhem.de/index.php/topic,54863.0.html Module: TALKTOME &amp;amp; TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen]&lt;br /&gt;
* Forumsartikel [https://forum.fhem.de/index.php/topic,39983.0.html Neuer FHEM Befehl &amp;quot;msg&amp;quot; für Benachrichtigungen]&lt;br /&gt;
* RiveScript [https://www.rivescript.com/docs/tutorial#first-steps First steps]&lt;br /&gt;
* Modul [[AMAD]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TALKTOME_%26_TALKTOUSER_-_Sprachverarbeitung_f%C3%BCr_Nutzerinteraktionen&amp;diff=15806</id>
		<title>TALKTOME &amp; TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TALKTOME_%26_TALKTOUSER_-_Sprachverarbeitung_f%C3%BCr_Nutzerinteraktionen&amp;diff=15806"/>
		<updated>2016-07-06T13:47:25Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Crosslinks zum Thread&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModPurpose=Anbindung von RiveScript an FHEM&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=TALKTOME&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=42_TALKTOME.pm&lt;br /&gt;
|ModOwner=SirUli&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|Name=TALKTOUSER&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModPurpose=Nutzerverbindung zu TALKTOME&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=TALKTOUSER&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=42_TALKTOUSER.pm&lt;br /&gt;
|ModOwner=SirUli&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe der Module TALKTOME &amp;amp; TALKTOUSER und der Sprache RiveScript ist es möglich, Chatbots - bekannt von Webseiten wie IKEA und co - für FHEM einzusetzen, um Frage-Antwort-Dialoge zu bauen.&lt;br /&gt;
&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
Die Haupteigenschaften von XYZ sind&lt;br /&gt;
* Anbindung von RiveScript an fhem&lt;br /&gt;
* Abruf von Readings, ReadingTimestamps, Attributen&lt;br /&gt;
* Absetzen von fhem Befehlen oder Aufruf von perl Funktionen&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
* Die Einrichtung von msg für Antworten an die diversen Geräte.&lt;br /&gt;
* Installation von RiveScript in der Version 2.0.1 (oder neuer, falls eine erscheinen sollte) via CPAN. ACHTUNG nicht via apt-get installieren, da die Version zu alt ist.&lt;br /&gt;
&lt;br /&gt;
==== msg ====&lt;br /&gt;
Bei der ersten Verwendung des Befehls &amp;quot;msg&amp;quot; wird ein Device namens globalMsg angelegt, was man aber dem Modul vorweg nehmen kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define globalMsg msgConfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation von RiveScript ====&lt;br /&gt;
Rufe cpan auf:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cpan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sieht dann etwa so aus:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cpan&lt;br /&gt;
Loading internal null logger. Install Log::Log4perl for logging messages&lt;br /&gt;
Terminal does not support AddHistory.&lt;br /&gt;
&lt;br /&gt;
cpan shell -- CPAN exploration and modules installation (v2.10)&lt;br /&gt;
Enter &#039;h&#039; for help.&lt;br /&gt;
&lt;br /&gt;
cpan[1]&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installiere dann Rivescript mit Hilfe des folgenden Kommandos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
install RiveScript&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls Fragen aufkommen, ob man Abhängigkeiten folgen soll, dann bitte richtig beantworten (yes) ;)&lt;br /&gt;
&lt;br /&gt;
=== Installation der Module ===&lt;br /&gt;
Geht wie immer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update all https://raw.githubusercontent.com/SirUli/FHEM-TALKTO/master/controls_talkto.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend sollte man im Ordner FHEM drei zusätzliche Files (42_TALKTOME.pm, 42_TALKTOUSER.pm sowie TALKTOME.rive.template) finden. Letzteres benennt man nun um in TALKTOME.rive. An dieser Stelle darf man das File natürlich auch schon editieren - wenn man möchte und Rivescript versteht.&lt;br /&gt;
&lt;br /&gt;
Wenn man sich übrigens später sicher ist, dass man das dauerhaft nutzen will, würde ich das update command mit in den reguläre update Prozess einbinden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update add https://raw.githubusercontent.com/SirUli/FHEM-TALKTO/master/controls_talkto.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Definition ====&lt;br /&gt;
Dann geht es los mit der Definition des Chatbots an sich:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define FHEMTALKTOME TALKTOME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEMTALKTOME ist sozusagen nun der Bot, welcher zu Beginn noch deaktiviert ist. Bevor man diesen aktiviert, muss man den Pfad zum TALKTOME.rive File setzen. Ist dieses file im Ordner FHEM (sozusagen also wie Auslieferungszustand und oben beschrieben), so setzt man folgendes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr FHEMTALKTOME rsbrainfile ./FHEM/TALKTOME.rive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann kann man das Attribut &amp;quot;disable&amp;quot; entfernen. Für die Nutzerinteraktion kann man noch weitere Details eines Nutzer pflegen(derzeit nur den &amp;quot;richtigen&amp;quot; Namen), daher brauchen wir ein Benutzermodul, also z.B. für mich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define TALKTOUSER_ULI TALKTOUSER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACHTUNG EINSCHRÄNKUNG: Derzeit ist nur ein Nutzer sinnvoll - da keine Filterung in den Geräten vorhanden ist. Siehe [https://forum.fhem.de/index.php/topic,54863.msg464432.html#msg464432 ToDo-Liste im Forenthread]&lt;br /&gt;
&lt;br /&gt;
Nun kommt der wichtigste Teil - die Einbindung einer Quelle. Bei mir ist das nun Telegram, welches nun zwei zusätzliche Attribute via userattr bekommen muss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
talktouserMonitorReading talktouserModSourceDev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;(wenn du keine Ahnung hast: attr TELEGRAMBOT userattr talktouserMonitorReading talktouserModSourceDev)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was heissen die Attribute?&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;talktouserMonitorReading&amp;lt;/code&amp;gt;: Bezeichnet das Reading welches überwacht werden soll, im falle von Telegram ist dies auf &amp;quot;msgText&amp;quot; zu setzen&lt;br /&gt;
* &amp;lt;code&amp;gt;talktouserModSourceDev&amp;lt;/code&amp;gt;: Lässt eine Änderung des Quell Devices zu. So muss beispielsweise für Telegram, damit eine Antwort machbar ist, das Quelldevice verändert werden. Lokale Readings (also vom Quellverzeichnis) werden mit &amp;lt;code&amp;gt;%%readingname%%&amp;lt;/code&amp;gt; angegeben, das device selbst ist &amp;lt;code&amp;gt;%DEVICE%&amp;lt;/code&amp;gt;. Für Telegram muss beispielsweise &amp;lt;code&amp;gt;%DEVICE%:@%%msgPeerId%%&amp;lt;/code&amp;gt; gesetzt werden, damit die Antworten ankommen&lt;br /&gt;
&lt;br /&gt;
=== Wie legt man nun Dialoge an? ===&lt;br /&gt;
Dazu empfehle ich einmal durch das [https://www.rivescript.com/docs/tutorial Tutorial] ab den &amp;quot;First Steps&amp;quot; zu gehen und sich die Beispieldatei &amp;lt;code&amp;gt;FHEM/TALKTOME.rive.template&amp;lt;/code&amp;gt; zu Gemüte zu führen. Diese bietet schon so kleinigkeiten wie &amp;quot;Wie heisst du&amp;quot; als Fragen oder die Frage nach dem Wetter (Geräte eben entsprechend austauschen!) oder den Raumtemperaturen.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich:&lt;br /&gt;
* Readings lassen sich per &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;readingsval BK_Wetter fc1_low_c Error&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt; auslesen&lt;br /&gt;
* Readings Timestamps lassen sich per &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;readingstimestamp LR_Wandthermostat temperature Error&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt; auslesen&lt;br /&gt;
* Attribute lassen sich per &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;attrval BK_Wetter fc1_low_c Error&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt; auslesen&lt;br /&gt;
* FHEM Kommandos kann man so ausführen:&amp;lt;code&amp;gt;&amp;lt;call&amp;gt;fhem set KU_SWITCH_COFFEE_Sw on&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Perl Methoden/Funktionen kann man so ausführen: &amp;lt;code&amp;gt;&amp;lt;call&amp;gt;perl chatbot_beispielfunktion&amp;lt;/call&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Was ist derzeit noch ToDo? ===&lt;br /&gt;
Siehe [https://forum.fhem.de/index.php/topic,54863.msg464432.html#msg464432 Thread]&lt;br /&gt;
&lt;br /&gt;
= Umgesetzte Projekte =&lt;br /&gt;
&lt;br /&gt;
== Beleuchtungssteuerung mit Telegram ==&lt;br /&gt;
&lt;br /&gt;
=== Ziel ===&lt;br /&gt;
&lt;br /&gt;
Über Telegram soll es möglich sein, die Beleuchtung im Haus ein und auszuschalten.&lt;br /&gt;
&lt;br /&gt;
=== Ausgangssituation ===&lt;br /&gt;
&lt;br /&gt;
Bei mir haben die meisten Geräte im FHEM das Namensschema&lt;br /&gt;
&lt;br /&gt;
ET.ra.FU.Beschreibung&lt;br /&gt;
&lt;br /&gt;
wobei&lt;br /&gt;
&lt;br /&gt;
ET = Kürzel für Etage&lt;br /&gt;
ra = Kürzel für Raum&lt;br /&gt;
FU = Kürzel für Funktion&lt;br /&gt;
&lt;br /&gt;
So ist zum Beispiel die Lampe im Esszimmer über dem Esstisch OG.ez.LI.Esstisch.&lt;br /&gt;
&lt;br /&gt;
=== Umsetzung ===&lt;br /&gt;
&lt;br /&gt;
Zunächst wird ein Menü gebaut, welches als Antwort auf die Nachricht &amp;quot;Hauptmenü&amp;quot; über Telegram gesendet wird:&lt;br /&gt;
&lt;br /&gt;
.rive-Datei:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
! sub hauptmenü = hauptmenue&lt;br /&gt;
&lt;br /&gt;
+ [*] (abbrechen|hauptmenue) [*]&lt;br /&gt;
- Hauptmenü:&lt;br /&gt;
^ /Licht_Aus&lt;br /&gt;
^ /Licht_An&lt;br /&gt;
&lt;br /&gt;
+ leave&lt;br /&gt;
- Untermenü verlassen \n \s \n {@ hauptmenue}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;/&amp;quot; vor den einzelnen Menüpunkten sorgen dafür, dass diese im Telegram direkt anklickbar sind.&lt;br /&gt;
&lt;br /&gt;
Als nächstes werden zwei subs in der myUtils benötigt, um alle ein- bzw. ausgeschalteten Lampen zu ermitteln und als Antwort für Telegram zu formatieren:&lt;br /&gt;
&lt;br /&gt;
99_myUtils.pm:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub&lt;br /&gt;
chatBot_getLightsOn&lt;br /&gt;
{&lt;br /&gt;
  my @lights = devspec2array(&#039;.*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy&#039;);;&lt;br /&gt;
  my $msg = &amp;quot;Es sind folgende Lichter eingeschaltet:\n \n&amp;quot;;;&lt;br /&gt;
  my $room = &amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  if (@lights &amp;gt; 0 and defined($defs{$lights[0]})){&lt;br /&gt;
    foreach (@lights){&lt;br /&gt;
      if ($room ne AttrVal($_, &amp;quot;room&amp;quot;, $_))&lt;br /&gt;
      {&lt;br /&gt;
        if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
          $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Aus \n&amp;quot;; &lt;br /&gt;
        }&lt;br /&gt;
        $room = AttrVal($_, &amp;quot;room&amp;quot;, $_);&lt;br /&gt;
        $msg .= &amp;quot; \n&amp;quot;.$room.&amp;quot;: \n&amp;quot;; &lt;br /&gt;
      }&lt;br /&gt;
      $_ =~ s/\./__/g;&lt;br /&gt;
      $msg .= &amp;quot;/&amp;quot;.$_.&amp;quot; \n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
      $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Aus \n&amp;quot;; &lt;br /&gt;
    }&lt;br /&gt;
    $msg .= &amp;quot; \n/Alle_Aus&lt;br /&gt;
             \n \n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }else{&lt;br /&gt;
    $msg = &amp;quot;Es sind alle Lichter ausgeschaltet.&amp;quot;;;&lt;br /&gt;
    $msg .= &amp;quot;\n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }&lt;br /&gt;
  return $msg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub&lt;br /&gt;
chatBot_getLightsOff&lt;br /&gt;
{&lt;br /&gt;
  my @lights = devspec2array(&#039;.*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy&#039;);;&lt;br /&gt;
  my $msg = &amp;quot;Es sind folgende Lichter ausgeschaltet:\n \n&amp;quot;;;&lt;br /&gt;
  my $room = &amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  if (@lights &amp;gt; 0 and defined($defs{$lights[0]})){&lt;br /&gt;
    foreach (@lights){&lt;br /&gt;
      if ($room ne AttrVal($_, &amp;quot;room&amp;quot;, $_))&lt;br /&gt;
      {&lt;br /&gt;
        if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
          $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Ein \n&amp;quot;; &lt;br /&gt;
        }&lt;br /&gt;
        $room = AttrVal($_, &amp;quot;room&amp;quot;, $_);&lt;br /&gt;
        $msg .= &amp;quot; \n&amp;quot;.$room.&amp;quot;: \n&amp;quot;; &lt;br /&gt;
      }&lt;br /&gt;
      $_ =~ s/\./__/g;&lt;br /&gt;
      $msg .= &amp;quot;/&amp;quot;.$_.&amp;quot; \n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if ($room ne &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
      $msg .= &amp;quot; \n/&amp;quot;.$room.&amp;quot;_Ein \n&amp;quot;; &lt;br /&gt;
    }&lt;br /&gt;
    $msg .= &amp;quot; \n/Alle_Ein&lt;br /&gt;
             \n \n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }else{&lt;br /&gt;
    $msg = &amp;quot;Es sind alle Lichter eingeschaltet.&amp;quot;;;&lt;br /&gt;
    $msg .= &amp;quot;\n/Hauptmenue&lt;br /&gt;
            &amp;quot;;;&lt;br /&gt;
  }&lt;br /&gt;
  return $msg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Formatierung für Telegram erfolgt, indem die . durch __ ersetzt werden und ein / vorangestellt wird, damit es im Telegram anklickbar wird.&lt;br /&gt;
&lt;br /&gt;
Nun folge die Logik für RiveScript. Zunächst die Abfrage für die Auflistung der ein- bzw. ausgeschalteten Lampen (inklusive notwendiger Definitionen):&lt;br /&gt;
&lt;br /&gt;
.rive-Datei:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
! array levels  = eg og dg au&lt;br /&gt;
! array rooms   = ku ez ba fk sp ks wz bu sz&lt;br /&gt;
! array spacer  = __ _&lt;br /&gt;
&lt;br /&gt;
+ licht(@spacer)aus&lt;br /&gt;
- &amp;lt;call&amp;gt;perl chatBot_getLightsOn&amp;lt;/call&amp;gt;{topic=licht_aus}&lt;br /&gt;
&lt;br /&gt;
+ licht(@spacer)an&lt;br /&gt;
- &amp;lt;call&amp;gt;perl chatBot_getLightsOff&amp;lt;/call&amp;gt;{topic=licht_an}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend die Schaltfunktionen:&lt;br /&gt;
&lt;br /&gt;
.rive-Datei:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; topic licht_aus&lt;br /&gt;
&lt;br /&gt;
  + [*] (abbrechen|hauptmenue) [*]&lt;br /&gt;
  - {topic=random} {@ leave}&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}_{formal}&amp;lt;star9&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; off&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; off&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  + alle(@spacer)aus&lt;br /&gt;
  - Schalte alle Lichter aus \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy off&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)(*)(@spacer)aus&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}_{formal}&amp;lt;star4&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; off&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)aus&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; aus \n &lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; off&amp;lt;/call&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
&amp;lt; topic&lt;br /&gt;
&lt;br /&gt;
&amp;gt; topic licht_an&lt;br /&gt;
&lt;br /&gt;
  + [*] (abbrechen|hauptmenue) [*]&lt;br /&gt;
  - {topic=random} {@ leave}&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}_{formal}&amp;lt;star9&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*) &lt;br /&gt;
  - &amp;lt;set licht={uppercase}&amp;lt;star1&amp;gt;{/uppercase}.&amp;lt;star3&amp;gt;.LI.{formal}&amp;lt;star6&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht &amp;lt;get licht&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue&lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set &amp;lt;get licht&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + alle(@spacer)ein&lt;br /&gt;
  - Schalte alle Lichter ein \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)(*)(@spacer)ein&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}_{formal}&amp;lt;star4&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  + (*)(@spacer)ein&lt;br /&gt;
  - &amp;lt;set room={formal}&amp;lt;star1&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
  ^ Schalte Licht in &amp;lt;get room&amp;gt; ein \n&lt;br /&gt;
  ^ /Hauptmenue &lt;br /&gt;
  ^ &amp;lt;call&amp;gt;fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=&amp;lt;get room&amp;gt; on&amp;lt;/call&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein möglicher Dialog mit FHEM sähe dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hauptmenü&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hauptmenü:&lt;br /&gt;
/Licht_Aus&lt;br /&gt;
/Licht_An&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Licht_An&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Es sind folgende Lichter ausgeschaltet:&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Aussenwelt: &lt;br /&gt;
/AU__ho__LI__Markise &lt;br /&gt;
/AU__ho__LI__Terrasse &lt;br /&gt;
 &lt;br /&gt;
/Aussenwelt_Ein &lt;br /&gt;
 &lt;br /&gt;
Buero: &lt;br /&gt;
/DG__bu__LI__Flur &lt;br /&gt;
/DG__bu__LI__Schornstein &lt;br /&gt;
/DG__bu__LI__Schreibtisch &lt;br /&gt;
 &lt;br /&gt;
/Buero_Ein &lt;br /&gt;
 &lt;br /&gt;
Schlafzimmer: &lt;br /&gt;
/DG__sz__LI__Hinten_Halogen &lt;br /&gt;
/DG__sz__LI__Hinten_Led &lt;br /&gt;
/DG__sz__LI__Kleiderschrank &lt;br /&gt;
/DG__sz__LI__Vorn &lt;br /&gt;
 &lt;br /&gt;
/Schlafzimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Wohnzimmer: &lt;br /&gt;
/DG__wz__LI__Allgemein &lt;br /&gt;
 &lt;br /&gt;
/Wohnzimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Esszimmer: &lt;br /&gt;
/OG__ez__LI__Allgemein &lt;br /&gt;
/OG__ez__LI__Bogen &lt;br /&gt;
/OG__ez__LI__Esstisch &lt;br /&gt;
/OG__ez__LI__Vitrine &lt;br /&gt;
 &lt;br /&gt;
/Esszimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Flur_Kinder: &lt;br /&gt;
/OG__fk__LI__Allgemein &lt;br /&gt;
 &lt;br /&gt;
/Flur_Kinder_Ein &lt;br /&gt;
 &lt;br /&gt;
Hausflur: &lt;br /&gt;
/OG__hf__LI__Schuhschrank &lt;br /&gt;
/OG__hf__LI__Treppe &lt;br /&gt;
 &lt;br /&gt;
/Hausflur_Ein &lt;br /&gt;
 &lt;br /&gt;
Kinderschlafzimmer: &lt;br /&gt;
/OG__ks__LI__Allgemein &lt;br /&gt;
/OG__ks__LI__Bett &lt;br /&gt;
/OG__ks__LI__Sterne &lt;br /&gt;
 &lt;br /&gt;
/Kinderschlafzimmer_Ein &lt;br /&gt;
 &lt;br /&gt;
Kueche: &lt;br /&gt;
/OG__ku__LI__Besenschrank &lt;br /&gt;
/OG__ku__LI__Kuechenzeile &lt;br /&gt;
/OG__ku__LI__Kuehlschrank &lt;br /&gt;
/OG__ku__LI__Theke &lt;br /&gt;
 &lt;br /&gt;
/Kueche_Ein &lt;br /&gt;
 &lt;br /&gt;
Spielzimmer_Kinder: &lt;br /&gt;
/OG__sp__LI__Baggerheck_Schreibtisch &lt;br /&gt;
/OG__sp__LI__Baggerschaufel_Podest &lt;br /&gt;
 &lt;br /&gt;
/Spielzimmer_Kinder_Ein &lt;br /&gt;
 &lt;br /&gt;
Treppe: &lt;br /&gt;
/OG__tr__LI__Handlauf_Fenster &lt;br /&gt;
 &lt;br /&gt;
/Treppe_Ein &lt;br /&gt;
 &lt;br /&gt;
/Alle_Ein&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/Hauptmenue&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/OG__ku__LI__Kuechenzeile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Schalte Licht OG.ku.LI.Kuechenzeile ein&lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/OG__ku__LI__Kuechenschrank&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Schalte Licht OG.ku.LI.Kuechenschrank ein &lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Untermenü verlassen &lt;br /&gt;
 &lt;br /&gt;
 Hauptmenü:&lt;br /&gt;
/Licht_Aus&lt;br /&gt;
/Licht_An&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Licht_Aus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Es sind folgende Lichter eingeschaltet:&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Kueche: &lt;br /&gt;
/OG__ku__LI__Kuechenschrank &lt;br /&gt;
/OG__ku__LI__Kuechenzeile &lt;br /&gt;
 &lt;br /&gt;
/Kueche_Aus &lt;br /&gt;
&lt;br /&gt;
/Alle_Aus&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/Kueche_Aus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Schalte Licht in Kueche aus &lt;br /&gt;
 /Hauptmenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beleuchtungssteuerung über Sprache ==&lt;br /&gt;
&lt;br /&gt;
Die Module können nicht nur eingesetzt werden, um mittels Telegram zu kommunizieren. Ein weiteres Beispiel ist der Einsatz als Spracherkennung für gesprochene Befehle über z.B. [[AMAD]]. Hier ist allerdings zum jetzigen Zeitpunkt noch keine gesprochene Antwort möglich und das Zieldevice für die Antwort kann nur hardcodiert hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Zunächst müssen in der AMADCommBridge die notwendigen Attribute gesetzt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr AMADCommBridge userattr talktouserMonitorReading talktouserModSourceDev &lt;br /&gt;
attr AMADCommBridge talktouserModSourceDev HandyRonny &lt;br /&gt;
attr AMADCommBridge talktouserMonitorReading receiveVoiceCommand &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss noch die Logik für RiveScript hinterlegt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Aus den gesprochenen Räumen werden die Kürzel ermittelt&lt;br /&gt;
! person badezimmer = OG.ba.&lt;br /&gt;
! person buero = DG.bu.&lt;br /&gt;
! person esszimmer = OG.ez.&lt;br /&gt;
! person flur_kinder = OG.fk.&lt;br /&gt;
! person hausflur = OG.hf.&lt;br /&gt;
! person kinderschlafzimmer = OG.ks.&lt;br /&gt;
! person kueche = OG.ku.&lt;br /&gt;
! person schlafzimmer = DG.sz.&lt;br /&gt;
! person spielzimmer_kinder = OG.sp.&lt;br /&gt;
! person treppe = OG.tr.&lt;br /&gt;
! person unten_kueche = EG.uk.&lt;br /&gt;
! person unten_stube = EG.st.&lt;br /&gt;
! person waschhaus = EG.wh.&lt;br /&gt;
! person wohnzimmer = DG.wz.&lt;br /&gt;
&lt;br /&gt;
// Aus den gesprochenen Befehlen werden die FHEM Befehle ermittelt&lt;br /&gt;
! person ein = on&lt;br /&gt;
! person an = on&lt;br /&gt;
! person aus = off&lt;br /&gt;
&lt;br /&gt;
// einige Ersetzungen, um nicht immer den konkreten Begriff verwenden zu müssen&lt;br /&gt;
! sub büro = buero&lt;br /&gt;
! sub küche = kueche&lt;br /&gt;
! sub bad = badezimmer&lt;br /&gt;
! sub flur kinder = flur_kinder&lt;br /&gt;
! sub kinderflur = flur_kinder&lt;br /&gt;
! sub spielzimmer kinder = spielzimmer_kinder&lt;br /&gt;
! sub spielzimmer = spielzimmer_kinder&lt;br /&gt;
! sub kinderspielzimmer = spielzimmer_kinder&lt;br /&gt;
! sub kinderzimmer = spielzimmer_kinder&lt;br /&gt;
! sub kueche unten = unten_kueche&lt;br /&gt;
// Die Deckenlampe heißt meistens Allgemein&lt;br /&gt;
! sub decke = allgemein&lt;br /&gt;
&lt;br /&gt;
// Ersetzungen, um einen anderen Satzbau zu erlauben&lt;br /&gt;
! sub einschalten = ein&lt;br /&gt;
! sub anschalten = an&lt;br /&gt;
! sub anmachen = an&lt;br /&gt;
! sub ausmachen = aus&lt;br /&gt;
! sub ausschalten = aus&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************\&lt;br /&gt;
 * Lichtsteuerung per Sprache                                                *&lt;br /&gt;
\*****************************************************************************/&lt;br /&gt;
! array schaltenaliaseinschalten		= an|ein&lt;br /&gt;
! array schaltenaliasausschalten		= aus&lt;br /&gt;
! array schaltenaliashandlung   		= an|ein|aus&lt;br /&gt;
! array schaltenaliasartikel			  = der|die|das&lt;br /&gt;
! array schaltenaliasfuellwoerter		= schalte|mach&lt;br /&gt;
! array schaltenaliasorte				    = in|am|auf|an|im|auf dem&lt;br /&gt;
! array schaltenaliashoeflich 	    = bitte&lt;br /&gt;
! array roomsfull                   = badezimmer|buero|esszimmer|flur_kinder|hausflur|kinderschlafzimmer|kueche|schlafzimmer|spielzimmer_kinder|treppe|unten_kueche|unten_stube|waschhaus|wohnzimmer&lt;br /&gt;
&lt;br /&gt;
// einzelnes Licht ein- bzw. ausschalten&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht im Wohnzimmer an der Decke (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] (@roomsfull) [@schaltenaliasorte] [@schaltenaliasartikel] _ (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set lightroom={person}&amp;lt;star1&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ &amp;lt;set lightname={formal}&amp;lt;star2&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
^ Licht &amp;lt;get lightroom&amp;gt;&amp;lt;get lightname&amp;gt; wird &amp;lt;star3&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get lightroom&amp;gt;.*&amp;lt;get lightname&amp;gt;.* {person}&amp;lt;star3&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// einzelnes Licht ein- bzw. ausschalten - anderer Satzbau&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht an der Decke im Wohnzimmer (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set lightroom={person}&amp;lt;star2&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ &amp;lt;set lightname={formal}&amp;lt;star1&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
^ Licht &amp;lt;get lightroom&amp;gt;&amp;lt;get lightname&amp;gt; wird &amp;lt;star3&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get lightroom&amp;gt;.*&amp;lt;get lightname&amp;gt;.* {person}&amp;lt;star3&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// einzelnes Licht mit zweiteiligem Namen ein- bzw. ausschalten&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht im Schlafzimmer hinten halogen (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] zwei worte _ _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set lightroom={person}&amp;lt;star3&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ &amp;lt;set lightname={formal}&amp;lt;star1&amp;gt;{/formal}_{formal}&amp;lt;star2&amp;gt;{/formal}&amp;gt;&lt;br /&gt;
^ Licht &amp;lt;get lightroom&amp;gt;&amp;lt;get lightname&amp;gt; wird &amp;lt;star4&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get lightroom&amp;gt;.*&amp;lt;get lightname&amp;gt;.* {person}&amp;lt;star4&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Licht in einem Zimmer ein- bzw. ausschalten&lt;br /&gt;
// Bsp: [Bitte] schalte das Licht im Schlafzimmer (ein|aus)&lt;br /&gt;
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] (@roomsfull) (@schaltenaliashandlung)&lt;br /&gt;
- &amp;lt;set light={person}&amp;lt;star1&amp;gt;{/person}LI.&amp;gt;&lt;br /&gt;
^ Licht {formal}&amp;lt;star1&amp;gt;{/formal} wird &amp;lt;star2&amp;gt;geschaltet&lt;br /&gt;
^ &amp;lt;call&amp;gt;fhem set &amp;lt;get light&amp;gt;.* {person}&amp;lt;star2&amp;gt;{/person}&amp;lt;/call&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kann sind zum Beispiel für die Lampe am Küchenschrank folgende Sprachbefehle möglich (Begriffe in eckigen Klammen, wie z.B. [bitte] sind optional; durch | getrennte Begriffe in Klammern stellen Alternativen dar):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus)&lt;br /&gt;
[schalte|mache] [bitte] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus)&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[schalte|mache] [bitte] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[bitte] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus)[schalten|machen]&lt;br /&gt;
[bitte] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus)[schalten|machen]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird die konkrete Lampe weggelassen, so wird das Licht im gesamten Raum ein-/ausgeschaltet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[schalte|mache] [bitte] [das] Licht [in] [der] Küche (an|ein|aus)&lt;br /&gt;
[bitte] [das] Licht [in] [der] Küche (an|ein|aus)[schalten|machen]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da ich auch Lampen habe, deren Beschreibung aus zwei durch _ getrennten Begriffen besteht (z.B. OG.sp.LI.Baggerschaufel_Podest ist die vordere Glühbirne einer Baggerlampe, welche ein Podest beleuchtet), habe ich zwei Möglichkeiten eingebaut, diese zu schalten:&lt;br /&gt;
&lt;br /&gt;
1. Ankündigung, dass es sich um einen Begriff mit zwei Worten handelt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Küche [an] [der] zwei Worte Baggerschaufel Podest (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(weitere Alternativen zum Satzbau wie oben)&lt;br /&gt;
&lt;br /&gt;
2. Die Beschreibung wird beim schalten generell zwischen zwei &amp;quot;.*&amp;quot; gesetzt, so dass alle Devices geschaltet werden, auf welche die Beschreibung zutrifft. Dadurch führen auch die folgenden Befehle (in allen oben beschriebenen Satzbauvarianten) zum Erfolg:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Küche [am] Podest (an|ein|aus)&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Küche [an] [der] Baggerschaufel (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch ist zu beachten, dass z.B. bei den beiden Lampen DG.sz.LI.Hinten_Led und DG.sz.LI.Hinten_Halogen mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Schlafzimmer hinten (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
beide Lampen geschaltet werden und mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[bitte] [schalte|mache] [das] Licht [im] Schlafzimmer Halogen (an|ein|aus)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nur eine der beiden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
* Forumsartikel [https://forum.fhem.de/index.php/topic,54863.0.html Module: TALKTOME &amp;amp; TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen]&lt;br /&gt;
* Forumsartikel [https://forum.fhem.de/index.php/topic,39983.0.html Neuer FHEM Befehl &amp;quot;msg&amp;quot; für Benachrichtigungen]&lt;br /&gt;
* RiveScript [https://www.rivescript.com/docs/tutorial#first-steps First steps]&lt;br /&gt;
* Modul [[AMAD]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Code Snippets]]&lt;br /&gt;
[[Categorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15725</id>
		<title>DoorPi und FHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15725"/>
		<updated>2016-06-27T06:05:47Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Klarstellung der Fisheye-Thematik&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [https://www.doorpi.org/forum/ DoorPi-Projekt] dient dazu, auf Basis eines Raspberry Pi eine IP-Türsprechstelle aufzubauen. Dazu gibt es unter dem o.a. Link umfangreiche Informationen. Im Folgenden wird eine komplette DoorPi-Installation und ihre Integration in FHEM beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
Die Software DoorPi läuft auf einem Raspberry Pi und stellt einen IP-Phone Client zur Verfügung, der in eine IP-Haustelefonanalage (z.B. mit der FritzBox) eingebunden werden kann. Diesen Raspberry Pi könnte man zwar über längere Audiokabel mit der notwendigen Lautsprecher-Mikrofon-Kombination verbinden, das ist allerdings etwas anfällig für Störsignale. Die meisten Anwender von DoorPi wählen deshalb den Einbau des Raspberry Pi direkt an der Türsprechstelle. Aus Sicht des Autors stellt das eine Sicherheitslücke dar - weil ein direkter Zugang ins Heimnetz außerhalb der eigenen vier Wände geschaffen würde.&lt;br /&gt;
&lt;br /&gt;
Hier soll deshalb eine abgesetzte Installation beschrieben werden: Direkt an der Türsprechstelle sitzen nur Sensoren, Audiohardware und ein Display, angesteuert von einem &amp;quot;dummen&amp;quot; Arduino Mikrocontroller. Ins Innere des Hauses führen drei Kabel:&lt;br /&gt;
*Ein USB-Kabel zur digitalen Ankopplung der Audio-Hardware an den Raspberry Pi&lt;br /&gt;
*Ein HDMI-Kabel zur digitalen Ankopplung einer Kamera an den Raspberry Pi&lt;br /&gt;
*Ein 8-adriges Kabel zur Weiterleitung verschiedener Signale an den Raspberry Pi. Hierfür kann man aus Bequemlichkeitsgründen ein Netzwerk-Patchkabel verwenden - hochfrequente Signale gehen allerdings nicht über diesen Weg.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_block.png]]&lt;br /&gt;
&lt;br /&gt;
==Klingel und Türsprechstelle==&lt;br /&gt;
Beim Drücken auf den Klingelknopf wird ein IP-Telefonanruf gestartet - entweder bei einer internen Nummer, oder (konfigurierbar in FHEM) bei einer beliebigen anderen Nummer. Wenn der Empfänger den Ruf annimmt, kann er mit dem Besucher sprechen und ggf. durch das Drücken einer Taste die Tür öffnen. Es ist in der DoorPi-Installation problemlos konfigurierbar, beliebige andere Aktionen zu starten - z.B. könnte man dem Paketlieferanten nur das Gartentor öffnen.&lt;br /&gt;
&lt;br /&gt;
Während des Klingelvorgangs wird eine Aufnahme des Besuchers angefertigt. Das Gespräch wird als WAV-Datei ebenfalls aufgezeichnet, beide sind unter dem FHEM-Frontend abrufbar. Während der Aufnahme wird eine Infrarot-Lichtquelle eingeschaltet. Diese soll nicht die ganze Szene ausleuchten - sondern verhindern, dass man das Gesicht des Besuchers wegen einer hinter ihm befindlichen Beleuchtung mit sichtbarem Licht nicht gut erkennen kann.&lt;br /&gt;
&lt;br /&gt;
==Türöffnung==&lt;br /&gt;
Das System verfügt über einen iButton-Reader. Legt man einen iButton auf, der in der Software codiert ist, leuchtet eine im Reader integrierte Tricolor-LED in einer entsprechenden Farbe auf (z.B. roter iButton-Halter =&amp;gt; rote LED). Der weitere Ablauf hängt vom Schließzustand der Haustür ab.&lt;br /&gt;
*Ist die Haustür nur zugezogen und nicht abgeschlossen, wird sie geöffnet. Gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot;&lt;br /&gt;
*Ist die Haustür abgeschlossen, wird zunächst auf dem Touchscreen des Systems statt der Namen eine virtuelle Tastatur angezeigt. Hier kann ggf. noch die akustische Bitte eingebaut werden, eine fünfstellige PIN einzugeben. Der Fortschritt bei der Eingabe wird durch einen Balken angezeigt.&lt;br /&gt;
**Ist die PIN falsch, geht das System wieder in den AUsgangszustand zurück, es wird eine Warnungsmeldung an das interne FHEM-System übermittelt.&lt;br /&gt;
**Ist die PIN korrekt, wird zunächst der Entriegelungsvorgang der Tür eingeleitet. Je nach verwendetem System kann das eine Weile dauern - Keymatic ist hierfür ein Beispiel, das können durchaus 3-4 Sekunden werden. Danach wird die Tür geöffnet, gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot; Je nach Konfiguration kann FHEM an dieser Stelle auch weitere Aktionen auslösen - etwa weitere Entriegelungsvorgänge starten.&lt;br /&gt;
&lt;br /&gt;
==Videostream==&lt;br /&gt;
Auf dem Raspberry Pi ist auch die Software mjpeg_streamer installiert, Per Mausklick in der FHEM-Oberfläche wird mjpeg-streamer gestartet und gestoppt (das wird von der DoorPi-Software erledigt, die einen bestimmten virtuellen Tastdruck erkennt und dann lokal ein Skript startet), und stellt dann an TCP-Port 9000 einen Videostream bereit. Wer möchte, kann das System auch so konfigurieren, dass es diesen Videostream zusammen mit dem Audiostream zur Videotelefonie verwendet.&lt;br /&gt;
==Bewegungserkennung und Helligkeitsmessung==&lt;br /&gt;
Erkennt das System durch den eingebauten PIR-Bewegungsmelder eine Bewegung, wird&lt;br /&gt;
*die Anzeigehelligkeit für mindestens eine Minute hochgefahren&lt;br /&gt;
*ein Signal an FHEM gesendet.&lt;br /&gt;
Wenn eine Minute keine Bewegung erkannt wurde, geht die Anzeigehelligkeit (d.h. vom Display und dem LED-Rimng um den Klingelknopf) wieder auf einen Wert zurück, der durch die externe Helligkeit bestimmt ist.&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
==Raspberry Pi==&lt;br /&gt;
Verwendet wird &lt;br /&gt;
* ein [http://www.pollin.de/shop/dt/OTQxNzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_3_Modell_B.html Raspberry Pi 3], der ein integriertes WLAN-Modul besitzt&lt;br /&gt;
* eine Zusatzkarte [http://www.pollin.de/shop/dt/NTc1NzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_B_Zusatzplatine_PIFACE_DIGITAL_2.html PiFace 2], mit je 8 digitalen Ein- und Ausgängen.&lt;br /&gt;
* ein klares [http://www.reichelt.de/CB-RPF-P-CLR/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=160959 Gehäuse], das die Erweiterungskarte mit aufnehmen kann&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
* Ein Arduino Micro mit [https://www.doorpi.org/forum/attachment/293-henninghome-haustuer-txt/ Sketch]. Weitere Beispiele zur Auslesung von iButtons gibt es [http://ice-karlsruhe.de/projekte/smarthome/smarthome-hacks-links-und-ergaenzungen/#k6 hier]&lt;br /&gt;
&lt;br /&gt;
==Kamera-Subsystem==&lt;br /&gt;
Verwendet werden hierfür&lt;br /&gt;
* eine Standard-NoIR-Kamera für den Raspberry Pi (ohne Infrarotfilter, somit IR-empfindlich) (z.B. von [http://www.elv.de/raspberry-pi-noir-kamera-modul.html ELV])&lt;br /&gt;
* ein Fisheye 180° zum Aufclippen auf Smartphones (Die untenstehenden STLs für den Kameradome sind auf Basis der &amp;quot;BRESSER Clip-On 180° Fisheye Smartphone-Linse&amp;quot; entworfen. [https://www.amazon.de/Bresser-Clip--Grad-Fisheye-Handylinse/dp/B00MQQSJKY Amazon] / [http://www.elv.de/bresser-handy-kameraaufsatz-clip-on-180-fisheye-handylinse.html ELV] / [https://www.conrad.de/de/smartphone-fish-eye-objektiv-bresser-optik-clip-on-180-fisheye-1359363.html Conrad])&lt;br /&gt;
* eine [http://www.ebay.de/itm/321915955373?_trksid=p2057872.m2749.l2649 Acrylglaskuppel] 2 Zoll ​&lt;br /&gt;
* eine [https://www.tindie.com/products/freto/pi-camera-hdmi-cable-extension/ Kabelverlängerung] Flatribbon &amp;lt;-&amp;gt; HDMI &amp;lt;-&amp;gt; Flatribbon&lt;br /&gt;
* ein Kameradom aus dem 3D-Drucker mit genauer Passung für das Fisheye vorne und die Kamera hinten, sowie Passungen für 8 LED. Die STL-Datei für diesen Kameradom findet man hier: [https://www.tinkercad.com/things/jv5x6lrihbk​ PiCameraDome4]&lt;br /&gt;
* eine Rückseite des Kameradoms aus dem 3D-Drucker, wird hinten mittig aufgeklebt und hält den Deckel des Kamerasystem durch drei Nippel. Die STL-Datei dafür findet man hier  [https://tinkercad.com/things/cV6rkY6DWvc PiCameraDome4addendum]&lt;br /&gt;
* ein Deckel des Kameradoms aus dem 3D-Drucker, wird auf die Rückseite aufgesteckt und beinhaltet zwei Halterungen für Mikrofone (die &amp;quot;Ohren&amp;quot; im Bild). Die STL-Datei dafür findet man hier [https://tinkercad.com/things/8X0fhiSTyXk PiCameraDome4back]&lt;br /&gt;
* 9 x IR-LED [http://www.conrad.biz/ce/de/product/171140/IR-Emitter-940-nm-17-5-mm-radial-bedrahtet-Vishay-TSAL-6200 TSAL 6200] mit hoher Leistung &lt;br /&gt;
* 3 Widerstände 10 Ohm 0,2 W.&lt;br /&gt;
&lt;br /&gt;
[[File:Dome1.jpg|400x300px]][[File:Dome2.jpg|400x300px]][[File:Doorpi_dome3s.jpg|400x300px]][[File:Doorpi_dome4s.jpg|600x300px]]&lt;br /&gt;
&lt;br /&gt;
Zur Montage werden vier M2-Gewindebolzen in die hintere Aussparung des Kameradoms eingeklebt, und auf diese mit entsprechenden Abstandshaltern und Muttern sowohl die Kamera, als auch die eine Hälfte der Kabelverlängerung geschraubt. Dabei empfiehlt es sich, die LED vorher an Ort und Stelle zu haben - ggf.  muss bei ungünstiger Klebung der Gewindebolzen bei den Eck-LED ein Gehäusevorsprung etwas abgefeilt werden.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung der LED für dem Betrieb an einer Spannung von 5V ausgelegt - damit fließen durch drei in Reihe geschaltete LED und einen 10 Ohm-Widerstand ziemlich genau 100mA. Bei der Schaltung über einen MOSFET ist das etwas weniger, wegen des Drain-Source-Widerstandes des MOSFET, reicht aber für die notwendige Helligkeit aus. Aus Symmetriegründen werden drei solche Stränge (insgesamt 9 LED) montiert - aber nur 8 davon sind bei dem angegebenen Kameradom nach außen gerichtet (wer möchte, kann gerne ein 3D-Design mit 9 Löchern erstellen), eine LED zeigt also nutzlos nach innen (erkennbar im 3. Bild der obigen Reihe).&lt;br /&gt;
&lt;br /&gt;
Das Fischaugenobjektiv wird mit wenig (!) klarem Silikon in die vordere Öffnung des Kameradoms geklebt, der rückwärtige Aufsatz mit den 3 Nippeln mit Zweikomponentenkleber auf der Rückseite des Kameradoms befestigt. Dabei zur Ausrichtung den Mikrofonhalter (rechtes Bild, mit den &amp;quot;Ohren&amp;quot;) probeweise aufstecken.&lt;br /&gt;
&lt;br /&gt;
Die Acrylglaskuppel wird mit Silikon oder einem äquivalenten Dichtmaterial wasserdicht in die Frontplatte eingesetzt, auf diese dann von hinten der Kameradom. Eine staubdichte Verbindung erfordert auch hier die Abdichtung mit Silikon. Für den Fall einer möglichen Demontage empfiehlt es sich, diese Abdichtung nicht als Klebung zu verwenden, sondern als umlaufenden Rand nachträglich aufzubringen - der ist dann einfach mit einem Cutter zu entfernen.&lt;br /&gt;
&lt;br /&gt;
==Audio-Subsystem==&lt;br /&gt;
* Soundkarte:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B005BYCBO8 BIGtec USB Soundkarte 7.1 USB Adapter] (Gehäuse lässt sich problemlos [https://forum.fhem.de/index.php/topic,49877.msg444478.html#msg444478 entfernen])&lt;br /&gt;
** LogiLink USB Soundkarte mit Virtual 7.1 Soundeffekt&lt;br /&gt;
* Verstärker:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B00UAA7NH8 Foxnovo High Power Super Mini Digital-Audioverstärker Board Platine (rot)]&lt;br /&gt;
* Lautsprecher:&lt;br /&gt;
** [https://www.reichelt.de/VIS-K28-40-8/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=145413&amp;amp;artnr=VIS+K28.40-8&amp;amp;SEARCH=kleinlautsprecher VISATON Kleinlautsprecher / 2,8 x 4 cm / 8 Ohm VIS K28.40-8]&lt;br /&gt;
** VISATON Kleinlautsprecher mit Kunststoffmembran und quadratischem Metallkorb 5 cm, K 50 SQ / 8 Ω&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
* Bewegungsmelder [http://www.elv.de/bewegungsmeldermodul-pir-13.html Bewegungsmelder]&lt;br /&gt;
* Fototransistor zur Helligkeitsmessung&lt;br /&gt;
* [https://www.amazon.de/gp/product/B01DKTHDXE​ Klingelknopf]&lt;br /&gt;
* Mikroschalter als Sabotagekontakt&lt;br /&gt;
* iButtonLesegerät, z.B.:&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372564/ ohne LED]&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372377/ mit LED] - Achtung evtl. nicht ausreichend Wetterfest&lt;br /&gt;
** [http://www.aliexpress.com/item/2PCS-TM-probe-DS9092-Zinc-Alloy-probe-iButton-probe-reader-with-LED-M98/32635390937.html aus Fernost]&lt;br /&gt;
&lt;br /&gt;
Der Bewegungsmelder ist ein sehr kleines Modul, das einfach von hinten in eine Bohrung der Frontplatte gesteckt wird. Sein Open-Collector-Ausgang wird über eine der vier unbenutzen Adern (blau) des HDMI-Kabels an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
Der Helligkeitssensor besteht aus einem Fototransistor und zwei festen und einem einstellbaren Widerstand. Seine Ausgangsspannung wird an den Arduino weitergeleitet, der auf Grund dieses Wertes das Display und den LED-Ring des Klingelknopfes dimmt.&lt;br /&gt;
&lt;br /&gt;
Als Klingelknopf wird ein Modell aus Edelstahl mit umlaufendem LED-Ring verwendet. &lt;br /&gt;
&lt;br /&gt;
Der Sabotagekontakt besteht aus einem Mikroschalter, der so in die Rückwandinstallation geklebt wird, dass er bei der Abnahme der Frontplatte geschlossen wird. Dieses Signal wird über eine der unbenutzten Adern des HDMI-Kabels (orange im Bild) an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
[[File:DoorPi_part1.png|500x350px]][[File:doorpi_sensorss.jpg|800x350px]]&lt;br /&gt;
&lt;br /&gt;
==Display==&lt;br /&gt;
* [http://wiki.iteadstudio.com/Nextion_HMI_Solution Nextion Display], z.B.:&lt;br /&gt;
** 3,2&amp;quot; 400x240 Pixel: [http://www.aliexpress.com/item/3-2-TFT-480x240-resistive-touch-screen-display-Nextion-3-2-HMI-LCD-Display-Module-TFT/32443541471.html Aus Fernost] oder [http://www.komputer.de/zen/index.php?main_page=product_info&amp;amp;cPath=30&amp;amp;products_id=354&amp;amp;zenid=like084ipplb747m4ur447p5h3 Aus Deutschland]&lt;br /&gt;
&lt;br /&gt;
==Frontplatte==&lt;br /&gt;
Die Frontplatte besteht aus 4 mm starken Aluminium, eloxiert und auf 1/10 mm genau mit den passenden Bohrungen und Ausschnitten sowie rückseitig angeschweißten Gewindebolzen versehen. Online bestellbar z.B. bei der Schaeffer AG, für das vorliegende Exemplar wurden ca. 115 € in Rechnung gestellt. Auf Grund ihrer Stabilität dient diese Frontplatte als Baugruppenträger für die Außeninstallation.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_front.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Rückwandinstallation==&lt;br /&gt;
Die Rückwandinstallation, die in des Mauerwerk eingelassen wird, kommt ebenfalls aus dem 3D-Drucker. Sie besteht aus drei Teilen mit unterschiedlicher Tiefe, um das Loch im Mauerwerk nicht zu groß werden zu lassen. Das obere und das untere Teil enthalten jeweils zwei stabile Vorsprünge mit Aussparungen, in die eine normgerechte M4-Mutter von unten genau hineinpasst. Bemerkenswert ist, dass dieses Bauteil nicht mit einer konventionellen Methode (z.B. im Spritzgussverfahren) gefertigt werden kann.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_covertop.jpg]]&lt;br /&gt;
&lt;br /&gt;
Diese Muttern kommen damit genau hinter den äußeren Schraubenlöchern der Frontplatte zu liegen, Die Frontplatte kann dadurch mit vier (Sicherheits-)schrauben M4 passgenau auf die im Mauerwerk sitzende Rückwandinstallation geschraubt werden.&lt;br /&gt;
&lt;br /&gt;
Auf der Oberkante der drei Teile verläuft eine 1x1 mm² große Nut, in die eine Dichtung eingelegt werden kann.&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15724</id>
		<title>DoorPi und FHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15724"/>
		<updated>2016-06-26T18:46:06Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Link zu Quelltext des Arduino hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [https://www.doorpi.org/forum/ DoorPi-Projekt] dient dazu, auf Basis eines Raspberry Pi eine IP-Türsprechstelle aufzubauen. Dazu gibt es unter dem o.a. Link umfangreiche Informationen. Im Folgenden wird eine komplette DoorPi-Installation und ihre Integration in FHEM beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
Die Software DoorPi läuft auf einem Raspberry Pi und stellt einen IP-Phone Client zur Verfügung, der in eine IP-Haustelefonanalage (z.B. mit der FritzBox) eingebunden werden kann. Diesen Raspberry Pi könnte man zwar über längere Audiokabel mit der notwendigen Lautsprecher-Mikrofon-Kombination verbinden, das ist allerdings etwas anfällig für Störsignale. Die meisten Anwender von DoorPi wählen deshalb den Einbau des Raspberry Pi direkt an der Türsprechstelle. Aus Sicht des Autors stellt das eine Sicherheitslücke dar - weil ein direkter Zugang ins Heimnetz außerhalb der eigenen vier Wände geschaffen würde.&lt;br /&gt;
&lt;br /&gt;
Hier soll deshalb eine abgesetzte Installation beschrieben werden: Direkt an der Türsprechstelle sitzen nur Sensoren, Audiohardware und ein Display, angesteuert von einem &amp;quot;dummen&amp;quot; Arduino Mikrocontroller. Ins Innere des Hauses führen drei Kabel:&lt;br /&gt;
*Ein USB-Kabel zur digitalen Ankopplung der Audio-Hardware an den Raspberry Pi&lt;br /&gt;
*Ein HDMI-Kabel zur digitalen Ankopplung einer Kamera an den Raspberry Pi&lt;br /&gt;
*Ein 8-adriges Kabel zur Weiterleitung verschiedener Signale an den Raspberry Pi. Hierfür kann man aus Bequemlichkeitsgründen ein Netzwerk-Patchkabel verwenden - hochfrequente Signale gehen allerdings nicht über diesen Weg.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_block.png]]&lt;br /&gt;
&lt;br /&gt;
==Klingel und Türsprechstelle==&lt;br /&gt;
Beim Drücken auf den Klingelknopf wird ein IP-Telefonanruf gestartet - entweder bei einer internen Nummer, oder (konfigurierbar in FHEM) bei einer beliebigen anderen Nummer. Wenn der Empfänger den Ruf annimmt, kann er mit dem Besucher sprechen und ggf. durch das Drücken einer Taste die Tür öffnen. Es ist in der DoorPi-Installation problemlos konfigurierbar, beliebige andere Aktionen zu starten - z.B. könnte man dem Paketlieferanten nur das Gartentor öffnen.&lt;br /&gt;
&lt;br /&gt;
Während des Klingelvorgangs wird eine Aufnahme des Besuchers angefertigt. Das Gespräch wird als WAV-Datei ebenfalls aufgezeichnet, beide sind unter dem FHEM-Frontend abrufbar. Während der Aufnahme wird eine Infrarot-Lichtquelle eingeschaltet. Diese soll nicht die ganze Szene ausleuchten - sondern verhindern, dass man das Gesicht des Besuchers wegen einer hinter ihm befindlichen Beleuchtung mit sichtbarem Licht nicht gut erkennen kann.&lt;br /&gt;
&lt;br /&gt;
==Türöffnung==&lt;br /&gt;
Das System verfügt über einen iButton-Reader. Legt man einen iButton auf, der in der Software codiert ist, leuchtet eine im Reader integrierte Tricolor-LED in einer entsprechenden Farbe auf (z.B. roter iButton-Halter =&amp;gt; rote LED). Der weitere Ablauf hängt vom Schließzustand der Haustür ab.&lt;br /&gt;
*Ist die Haustür nur zugezogen und nicht abgeschlossen, wird sie geöffnet. Gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot;&lt;br /&gt;
*Ist die Haustür abgeschlossen, wird zunächst auf dem Touchscreen des Systems statt der Namen eine virtuelle Tastatur angezeigt. Hier kann ggf. noch die akustische Bitte eingebaut werden, eine fünfstellige PIN einzugeben. Der Fortschritt bei der Eingabe wird durch einen Balken angezeigt.&lt;br /&gt;
**Ist die PIN falsch, geht das System wieder in den AUsgangszustand zurück, es wird eine Warnungsmeldung an das interne FHEM-System übermittelt.&lt;br /&gt;
**Ist die PIN korrekt, wird zunächst der Entriegelungsvorgang der Tür eingeleitet. Je nach verwendetem System kann das eine Weile dauern - Keymatic ist hierfür ein Beispiel, das können durchaus 3-4 Sekunden werden. Danach wird die Tür geöffnet, gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot; Je nach Konfiguration kann FHEM an dieser Stelle auch weitere Aktionen auslösen - etwa weitere Entriegelungsvorgänge starten.&lt;br /&gt;
&lt;br /&gt;
==Videostream==&lt;br /&gt;
Auf dem Raspberry Pi ist auch die Software mjpeg_streamer installiert, Per Mausklick in der FHEM-Oberfläche wird mjpeg-streamer gestartet und gestoppt (das wird von der DoorPi-Software erledigt, die einen bestimmten virtuellen Tastdruck erkennt und dann lokal ein Skript startet), und stellt dann an TCP-Port 9000 einen Videostream bereit. Wer möchte, kann das System auch so konfigurieren, dass es diesen Videostream zusammen mit dem Audiostream zur Videotelefonie verwendet.&lt;br /&gt;
==Bewegungserkennung und Helligkeitsmessung==&lt;br /&gt;
Erkennt das System durch den eingebauten PIR-Bewegungsmelder eine Bewegung, wird&lt;br /&gt;
*die Anzeigehelligkeit für mindestens eine Minute hochgefahren&lt;br /&gt;
*ein Signal an FHEM gesendet.&lt;br /&gt;
Wenn eine Minute keine Bewegung erkannt wurde, geht die Anzeigehelligkeit (d.h. vom Display und dem LED-Rimng um den Klingelknopf) wieder auf einen Wert zurück, der durch die externe Helligkeit bestimmt ist.&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
==Raspberry Pi==&lt;br /&gt;
Verwendet wird &lt;br /&gt;
* ein [http://www.pollin.de/shop/dt/OTQxNzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_3_Modell_B.html Raspberry Pi 3], der ein integriertes WLAN-Modul besitzt&lt;br /&gt;
* eine Zusatzkarte [http://www.pollin.de/shop/dt/NTc1NzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_B_Zusatzplatine_PIFACE_DIGITAL_2.html PiFace 2], mit je 8 digitalen Ein- und Ausgängen.&lt;br /&gt;
* ein klares [http://www.reichelt.de/CB-RPF-P-CLR/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=160959 Gehäuse], das die Erweiterungskarte mit aufnehmen kann&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
* Ein Arduino Micro mit [https://www.doorpi.org/forum/attachment/293-henninghome-haustuer-txt/ Sketch]. Weitere Beispiele zur Auslesung von iButtons gibt es [http://ice-karlsruhe.de/projekte/smarthome/smarthome-hacks-links-und-ergaenzungen/#k6 hier]&lt;br /&gt;
&lt;br /&gt;
==Kamera-Subsystem==&lt;br /&gt;
Verwendet werden hierfür&lt;br /&gt;
* eine Standard-NoIR-Kamera für den Raspberry Pi (ohne Infrarotfilter, somit IR-empfindlich) (z.B. von [http://www.elv.de/raspberry-pi-noir-kamera-modul.html ELV])&lt;br /&gt;
* ein Fisheye 180° zum Aufclippen auf Smartphones (z.B. [https://www.amazon.de/Bresser-Clip--Grad-Fisheye-Handylinse/dp/B00MQQSJKY Bresser])&lt;br /&gt;
* eine [http://www.ebay.de/itm/321915955373?_trksid=p2057872.m2749.l2649 Acrylglaskuppel] 2 Zoll ​&lt;br /&gt;
* eine [https://www.tindie.com/products/freto/pi-camera-hdmi-cable-extension/ Kabelverlängerung] Flatribbon &amp;lt;-&amp;gt; HDMI &amp;lt;-&amp;gt; Flatribbon&lt;br /&gt;
* ein Kameradom aus dem 3D-Drucker mit genauer Passung für das Fisheye vorne und die Kamera hinten, sowie Passungen für 8 LED. Die STL-Datei für diesen Kameradom findet man hier: [https://www.tinkercad.com/things/jv5x6lrihbk​ PiCameraDome4]&lt;br /&gt;
* eine Rückseite des Kameradoms aus dem 3D-Drucker, wird hinten mittig aufgeklebt und hält den Deckel des Kamerasystem durch drei Nippel. Die STL-Datei dafür findet man hier  [https://tinkercad.com/things/cV6rkY6DWvc PiCameraDome4addendum]&lt;br /&gt;
* ein Deckel des Kameradoms aus dem 3D-Drucker, wird auf die Rückseite aufgesteckt und beinhaltet zwei Halterungen für Mikrofone (die &amp;quot;Ohren&amp;quot; im Bild). Die STL-Datei dafür findet man hier [https://tinkercad.com/things/8X0fhiSTyXk PiCameraDome4back]&lt;br /&gt;
* 9 x IR-LED [http://www.conrad.biz/ce/de/product/171140/IR-Emitter-940-nm-17-5-mm-radial-bedrahtet-Vishay-TSAL-6200 TSAL 6200] mit hoher Leistung &lt;br /&gt;
* 3 Widerstände 10 Ohm 0,2 W.&lt;br /&gt;
&lt;br /&gt;
[[File:Dome1.jpg|400x300px]][[File:Dome2.jpg|400x300px]][[File:Doorpi_dome3s.jpg|400x300px]][[File:Doorpi_dome4s.jpg|600x300px]]&lt;br /&gt;
&lt;br /&gt;
Zur Montage werden vier M2-Gewindebolzen in die hintere Aussparung des Kameradoms eingeklebt, und auf diese mit entsprechenden Abstandshaltern und Muttern sowohl die Kamera, als auch die eine Hälfte der Kabelverlängerung geschraubt. Dabei empfiehlt es sich, die LED vorher an Ort und Stelle zu haben - ggf.  muss bei ungünstiger Klebung der Gewindebolzen bei den Eck-LED ein Gehäusevorsprung etwas abgefeilt werden.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung der LED für dem Betrieb an einer Spannung von 5V ausgelegt - damit fließen durch drei in Reihe geschaltete LED und einen 10 Ohm-Widerstand ziemlich genau 100mA. Bei der Schaltung über einen MOSFET ist das etwas weniger, wegen des Drain-Source-Widerstandes des MOSFET, reicht aber für die notwendige Helligkeit aus. Aus Symmetriegründen werden drei solche Stränge (insgesamt 9 LED) montiert - aber nur 8 davon sind bei dem angegebenen Kameradom nach außen gerichtet (wer möchte, kann gerne ein 3D-Design mit 9 Löchern erstellen), eine LED zeigt also nutzlos nach innen (erkennbar im 3. Bild der obigen Reihe).&lt;br /&gt;
&lt;br /&gt;
Das Fischaugenobjektiv wird mit wenig (!) klarem Silikon in die vordere Öffnung des Kameradoms geklebt, der rückwärtige Aufsatz mit den 3 Nippeln mit Zweikomponentenkleber auf der Rückseite des Kameradoms befestigt. Dabei zur Ausrichtung den Mikrofonhalter (rechtes Bild, mit den &amp;quot;Ohren&amp;quot;) probeweise aufstecken.&lt;br /&gt;
&lt;br /&gt;
Die Acrylglaskuppel wird mit Silikon oder einem äquivalenten Dichtmaterial wasserdicht in die Frontplatte eingesetzt, auf diese dann von hinten der Kameradom. Eine staubdichte Verbindung erfordert auch hier die Abdichtung mit Silikon. Für den Fall einer möglichen Demontage empfiehlt es sich, diese Abdichtung nicht als Klebung zu verwenden, sondern als umlaufenden Rand nachträglich aufzubringen - der ist dann einfach mit einem Cutter zu entfernen.&lt;br /&gt;
&lt;br /&gt;
==Audio-Subsystem==&lt;br /&gt;
* Soundkarte:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B005BYCBO8 BIGtec USB Soundkarte 7.1 USB Adapter] (Gehäuse lässt sich problemlos [https://forum.fhem.de/index.php/topic,49877.msg444478.html#msg444478 entfernen])&lt;br /&gt;
** LogiLink USB Soundkarte mit Virtual 7.1 Soundeffekt&lt;br /&gt;
* Verstärker:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B00UAA7NH8 Foxnovo High Power Super Mini Digital-Audioverstärker Board Platine (rot)]&lt;br /&gt;
* Lautsprecher:&lt;br /&gt;
** [https://www.reichelt.de/VIS-K28-40-8/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=145413&amp;amp;artnr=VIS+K28.40-8&amp;amp;SEARCH=kleinlautsprecher VISATON Kleinlautsprecher / 2,8 x 4 cm / 8 Ohm VIS K28.40-8]&lt;br /&gt;
** VISATON Kleinlautsprecher mit Kunststoffmembran und quadratischem Metallkorb 5 cm, K 50 SQ / 8 Ω&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
* [http://www.elv.de/bewegungsmeldermodul-pir-13.html Bewegungsmelder]&lt;br /&gt;
* Fototransistor zur Helligkeitsmessung&lt;br /&gt;
* [https://www.amazon.de/gp/product/B01DKTHDXE​ Klingelknopf]&lt;br /&gt;
* Mikroschalter als Sabotagekontakt&lt;br /&gt;
* iButtonLesegerät, z.B.:&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372564/ ohne LED]&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372377/ mit LED] - Achtung evtl. nicht ausreichend Wetterfest&lt;br /&gt;
** [http://www.aliexpress.com/item/2PCS-TM-probe-DS9092-Zinc-Alloy-probe-iButton-probe-reader-with-LED-M98/32635390937.html aus Fernost]&lt;br /&gt;
&lt;br /&gt;
Der Bewegungsmelder ist ein sehr kleines Modul, das einfach von hinten in eine Bohrung der Frontplatte gesteckt wird. Sein Open-Collector-Ausgang wird über eine der vier unbenutzen Adern (blau) des HDMI-Kabels an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
Der Helligkeitssensor besteht aus einem Fototransistor und zwei festen und einem einstellbaren Widerstand. Seine Ausgangsspannung wird an den Arduino weitergeleitet, der auf Grund dieses Wertes das Display und den LED-Ring des Klingelknopfes dimmt.&lt;br /&gt;
&lt;br /&gt;
Als Klingelknopf wird ein Modell aus Edelstahl mit umlaufendem LED-Ring verwendet. &lt;br /&gt;
&lt;br /&gt;
Der Sabotagekontakt besteht aus einem Mikroschalter, der so in die Rückwandinstallation geklebt wird, dass er bei der Abnahme der Frontplatte geschlossen wird. Dieses Signal wird über eine der unbenutzten Adern des HDMI-Kabels (orange im Bild) an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
[[File:DoorPi_part1.png|500x350px]][[File:doorpi_sensorss.jpg|800x350px]]&lt;br /&gt;
&lt;br /&gt;
==Display==&lt;br /&gt;
* [http://wiki.iteadstudio.com/Nextion_HMI_Solution Nextion Display], z.B.:&lt;br /&gt;
** 3,2&amp;quot; 400x240 Pixel: [http://www.aliexpress.com/item/3-2-TFT-480x240-resistive-touch-screen-display-Nextion-3-2-HMI-LCD-Display-Module-TFT/32443541471.html Aus Fernost] oder [http://www.komputer.de/zen/index.php?main_page=product_info&amp;amp;cPath=30&amp;amp;products_id=354&amp;amp;zenid=like084ipplb747m4ur447p5h3 Aus Deutschland]&lt;br /&gt;
&lt;br /&gt;
==Frontplatte==&lt;br /&gt;
Die Frontplatte besteht aus 4 mm starken Aluminium, eloxiert und auf 1/10 mm genau mit den passenden Bohrungen und Ausschnitten sowie rückseitig angeschweißten Gewindebolzen versehen. Online bestellbar z.B. bei der Schaeffer AG, für das vorliegende Exemplar wurden ca. 115 € in Rechnung gestellt. Auf Grund ihrer Stabilität dient diese Frontplatte als Baugruppenträger für die Außeninstallation.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_front.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Rückwandinstallation==&lt;br /&gt;
Die Rückwandinstallation, die in des Mauerwerk eingelassen wird, kommt ebenfalls aus dem 3D-Drucker. Sie besteht aus drei Teilen mit unterschiedlicher Tiefe, um das Loch im Mauerwerk nicht zu groß werden zu lassen. Das obere und das untere Teil enthalten jeweils zwei stabile Vorsprünge mit Aussparungen, in die eine normgerechte M4-Mutter von unten genau hineinpasst. Bemerkenswert ist, dass dieses Bauteil nicht mit einer konventionellen Methode (z.B. im Spritzgussverfahren) gefertigt werden kann.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_covertop.jpg]]&lt;br /&gt;
&lt;br /&gt;
Diese Muttern kommen damit genau hinter den äußeren Schraubenlöchern der Frontplatte zu liegen, Die Frontplatte kann dadurch mit vier (Sicherheits-)schrauben M4 passgenau auf die im Mauerwerk sitzende Rückwandinstallation geschraubt werden.&lt;br /&gt;
&lt;br /&gt;
Auf der Oberkante der drei Teile verläuft eine 1x1 mm² große Nut, in die eine Dichtung eingelegt werden kann.&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15720</id>
		<title>DoorPi und FHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15720"/>
		<updated>2016-06-26T15:13:30Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Ein paar Links ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [https://www.doorpi.org/forum/ DoorPi-Projekt] dient dazu, auf Basis eines Raspberry Pi eine IP-Türsprechstelle aufzubauen. Dazu gibt es unter dem o.a. Link umfangreiche Informationen. Im Folgenden wird eine komplette DoorPi-Installation und ihre Integration in FHEM beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
Die Software DoorPi läuft auf einem Raspberry Pi und stellt einen IP-Phone Client zur Verfügung, der in eine IP-Haustelefonanalage (z.B. mit der FritzBox) eingebunden werden kann. Diesen Raspberry Pi könnte man zwar über längere Audiokabel mit der notwendigen Lautsprecher-Mikrofon-Kombination verbinden, das ist allerdings etwas anfällig für Störsignale. Die meisten Anwender von DoorPi wählen deshalb den Einbau des Raspberry Pi direkt an der Türsprechstelle. Aus Sicht des Autors stellt das eine Sicherheitslücke dar - weil ein direkter Zugang ins Heimnetz außerhalb der eigenen vier Wände geschaffen würde.&lt;br /&gt;
&lt;br /&gt;
Hier soll deshalb eine abgesetzte Installation beschrieben werden: Direkt an der Türsprechstelle sitzen nur Sensoren, Audiohardware und ein Display, angesteuert von einem &amp;quot;dummen&amp;quot; Arduino Mikrocontroller. Ins Innere des Hauses führen drei Kabel:&lt;br /&gt;
*Ein USB-Kabel zur digitalen Ankopplung der Audio-Hardware an den Raspberry Pi&lt;br /&gt;
*Ein HDMI-Kabel zur digitalen Ankopplung einer Kamera an den Raspberry Pi&lt;br /&gt;
*Ein 8-adriges Kabel zur Weiterleitung verschiedener Signale an den Raspberry Pi. Hierfür kann man aus Bequemlichkeitsgründen ein Netzwerk-Patchkabel verwenden - hochfrequente Signale gehen allerdings nicht über diesen Weg.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_block.png]]&lt;br /&gt;
&lt;br /&gt;
==Klingel und Türsprechstelle==&lt;br /&gt;
Beim Drücken auf den Klingelknopf wird ein IP-Telefonanruf gestartet - entweder bei einer internen Nummer, oder (konfigurierbar in FHEM) bei einer beliebigen anderen Nummer. Wenn der Empfänger den Ruf annimmt, kann er mit dem Besucher sprechen und ggf. durch das Drücken einer Taste die Tür öffnen. Es ist in der DoorPi-Installation problemlos konfigurierbar, beliebige andere Aktionen zu starten - z.B. könnte man dem Paketlieferanten nur das Gartentor öffnen.&lt;br /&gt;
&lt;br /&gt;
Während des Klingelvorgangs wird eine Aufnahme des Besuchers angefertigt. Das Gespräch wird als WAV-Datei ebenfalls aufgezeichnet, beide sind unter dem FHEM-Frontend abrufbar. Während der Aufnahme wird eine Infrarot-Lichtquelle eingeschaltet. Diese soll nicht die ganze Szene ausleuchten - sondern verhindern, dass man das Gesicht des Besuchers wegen einer hinter ihm befindlichen Beleuchtung mit sichtbarem Licht nicht gut erkennen kann.&lt;br /&gt;
&lt;br /&gt;
==Türöffnung==&lt;br /&gt;
Das System verfügt über einen iButton-Reader. Legt man einen iButton auf, der in der Software codiert ist, leuchtet eine im Reader integrierte Tricolor-LED in einer entsprechenden Farbe auf (z.B. roter iButton-Halter =&amp;gt; rote LED). Der weitere Ablauf hängt vom Schließzustand der Haustür ab.&lt;br /&gt;
*Ist die Haustür nur zugezogen und nicht abgeschlossen, wird sie geöffnet. Gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot;&lt;br /&gt;
*Ist die Haustür abgeschlossen, wird zunächst auf dem Touchscreen des Systems statt der Namen eine virtuelle Tastatur angezeigt. Hier kann ggf. noch die akustische Bitte eingebaut werden, eine fünfstellige PIN einzugeben. Der Fortschritt bei der Eingabe wird durch einen Balken angezeigt.&lt;br /&gt;
**Ist die PIN falsch, geht das System wieder in den AUsgangszustand zurück, es wird eine Warnungsmeldung an das interne FHEM-System übermittelt.&lt;br /&gt;
**Ist die PIN korrekt, wird zunächst der Entriegelungsvorgang der Tür eingeleitet. Je nach verwendetem System kann das eine Weile dauern - Keymatic ist hierfür ein Beispiel, das können durchaus 3-4 Sekunden werden. Danach wird die Tür geöffnet, gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot; Je nach Konfiguration kann FHEM an dieser Stelle auch weitere Aktionen auslösen - etwa weitere Entriegelungsvorgänge starten.&lt;br /&gt;
&lt;br /&gt;
==Videostream==&lt;br /&gt;
Auf dem Raspberry Pi ist auch die Software mjpeg_streamer installiert, Per Mausklick in der FHEM-Oberfläche wird mjpeg-streamer gestartet und gestoppt (das wird von der DoorPi-Software erledigt, die einen bestimmten virtuellen Tastdruck erkennt und dann lokal ein Skript startet), und stellt dann an TCP-Port 9000 einen Videostream bereit. Wer möchte, kann das System auch so konfigurieren, dass es diesen Videostream zusammen mit dem Audiostream zur Videotelefonie verwendet.&lt;br /&gt;
==Bewegungserkennung und Helligkeitsmessung==&lt;br /&gt;
Erkennt das System durch den eingebauten PIR-Bewegungsmelder eine Bewegung, wird&lt;br /&gt;
*die Anzeigehelligkeit für mindestens eine Minute hochgefahren&lt;br /&gt;
*ein Signal an FHEM gesendet.&lt;br /&gt;
Wenn eine Minute keine Bewegung erkannt wurde, geht die Anzeigehelligkeit (d.h. vom Display und dem LED-Rimng um den Klingelknopf) wieder auf einen Wert zurück, der durch die externe Helligkeit bestimmt ist.&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
==Raspberry Pi==&lt;br /&gt;
Verwendet wird &lt;br /&gt;
* ein [http://www.pollin.de/shop/dt/OTQxNzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_3_Modell_B.html Raspberry Pi 3], der ein integriertes WLAN-Modul besitzt&lt;br /&gt;
* eine Zusatzkarte [http://www.pollin.de/shop/dt/NTc1NzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_B_Zusatzplatine_PIFACE_DIGITAL_2.html PiFace 2], mit je 8 digitalen Ein- und Ausgängen.&lt;br /&gt;
* ein klares [http://www.reichelt.de/CB-RPF-P-CLR/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=160959 Gehäuse], das die Erweiterungskarte mit aufnehmen kann&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
* Ein Arduino Micro. Der Sketch ist derzeit noch nicht Verfügbar, beispiele zur Auslesung von iButtons gibt es [http://ice-karlsruhe.de/projekte/smarthome/smarthome-hacks-links-und-ergaenzungen/#k6 hier]&lt;br /&gt;
&lt;br /&gt;
==Kamera-Subsystem==&lt;br /&gt;
Verwendet werden hierfür&lt;br /&gt;
* eine Standard-NoIR-Kamera für den Raspberry Pi (ohne Infrarotfilter, somit IR-empfindlich) (z.B. von [http://www.elv.de/raspberry-pi-noir-kamera-modul.html ELV])&lt;br /&gt;
* ein Fisheye 180° zum Aufclippen auf Smartphones (z.B. [https://www.amazon.de/Bresser-Clip--Grad-Fisheye-Handylinse/dp/B00MQQSJKY Bresser])&lt;br /&gt;
* eine [http://www.ebay.de/itm/321915955373?_trksid=p2057872.m2749.l2649 Acrylglaskuppel] 2 Zoll ​&lt;br /&gt;
* eine [https://www.tindie.com/products/freto/pi-camera-hdmi-cable-extension/ Kabelverlängerung] Flatribbon &amp;lt;-&amp;gt; HDMI &amp;lt;-&amp;gt; Flatribbon&lt;br /&gt;
* ein Kameradom aus dem 3D-Drucker mit genauer Passung für das Fisheye vorne und die Kamera hinten, sowie Passungen für 8 LED. Die STL-Datei für diesen Kameradom findet man hier: [https://www.tinkercad.com/things/jv5x6lrihbk​ PiCameraDome4]&lt;br /&gt;
* eine Rückseite des Kameradoms aus dem 3D-Drucker, wird hinten mittig aufgeklebt und hält den Deckel des Kamerasystem durch drei Nippel. Die STL-Datei dafür findet man hier  [https://tinkercad.com/things/cV6rkY6DWvc PiCameraDome4addendum]&lt;br /&gt;
* ein Deckel des Kameradoms aus dem 3D-Drucker, wird auf die Rückseite aufgesteckt und beinhaltet zwei Halterungen für Mikrofone (die &amp;quot;Ohren&amp;quot; im Bild). Die STL-Datei dafür findet man hier [https://tinkercad.com/things/8X0fhiSTyXk PiCameraDome4back]&lt;br /&gt;
* 9 x IR-LED [http://www.conrad.biz/ce/de/product/171140/IR-Emitter-940-nm-17-5-mm-radial-bedrahtet-Vishay-TSAL-6200 TSAL 6200] mit hoher Leistung &lt;br /&gt;
* 3 Widerstände 10 Ohm 0,2 W.&lt;br /&gt;
&lt;br /&gt;
[[File:Dome1.jpg|400x300px]][[File:Dome2.jpg|400x300px]][[File:Doorpi_dome3s.jpg|400x300px]][[File:Doorpi_dome4s.jpg|600x300px]]&lt;br /&gt;
&lt;br /&gt;
Zur Montage werden vier M2-Gewindebolzen in die hintere Aussparung des Kameradoms eingeklebt, und auf diese mit entsprechenden Abstandshaltern und Muttern sowohl die Kamera, als auch die eine Hälfte der Kabelverlängerung geschraubt. Dabei empfiehlt es sich, die LED vorher an Ort und Stelle zu haben - ggf.  muss bei ungünstiger Klebung der Gewindebolzen bei den Eck-LED ein Gehäusevorsprung etwas abgefeilt werden.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung der LED für dem Betrieb an einer Spannung von 5V ausgelegt - damit fließen durch drei in Reihe geschaltete LED und einen 10 Ohm-Widerstand ziemlich genau 100mA. Bei der Schaltung über einen MOSFET ist das etwas weniger, wegen des Drain-Source-Widerstandes des MOSFET, reicht aber für die notwendige Helligkeit aus. Aus Symmetriegründen werden drei solche Stränge (insgesamt 9 LED) montiert - aber nur 8 davon sind bei dem angegebenen Kameradom nach außen gerichtet (wer möchte, kann gerne ein 3D-Design mit 9 Löchern erstellen), eine LED zeigt also nutzlos nach innen (erkennbar im 3. Bild der obigen Reihe).&lt;br /&gt;
&lt;br /&gt;
Das Fischaugenobjektiv wird mit wenig (!) klarem Silikon in die vordere Öffnung des Kameradoms geklebt, der rückwärtige Aufsatz mit den 3 Nippeln mit Zweikomponentenkleber auf der Rückseite des Kameradoms befestigt. Dabei zur Ausrichtung den Mikrofonhalter (rechtes Bild, mit den &amp;quot;Ohren&amp;quot;) probeweise aufstecken.&lt;br /&gt;
&lt;br /&gt;
Die Acrylglaskuppel wird mit Silikon oder einem äquivalenten Dichtmaterial wasserdicht in die Frontplatte eingesetzt, auf diese dann von hinten der Kameradom. Eine staubdichte Verbindung erfordert auch hier die Abdichtung mit Silikon. Für den Fall einer möglichen Demontage empfiehlt es sich, diese Abdichtung nicht als Klebung zu verwenden, sondern als umlaufenden Rand nachträglich aufzubringen - der ist dann einfach mit einem Cutter zu entfernen.&lt;br /&gt;
&lt;br /&gt;
==Audio-Subsystem==&lt;br /&gt;
* Soundkarte:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B005BYCBO8 BIGtec USB Soundkarte 7.1 USB Adapter] (Gehäuse lässt sich problemlos [https://forum.fhem.de/index.php/topic,49877.msg444478.html#msg444478 entfernen])&lt;br /&gt;
** LogiLink USB Soundkarte mit Virtual 7.1 Soundeffekt&lt;br /&gt;
* Verstärker:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B00UAA7NH8 Foxnovo High Power Super Mini Digital-Audioverstärker Board Platine (rot)]&lt;br /&gt;
* Lautsprecher:&lt;br /&gt;
** [https://www.reichelt.de/VIS-K28-40-8/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=145413&amp;amp;artnr=VIS+K28.40-8&amp;amp;SEARCH=kleinlautsprecher VISATON Kleinlautsprecher / 2,8 x 4 cm / 8 Ohm VIS K28.40-8]&lt;br /&gt;
** VISATON Kleinlautsprecher mit Kunststoffmembran und quadratischem Metallkorb 5 cm, K 50 SQ / 8 Ω&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
* [http://www.elv.de/bewegungsmeldermodul-pir-13.html Bewegungsmelder]&lt;br /&gt;
* Fototransistor zur Helligkeitsmessung&lt;br /&gt;
* [https://www.amazon.de/gp/product/B01DKTHDXE​ Klingelknopf]&lt;br /&gt;
* Mikroschalter als Sabotagekontakt&lt;br /&gt;
* iButtonLesegerät, z.B.:&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372564/ ohne LED]&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372377/ mit LED] - Achtung evtl. nicht ausreichend Wetterfest&lt;br /&gt;
** [http://www.aliexpress.com/item/2PCS-TM-probe-DS9092-Zinc-Alloy-probe-iButton-probe-reader-with-LED-M98/32635390937.html aus Fernost]&lt;br /&gt;
&lt;br /&gt;
Der Bewegungsmelder ist ein sehr kleines Modul, das einfach von hinten in eine Bohrung der Frontplatte gesteckt wird. Sein Open-Collector-Ausgang wird über eine der vier unbenutzen Adern (blau) des HDMI-Kabels an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
Der Helligkeitssensor besteht aus einem Fototransistor und zwei festen und einem einstellbaren Widerstand. Seine Ausgangsspannung wird an den Arduino weitergeleitet, der auf Grund dieses Wertes das Display und den LED-Ring des Klingelknopfes dimmt.&lt;br /&gt;
&lt;br /&gt;
Als Klingelknopf wird ein Modell aus Edelstahl mit umlaufendem LED-Ring verwendet. &lt;br /&gt;
&lt;br /&gt;
Der Sabotagekontakt besteht aus einem Mikroschalter, der so in die Rückwandinstallation geklebt wird, dass er bei der Abnahme der Frontplatte geschlossen wird. Dieses Signal wird über eine der unbenutzten Adern des HDMI-Kabels (orange im Bild) an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
[[File:DoorPi_part1.png|500x350px]][[File:doorpi_sensorss.jpg|800x350px]]&lt;br /&gt;
&lt;br /&gt;
==Display==&lt;br /&gt;
* [http://wiki.iteadstudio.com/Nextion_HMI_Solution Nextion Display], z.B.:&lt;br /&gt;
** 3,2&amp;quot; 400x240 Pixel: [http://www.aliexpress.com/item/3-2-TFT-480x240-resistive-touch-screen-display-Nextion-3-2-HMI-LCD-Display-Module-TFT/32443541471.html Aus Fernost] oder [http://www.komputer.de/zen/index.php?main_page=product_info&amp;amp;cPath=30&amp;amp;products_id=354&amp;amp;zenid=like084ipplb747m4ur447p5h3 Aus Deutschland]&lt;br /&gt;
&lt;br /&gt;
==Frontplatte==&lt;br /&gt;
Die Frontplatte besteht aus 4 mm starken Aluminium, eloxiert und auf 1/10 mm genau mit den passenden Bohrungen und Ausschnitten sowie rückseitig angeschweißten Gewindebolzen versehen. Online bestellbar z.B. bei der Schaeffer AG, für das vorliegende Exemplar wurden ca. 115 € in Rechnung gestellt. Auf Grund ihrer Stabilität dient diese Frontplatte als Baugruppenträger für die Außeninstallation.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_front.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Rückwandinstallation==&lt;br /&gt;
Die Rückwandinstallation, die in des Mauerwerk eingelassen wird, kommt ebenfalls aus dem 3D-Drucker. Sie besteht aus drei Teilen mit unterschiedlicher Tiefe, um das Loch im Mauerwerk nicht zu groß werden zu lassen. Das obere und das untere Teil enthalten jeweils zwei stabile Vorsprünge mit Aussparungen, in die eine normgerechte M4-Mutter von unten genau hineinpasst. Bemerkenswert ist, dass dieses Bauteil nicht mit einer konventionellen Methode (z.B. im Spritzgussverfahren) gefertigt werden kann.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_covertop.jpg]]&lt;br /&gt;
&lt;br /&gt;
Diese Muttern kommen damit genau hinter den äußeren Schraubenlöchern der Frontplatte zu liegen, Die Frontplatte kann dadurch mit vier (Sicherheits-)schrauben M4 passgenau auf die im Mauerwerk sitzende Rückwandinstallation geschraubt werden.&lt;br /&gt;
&lt;br /&gt;
Auf der Oberkante der drei Teile verläuft eine 1x1 mm² große Nut, in die eine Dichtung eingelegt werden kann.&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15707</id>
		<title>DoorPi und FHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15707"/>
		<updated>2016-06-26T14:49:15Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Weitere Links ergänzt bezüglich des Displays &amp;amp; Audio Systems&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [https://www.doorpi.org/forum/ DoorPi-Projekt] dient dazu, auf Basis eines Raspberry Pi eine IP-Türsprechstelle aufzubauen. Dazu gibt es unter dem o.a. Link umfangreiche Informationen. Im Folgenden wird eine komplette DoorPi-Installation und ihre Integration in FHEM beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
Die Software DoorPi läuft auf einem Raspberry Pi und stellt einen IP-Phone Client zur Verfügung, der in eine IP-Haustelefonanalage (z.B. mit der FritzBox) eingebunden werden kann. Diesen Raspberry Pi könnte man zwar über längere Audiokabel mit der notwendigen Lautsprecher-Mikrofon-Kombination verbinden, das ist allerdings etwas anfällig für Störsignale. Die meisten Anwender von DoorPi wählen deshalb den Einbau des Raspberry Pi direkt an der Türsprechstelle. Aus Sicht des Autors stellt das eine Sicherheitslücke dar - weil ein direkter Zugang ins Heimnetz außerhalb der eigenen vier Wände geschaffen würde.&lt;br /&gt;
&lt;br /&gt;
Hier soll deshalb eine abgesetzte Installation beschrieben werden: Direkt an der Türsprechstelle sitzen nur Sensoren, Audiohardware und ein Display, angesteuert von einem &amp;quot;dummen&amp;quot; Arduino Mikrocontroller. Ins Innere des Hauses führen drei Kabel:&lt;br /&gt;
*Ein USB-Kabel zur digitalen Ankopplung der Audio-Hardware an den Raspberry Pi&lt;br /&gt;
*Ein HDMI-Kabel zur digitalen Ankopplung einer Kamera an den Raspberry Pi&lt;br /&gt;
*Ein 8-adriges Kabel zur Weiterleitung verschiedener Signale an den Raspberry Pi. Hierfür kann man aus Bequemlichkeitsgründen ein Netzwerk-Patchkabel verwenden - hochfrequente Signale gehen allerdings nicht über diesen Weg.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_block.png]]&lt;br /&gt;
&lt;br /&gt;
==Klingel und Türsprechstelle==&lt;br /&gt;
Beim Drücken auf den Klingelknopf wird ein IP-Telefonanruf gestartet - entweder bei einer internen Nummer, oder (konfigurierbar in FHEM) bei einer beliebigen anderen Nummer. Wenn der Empfänger den Ruf annimmt, kann er mit dem Besucher sprechen und ggf. durch das Drücken einer Taste die Tür öffnen. Es ist in der DoorPi-Installation problemlos konfigurierbar, beliebige andere Aktionen zu starten - z.B. könnte man dem Paketlieferanten nur das Gartentor öffnen.&lt;br /&gt;
&lt;br /&gt;
Während des Klingelvorgangs wird eine Aufnahme des Besuchers angefertigt. Das Gespräch wird als WAV-Datei ebenfalls aufgezeichnet, beide sind unter dem FHEM-Frontend abrufbar. Während der Aufnahme wird eine Infrarot-Lichtquelle eingeschaltet. Diese soll nicht die ganze Szene ausleuchten - sondern verhindern, dass man das Gesicht des Besuchers wegen einer hinter ihm befindlichen Beleuchtung mit sichtbarem Licht nicht gut erkennen kann.&lt;br /&gt;
&lt;br /&gt;
==Türöffnung==&lt;br /&gt;
Das System verfügt über einen iButton-Reader. Legt man einen iButton auf, der in der Software codiert ist, leuchtet eine im Reader integrierte Tricolor-LED in einer entsprechenden Farbe auf (z.B. roter iButton-Halter =&amp;gt; rote LED). Der weitere Ablauf hängt vom Schließzustand der Haustür ab.&lt;br /&gt;
*Ist die Haustür nur zugezogen und nicht abgeschlossen, wird sie geöffnet. Gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot;&lt;br /&gt;
*Ist die Haustür abgeschlossen, wird zunächst auf dem Touchscreen des Systems statt der Namen eine virtuelle Tastatur angezeigt. Hier kann ggf. noch die akustische Bitte eingebaut werden, eine fünfstellige PIN einzugeben. Der Fortschritt bei der Eingabe wird durch einen Balken angezeigt.&lt;br /&gt;
**Ist die PIN falsch, geht das System wieder in den AUsgangszustand zurück, es wird eine Warnungsmeldung an das interne FHEM-System übermittelt.&lt;br /&gt;
**Ist die PIN korrekt, wird zunächst der Entriegelungsvorgang der Tür eingeleitet. Je nach verwendetem System kann das eine Weile dauern - Keymatic ist hierfür ein Beispiel, das können durchaus 3-4 Sekunden werden. Danach wird die Tür geöffnet, gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot; Je nach Konfiguration kann FHEM an dieser Stelle auch weitere Aktionen auslösen - etwa weitere Entriegelungsvorgänge starten.&lt;br /&gt;
&lt;br /&gt;
==Videostream==&lt;br /&gt;
Auf dem Raspberry Pi ist auch die Software mjpeg_streamer installiert, Per Mausklick in der FHEM-Oberfläche wird mjpeg-streamer gestartet und gestoppt (das wird von der DoorPi-Software erledigt, die einen bestimmten virtuellen Tastdruck erkennt und dann lokal ein Skript startet), und stellt dann an TCP-Port 9000 einen Videostream bereit. Wer möchte, kann das System auch so konfigurieren, dass es diesen Videostream zusammen mit dem Audiostream zur Videotelefonie verwendet.&lt;br /&gt;
==Bewegungserkennung und Helligkeitsmessung==&lt;br /&gt;
Erkennt das System durch den eingebauten PIR-Bewegungsmelder eine Bewegung, wird&lt;br /&gt;
*die Anzeigehelligkeit für mindestens eine Minute hochgefahren&lt;br /&gt;
*ein Signal an FHEM gesendet.&lt;br /&gt;
Wenn eine Minute keine Bewegung erkannt wurde, geht die Anzeigehelligkeit (d.h. vom Display und dem LED-Rimng um den Klingelknopf) wieder auf einen Wert zurück, der durch die externe Helligkeit bestimmt ist.&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
==Raspberry Pi==&lt;br /&gt;
Verwendet wird &lt;br /&gt;
* ein [http://www.pollin.de/shop/dt/OTQxNzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_3_Modell_B.html Raspberry Pi 3], der ein integriertes WLAN-Modul besitzt&lt;br /&gt;
* eine Zusatzkarte [http://www.pollin.de/shop/dt/NTc1NzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_B_Zusatzplatine_PIFACE_DIGITAL_2.html PiFace 2], mit je 8 digitalen Ein- und Ausgängen.&lt;br /&gt;
* ein klares [http://www.reichelt.de/CB-RPF-P-CLR/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=160959 Gehäuse], das die Erweiterungskarte mit aufnehmen kann&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
* Ein Arduino Micro, welcher mit beispielsweise mit dem Sketch von [http://ice-karlsruhe.de/projekte/smarthome/smarthome-hacks-links-und-ergaenzungen/#k6 hier] programmiert wird&lt;br /&gt;
&lt;br /&gt;
==Kamera-Subsystem==&lt;br /&gt;
Verwendet werden hierfür&lt;br /&gt;
* eine Standard-NoIR-Kamera für den Raspberry Pi (ohne Infrarotfilter, somit IR-empfindlich)&lt;br /&gt;
* ein [https://www.amazon.de/Bresser-Clip--Grad-Fisheye-Handylinse/dp/B00MQQSJKY Bresser Fisheye] 180° zum Aufclippen auf Smartphones&lt;br /&gt;
* eine [http://www.ebay.de/itm/321915955373?_trksid=p2057872.m2749.l2649 Acrylglaskuppel] 2 Zoll ​&lt;br /&gt;
* eine [https://www.tindie.com/products/freto/pi-camera-hdmi-cable-extension/ Kabelverlängerung] Flatribbon &amp;lt;-&amp;gt; HDMI &amp;lt;-&amp;gt; Flatribbon&lt;br /&gt;
* ein Kameradom aus dem 3D-Drucker mit genauer Passung für das Fisheye vorne und die Kamera hinten, sowie Passungen für 8 LED.Die STL-Datei für diesen Kameradom findet man hier: [https://www.tinkercad.com/things/jv5x6lrihbk​ PiCameraDome4]&lt;br /&gt;
* eine Rückseite des Kameradoms aus dem 3D-Drucker, wird hinten mittig aufgeklebt und hält den Deckel des Kamerasystem durch drei Nippel. Die STL-Datei dafür findet man hier  [https://tinkercad.com/things/cV6rkY6DWvc PiCameraDome4addendum]&lt;br /&gt;
* ein Deckel des Kameradoms aus dem 3D-Drucker, wird auf die Rückseite aufgesteckt und beinhaltet zwei Halterungen für Mikrofone (die &amp;quot;Ohren&amp;quot; im Bild). Die STL-Datei dafür findet man hier [https://tinkercad.com/things/8X0fhiSTyXk PiCameraDome4back]&lt;br /&gt;
* 9 x IR-LED [http://www.conrad.biz/ce/de/product/171140/IR-Emitter-940-nm-17-5-mm-radial-bedrahtet-Vishay-TSAL-6200 TSAL 6200] mit hoher Leistung &lt;br /&gt;
* 3 Widerstände 10 Ohm 0,2 W.&lt;br /&gt;
&lt;br /&gt;
[[File:Dome1.jpg|400x300px]][[File:Dome2.jpg|400x300px]][[File:Doorpi_dome3s.jpg|400x300px]][[File:Doorpi_dome4s.jpg|600x300px]]&lt;br /&gt;
&lt;br /&gt;
Zur Montage werden vier M2-Gewindebolzen in die hintere Aussparung des Kameradoms eingeklebt, und auf diese mit entsprechenden Abstandshaltern und Muttern sowohl die Kamera, als auch die eine Hälfte der Kabelverlängerung geschraubt. Dabei empfiehlt es sich, die LED vorher an Ort und Stelle zu haben - ggf.  muss bei ungünstiger Klebung der Gewindebolzen bei den Eck-LED ein Gehäusevorsprung etwas abgefeilt werden.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung der LED für dem Betrieb an einer Spannung von 5V ausgelegt - damit fließen durch drei in Reihe geschaltete LED und einen 10 Ohm-Widerstand ziemlich genau 100mA. Bei der Schaltung über einen MOSFET ist das etwas weniger, wegen des Drain-Source-Widerstandes des MOSFET, reicht aber für die notwendige Helligkeit aus. Aus Symmetriegründen werden drei solche Stränge (insgesamt 9 LED) montiert - aber nur 8 davon sind bei dem angegebenen Kameradom nach außen gerichtet (wer möchte, kann gerne ein 3D-Design mit 9 Löchern erstellen), eine LED zeigt also nutzlos nach innen (erkennbar im 3. Bild der obigen Reihe).&lt;br /&gt;
&lt;br /&gt;
Das Fischaugenobjektiv wird mit wenig (!) klarem Silikon in die vordere Öffnung des Kameradoms geklebt, der rückwärtige Aufsatz mit den 3 Nippeln mit Zweikomponentenkleber auf der Rückseite des Kameradoms befestigt. Dabei zur Ausrichtung den Mikrofonhalter (rechtes Bild, mit den &amp;quot;Ohren&amp;quot;) probeweise aufstecken.&lt;br /&gt;
&lt;br /&gt;
Die Acrylglaskuppel wird mit Silikon oder einem äquivalenten Dichtmaterial wasserdicht in die Frontplatte eingesetzt, auf diese dann von hinten der Kameradom. Eine staubdichte Verbindung erfordert auch hier die Abdichtung mit Silikon. Für den Fall einer möglichen Demontage empfiehlt es sich, diese Abdichtung nicht als Klebung zu verwenden, sondern als umlaufenden Rand nachträglich aufzubringen - der ist dann einfach mit einem Cutter zu entfernen.&lt;br /&gt;
&lt;br /&gt;
==Audio-Subsystem==&lt;br /&gt;
* Soundkarte:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B005BYCBO8 BIGtec USB Soundkarte 7.1 USB Adapter] (Gehäuse lässt sich problemlos [https://forum.fhem.de/index.php/topic,49877.msg444478.html#msg444478 entfernen])&lt;br /&gt;
** LogiLink USB Soundkarte mit Virtual 7.1 Soundeffekt&lt;br /&gt;
* Verstärker:&lt;br /&gt;
** [https://www.amazon.de/gp/product/B00UAA7NH8 Foxnovo High Power Super Mini Digital-Audioverstärker Board Platine (rot)]&lt;br /&gt;
* Lautsprecher:&lt;br /&gt;
** [https://www.reichelt.de/VIS-K28-40-8/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=145413&amp;amp;artnr=VIS+K28.40-8&amp;amp;SEARCH=kleinlautsprecher VISATON Kleinlautsprecher / 2,8 x 4 cm / 8 Ohm VIS K28.40-8]&lt;br /&gt;
** VISATON Kleinlautsprecher mit Kunststoffmembran und quadratischem Metallkorb 5 cm, K 50 SQ / 8 Ω&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
* [http://www.elv.de/bewegungsmeldermodul-pir-13.html Bewegungsmelder]&lt;br /&gt;
* Fototransistor zur Helligkeitsmessung&lt;br /&gt;
* [https://www.amazon.de/gp/product/B01DKTHDXE​ Klingelknopf]&lt;br /&gt;
* Mikroschalter als Sabotagekontakt&lt;br /&gt;
* iButtonLesegerät, z.B.:&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372564/ ohne LED]&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372377/ mit LED] - Achtung evtl. nicht ausreichend Wetterfest&lt;br /&gt;
** [http://www.aliexpress.com/item/2PCS-TM-probe-DS9092-Zinc-Alloy-probe-iButton-probe-reader-with-LED-M98/32635390937.html aus Fernost]&lt;br /&gt;
&lt;br /&gt;
Der Bewegungsmelder ist ein sehr kleines Modul, das einfach von hinten in eine Bohrung der Frontplatte gesteckt wird. Sein Open-Collector-Ausgang wird über eine der vier unbenutzen Adern (blau) des HDMI-Kabels an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
Der Helligkeitssensor besteht aus einem Fototransistor und zwei festen und einem einstellbaren Widerstand. Seine Ausgangsspannung wird an den Arduino weitergeleitet, der auf Grund dieses Wertes das Display und den LED-Ring des Klingelknopfes dimmt.&lt;br /&gt;
&lt;br /&gt;
Als Klingelknopf wird ein Modell aus Edelstahl mit umlaufendem LED-Ring verwendet. &lt;br /&gt;
&lt;br /&gt;
Der Sabotagekontakt besteht aus einem Mikroschalter, der so in die Rückwandinstallation geklebt wird, dass er bei der Abnahme der Frontplatte geschlossen wird. Dieses Signal wird über eine der unbenutzten Adern des HDMI-Kabels (orange im Bild) an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
[[File:DoorPi_part1.png|500x350px]][[File:doorpi_sensorss.jpg|800x350px]]&lt;br /&gt;
&lt;br /&gt;
==Display==&lt;br /&gt;
* [http://wiki.iteadstudio.com/Nextion_HMI_Solution Nextion Display], z.B.:&lt;br /&gt;
** 3,2&amp;quot; 400x240 Pixel: [http://www.aliexpress.com/item/3-2-TFT-480x240-resistive-touch-screen-display-Nextion-3-2-HMI-LCD-Display-Module-TFT/32443541471.html Aus Fernost] oder [http://www.komputer.de/zen/index.php?main_page=product_info&amp;amp;cPath=30&amp;amp;products_id=354&amp;amp;zenid=like084ipplb747m4ur447p5h3 Aus Deutschland]&lt;br /&gt;
&lt;br /&gt;
==Frontplatte==&lt;br /&gt;
Die Frontplatte besteht aus 4 mm starken Aluminium, eloxiert und auf 1/10 mm genau mit den passenden Bohrungen und Ausschnitten sowie rückseitig angeschweißten Gewindebolzen versehen. Online bestellbar z.B. bei der Schaeffer AG, für das vorliegende Exemplar wurden ca. 115 € in Rechnung gestellt. Auf Grund ihrer Stabilität dient diese Frontplatte als Baugruppenträger für die Außeninstallation.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_front.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Rückwandinstallation==&lt;br /&gt;
Die Rückwandinstallation, die in des Mauerwerk eingelassen wird, kommt ebenfalls aus dem 3D-Drucker. Sie besteht aus drei Teilen mit unterschiedlicher Tiefe, um das Loch im Mauerwerk nicht zu groß werden zu lassen. Das obere und das untere Teil enthalten jeweils zwei stabile Vorsprünge mit Aussparungen, in die eine normgerechte M4-Mutter von unten genau hineinpasst. Bemerkenswert ist, dass dieses Bauteil nicht mit einer konventionellen Methode (z.B. im Spritzgussverfahren) gefertigt werden kann.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_covertop.jpg]]&lt;br /&gt;
&lt;br /&gt;
Diese Muttern kommen damit genau hinter den äußeren Schraubenlöchern der Frontplatte zu liegen, Die Frontplatte kann dadurch mit vier (Sicherheits-)schrauben M4 passgenau auf die im Mauerwerk sitzende Rückwandinstallation geschraubt werden.&lt;br /&gt;
&lt;br /&gt;
Auf der Oberkante der drei Teile verläuft eine 1x1 mm² große Nut, in die eine Dichtung eingelegt werden kann.&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15689</id>
		<title>DoorPi und FHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=15689"/>
		<updated>2016-06-26T13:57:11Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Schönheitsfehler in einigen Links korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [https://www.doorpi.org/forum/ DoorPi-Projekt] dient dazu, auf Basis eines Raspberry Pi eine IP-Türsprechstelle aufzubauen. Dazu gibt es unter dem o.a. Link umfangreiche Informationen. Im Folgenden wird eine komplette DoorPi-Installation und ihre Integration in FHEM beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
Die Software DoorPi läuft auf einem Raspberry Pi und stellt einen IP-Phone Client zur Verfügung, der in eine IP-Haustelefonanalage (z.B. mit der FritzBox) eingebunden werden kann. Diesen Raspberry Pi könnte man zwar über längere Audiokabel mit der notwendigen Lautsprecher-Mikrofon-Kombination verbinden, das ist allerdings etwas anfällig für Störsignale. Die meisten Anwender von DoorPi wählen deshalb den Einbau des Raspberry Pi direkt an der Türsprechstelle. Aus Sicht des Autors stellt das eine Sicherheitslücke dar - weil ein direkter Zugang ins Heimnetz außerhalb der eigenen vier Wände geschaffen würde.&lt;br /&gt;
&lt;br /&gt;
Hier soll deshalb eine abgesetzte Installation beschrieben werden: Direkt an der Türsprechstelle sitzen nur Sensoren, Audiohardware und ein Display, angesteuert von einem &amp;quot;dummen&amp;quot; Arduino Mikrocontroller. Ins Innere des Hauses führen drei Kabel:&lt;br /&gt;
*Ein USB-Kabel zur digitalen Ankopplung der Audio-Hardware an den Raspberry Pi&lt;br /&gt;
*Ein HDMI-Kabel zur digitalen Ankopplung einer Kamera an den Raspberry Pi&lt;br /&gt;
*Ein 8-adriges Kabel zur Weiterleitung verschiedener Signale an den Raspberry Pi. Hierfür kann man aus Bequemlichkeitsgründen ein Netzwerk-Patchkabel verwenden - hochfrequente Signale gehen allerdings nicht über diesen Weg.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_block.png]]&lt;br /&gt;
&lt;br /&gt;
==Klingel und Türsprechstelle==&lt;br /&gt;
Beim Drücken auf den Klingelknopf wird ein IP-Telefonanruf gestartet - entweder bei einer internen Nummer, oder (konfigurierbar in FHEM) bei einer beliebigen anderen Nummer. Wenn der Empfänger den Ruf annimmt, kann er mit dem Besucher sprechen und ggf. durch das Drücken einer Taste die Tür öffnen. Es ist in der DoorPi-Installation problemlos konfigurierbar, beliebige andere Aktionen zu starten - z.B. könnte man dem Paketlieferanten nur das Gartentor öffnen.&lt;br /&gt;
&lt;br /&gt;
Während des Klingelvorgangs wird eine Aufnahme des Besuchers angefertigt. Das Gespräch wird als WAV-Datei ebenfalls aufgezeichnet, beide sind unter dem FHEM-Frontend abrufbar. Während der Aufnahme wird eine Infrarot-Lichtquelle eingeschaltet. Diese soll nicht die ganz Szene ausleuchten - sondern verhindern, dass man das Gesicht des Besuchers wegen einer hinter ihm befindlichen Beleuchtung mit sichtbarem Licht nicht gut erkennen kann.&lt;br /&gt;
&lt;br /&gt;
==Türöffnung==&lt;br /&gt;
Das System verfügt über einen iButton-Reader. Legt man einen iButton auf, der in der Software codiert ist, leuchtet eine im Reader integrierte Tricolor-LED in einer entsprechenden Farbe auf (z.B. roter iButton-Halter =&amp;gt; rote LED). Der weitere Ablauf hängt vom Schließzustand der Haustür ab.&lt;br /&gt;
*Ist die Haustür nur zugezogen und nicht abgeschlossen, wird sie geöffnet. Gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot;&lt;br /&gt;
*Ist die Haustür abgeschlossen, wird zunächst auf dem Touchscreen des Systems statt der Namen eine virtuelle Tastatur angezeigt. Hier kann ggf. noch die akustische Bitte eingebaut werden, eine fünfstellige PIN einzugeben. Der Fortschritt bei der Eingabe wird durch einen Balken angezeigt.&lt;br /&gt;
**Ist die PIN falsch, geht das System wieder in den AUsgangszustand zurück, es wird eine Warnungsmeldung an das interne FHEM-System übermittelt.&lt;br /&gt;
**Ist die PIN korrekt, wird zunächst der Entriegelungsvorgang der Tür eingeleitet. Je nach verwendetem System kann das eine Weile dauern - Keymatic ist hierfür ein Beispiel, das können durchaus 3-4 Sekunden werden. Danach wird die Tür geöffnet, gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot; Je nach Konfiguration kann FHEM an dieser Stelle auch weitere Aktionen auslösen - etwa weitere Entriegelungsvorgänge starten.&lt;br /&gt;
&lt;br /&gt;
==Videostream==&lt;br /&gt;
Auf dem Raspberry Pi ist auch die Software mjpeg_streamer installiert, Per Mausklick in der FHEM-Oberfläche wird mjpeg-streamer gestartet und gestoppt (das wird von der DoorPi-Software erledigt, die einen bestimmten virtuellen Tastdruck erkennt und dann lokal ein Skript startet), und stellt dann an TCP-Port 9000 einen Videostream bereit. Wer möchte, kann das System auch so konfigurieren, dass es diesen Videostream zusammen mit dem Audiostream zur Videotelefonie verwendet.&lt;br /&gt;
==Bewegungserkennung und Helligkeitsmessung==&lt;br /&gt;
Erkennt das System durch den eingebauten PIR-Bewegungsmelder eine Bewegung, wird&lt;br /&gt;
*die Anzeigehelligkeit für mindestens eine Minute hochgefahren&lt;br /&gt;
*ein Signal an FHEM gesendet.&lt;br /&gt;
Wenn eine Minute keine Bewegung erkannt wurde, geht die Anzeigehelligkeit (d.h. vom Display und dem LED-Rimng um den Klingelknopf) wieder auf einen Wert zurück, der durch die externe Helligkeit bestimmt ist.&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
==Raspberry Pi==&lt;br /&gt;
Verwendet wird &lt;br /&gt;
*ein [http://www.pollin.de/shop/dt/OTQxNzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_3_Modell_B.html Raspberry Pi 3], der ein integriertes WLAN-Modul beitzt&lt;br /&gt;
*eine Zusatzkarte [http://www.pollin.de/shop/dt/NTc1NzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_B_Zusatzplatine_PIFACE_DIGITAL_2.html PiFace 2], mit je 8 digitalen Ein- und Ausgängen.&lt;br /&gt;
* ein klares [http://www.reichelt.de/CB-RPF-P-CLR/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=160959 Gehäuse], das die Erweiterungskarte mit aufnehmen kann&lt;br /&gt;
&lt;br /&gt;
==Kamera-Subsystem==&lt;br /&gt;
Verwendet werden hierfür&lt;br /&gt;
*eine Standard-NoIR-Kamera für den Raspberry Pi (ohne Infrarotfilter, somit IR-empfindlich)&lt;br /&gt;
*ein [https://www.amazon.de/Bresser-Clip--Grad-Fisheye-Handylinse/dp/B00MQQSJKY Bresser Fisheye] 180° zum Aufclippen auf Smartphones&lt;br /&gt;
*eine [http://www.ebay.de/itm/321915955373?_trksid=p2057872.m2749.l2649 Acrylglaskuppel] 2 Zoll ​&lt;br /&gt;
*eine [https://www.tindie.com/products/freto/pi-camera-hdmi-cable-extension/ Kabelverlängerung] Flatribbon &amp;lt;-&amp;gt; HDMI &amp;lt;-&amp;gt; Flatribbon&lt;br /&gt;
*ein Kameradom aus dem 3D-Drucker mit genauer Passung für das Fisheye vorne und die Kamera hinten, sowie Passungen für 8 LED.Die STL-Datei für diesen Kameradom findet man hier: [https://www.tinkercad.com/things/jv5x6lrihbk​ PiCameraDome4]&lt;br /&gt;
*eine Rückseite des Kameradoms aus dem 3D-Drucker, wird hinten mittig aufgeklebt und hält den Deckel des Kamerasystem durch drei Nippel. Die STL-Datei dafür findet man hier  [https://tinkercad.com/things/cV6rkY6DWvc PiCameraDome4addendum]&lt;br /&gt;
*ein Deckel des Kameradoms aus dem 3D-Drucker, wird auf die Rückseite aufgesteckt und beinhaltet zwei Halterungen für Mikrofone (die &amp;quot;Ohren&amp;quot; im Bild). Die STL-Datei dafür findet man hier [https://tinkercad.com/things/8X0fhiSTyXk PiCameraDome4back]&lt;br /&gt;
*9 x IR-LED [http://www.conrad.biz/ce/de/product/171140/IR-Emitter-940-nm-17-5-mm-radial-bedrahtet-Vishay-TSAL-6200 TSAL 6200] mit hoher Leistung &lt;br /&gt;
*3 Widerstände 10 Ohm 0,2 W.&lt;br /&gt;
&lt;br /&gt;
[[File:Dome1.jpg|400x300px]][[File:Dome2.jpg|400x300px]][[File:Doorpi_dome3s.jpg|400x300px]][[File:Doorpi_dome4s.jpg|600x300px]]&lt;br /&gt;
&lt;br /&gt;
Zur Montage werden vier M2-Gewindebolzen in die hintere Aussparung des Kameradoms eingeklebt, und auf diese mit entsprechenden Abstandshaltern und Muttern sowohl die Kamera, als auch die eine Hälfte der Kabelverlängerung geschraubt. Dabei empfiehlt es sich, die LED vorher an Ort und Stelle zu haben - ggf.  muss bei ungünstiger Klebung der Gewindebolzen bei den Eck-LED ein Gehäusevorsprung etwas abgefeilt werden.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung der LED für dem Betrieb an einer Spannung von 5V ausgelegt - damit fließen durch drei in Reihe geschaltete LED und einen 10 Ohm-Widerstand ziemlich genau 100mA. Bei der Schaltung über einen MOSFET ist das etwas weniger, wegen des Drain-Source-Widerstandes des MOSFET, reicht aber für die notwendige Helligkeit aus. Aus Symmetriegründen werden drei solche Stränge (insgesamt 9 LED) montiert - aber nur 8 davon sind bei dem angegebenen Kameradom nach außen gerichtet (wer möchte, kann gerne ein 3D-Design mit 9 Löchern erstellen), eine LED zeigt also nutzlos nach innen (erkennbar im 3. Bild der obigen Reihe).&lt;br /&gt;
&lt;br /&gt;
Das Fischaugenobjektiv wird mit wenig (!) klarem Silikon in die vordere Öffnung des Kameradoms geklebt, der rückwärtige Aufsatz mit den 3 Nippeln mit Zweikomponentenkleber auf der Rückseite des Kameradoms befestigt. Dabei zur Ausrichtung den Mikrofonhalter (rechtes Bild, mit den &amp;quot;Ohren&amp;quot;) probeweise aufstecken.&lt;br /&gt;
&lt;br /&gt;
Die Acrylglaskuppel wird mit Silikon oder einem äquivalenten Dichtmaterial wasserdicht in die Frontplatte eingesetzt, auf diese dann von hinten der Kameradom. Eine staubdichte Verbindung erfordert auch hier die Abdichtung mit Silikon. Für den Fall einer möglichen Demontage empfiehlt es sich, diese Abdichtung nicht als Klebung zu verwenden, sondern als umlaufenden Rand nachträglich aufzubringen - der ist dann einfach mit einem Cutter zu entfernen.&lt;br /&gt;
&lt;br /&gt;
==Audio-Subsystem==&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
Der [http://www.elv.de/bewegungsmeldermodul-pir-13.html Bewegungsmelder] ist ein sehr kleines Modul, das einfach von hinten in eine Bohrung der Frontplatte gesteckt wird. Sein Open-Collector-Ausgang wird über eine der vier unbenutzen Adern (blau) des HDMI-Kabels an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
Der Helligkeitssensor besteht aus einem Fototransistor und zwei festen und einem einstellbaren Widerstand. Seine Ausgangsspannung wird an den Arduino weitergeleitet, der auf Grund dieses Wertes das Display und den LED-Ring des Klingelknopfes dimmt.&lt;br /&gt;
&lt;br /&gt;
Als [https://www.amazon.de/gp/product/B01DKTHDXE​ Klingelknopf] wird ein Modell aus Edelstahl mit umlaufendem LED-Ring verwendet, &lt;br /&gt;
&lt;br /&gt;
Der Sabotagekontakt besteht aus einem Mikroschalter, der so in die Rückwandinstallation geklebt wird, dass er bei der Abnahme der Frontplatte geschlossen wird. Dieses Signal wird über eine der unbenutzten Adern des HDMI-Kabels (orange im Bild) an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
[[File:DoorPi_part1.png|500x350px]][[File:doorpi_sensorss.jpg|800x350px]]&lt;br /&gt;
&lt;br /&gt;
==Frontplatte==&lt;br /&gt;
Die Frontplatte besteht aus 4 mm starken Aluminium, eloxiert und auf 1/10 mm genau mit den passenden Bohrungen und Ausschnitten sowie rückseitig angeschweißten Gewindebolzen versehen. Online bestellbar z.B. bei der Schaeffer AG, für das vorliegende Exemplar wurden ca. 115 € in Rechnung gestellt. Auf Grund ihrer Stabilität dient diese Frontplatte als Baugruppenträger für die Außeninstallation.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_front.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Rückwandinstallation==&lt;br /&gt;
Die Rückwandinstallation, die in des Mauerwerk eingelassen wird, kommt ebenfalls aus dem 3D-Drucker. Sie besteht aus drei Teilen mit unterschiedlicher Tiefe, um das Loch im Mauerwerk nicht zu groß werden zu lassen. Das obere und das untere Teil enthalten jeweils zwei stabile Vorsprünge mit Aussparungen, in die eine normgerechte M4-Mutter von unten genau hineinpasst. Bemerkenswert ist, dass dieses Bauteil nicht mit einer konventionellen Methode (z.B. im Spritzgussverfahren) gefertigt werden kann.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_covertop.jpg]]&lt;br /&gt;
&lt;br /&gt;
Diese Muttern kommen damit genau hinter den äußeren Schraubenlöchern der Frontplatte zu liegen, Die Frontplatte kann dadurch mit vier (Sicherheits-)schrauben M4 passgenau auf die im Mauerwerk sitzende Rückwandinstallation geschraubt werden.&lt;br /&gt;
&lt;br /&gt;
Auf der Oberkante der drei Teile verläuft eine 1x1 mm² große Nut, in die eine Dichtung eingelegt werden kann.&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPMOD&amp;diff=13468</id>
		<title>HTTPMOD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPMOD&amp;diff=13468"/>
		<updated>2016-01-05T15:44:29Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Formatierung und Korrektur des Tables &amp;quot;Actor&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Extract information from devices with an HTTP interface (or, more generic, from any URL) or send information to such devices &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=HTTPMOD&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_HTTPMOD.pm&lt;br /&gt;
|ModOwner=StefanStrobel ({{Link2FU|3960|Forum}} / [[Benutzer:StefanStrobel|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
HTTPMOD provides a generic way to retrieve information from devices with an HTTP Interface and store them in Readings or send information to such devices. It queries a given URL with Headers and data defined by attributes. &lt;br /&gt;
&lt;br /&gt;
From the HTTP response it extracts readings named in attributes using Regexes, JSON or XPath parsing also defined by attributes.&lt;br /&gt;
&lt;br /&gt;
In an advanced [[Konfiguration|configuration]] the module can also send information to devices. To do this, a generic &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; option can be configured using attributes. &lt;br /&gt;
&lt;br /&gt;
== Availability == &lt;br /&gt;
{{Randnotiz|RNText=An extended / modified version of this module that among other features adds XPath and JSON support is currently under development. &lt;br /&gt;
If you want to participate in early tests, please follow this {{Link2Forum|Topic=45176|LinkText=discussion thread}} in FHEM forum.&lt;br /&gt;
This page has already been updated to describe most of the new features. So if you need one of the new features described here and yout HTTPMOD is still the old version, load the new module &lt;br /&gt;
from the forum and help testing&lt;br /&gt;
}}&lt;br /&gt;
The module is part of the regular FHEM distribution.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
This module uses the non blocking HTTP function &amp;lt;code&amp;gt;HttpUtils_NonblockingGet&amp;lt;/code&amp;gt; provided by FHEM&#039;s [[HttpUtils]] in a new version published in December 2013.&lt;br /&gt;
If not already installed in your environment, please [[update]] FHEM or install it manually using appropriate commands from your environment.&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; HTTPMOD &amp;lt;URL&amp;gt; &amp;lt;Interval&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The module connects to the given &amp;lt;code&amp;gt;URL&amp;lt;/code&amp;gt; every &amp;lt;code&amp;gt;Interval&amp;lt;/code&amp;gt; seconds, sends optional headers and data and then parses the response with regular expressions, xpath or json to set readings.&lt;br /&gt;
&lt;br /&gt;
URL can be &amp;quot;none&amp;quot; and Interval can be 0 if you prefer to only query data with a get command and not in a defined interval.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define PM HTTPMOD http://MyPoolManager/cgi-bin/webgui.fcgi 60&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Commands ==&lt;br /&gt;
can be defined using attributes, see advanced configuration&lt;br /&gt;
&lt;br /&gt;
If you set the attribute enableControlSet to 1, the following additional built in set commands are available:&lt;br /&gt;
;interval&lt;br /&gt;
:set new interval time in seconds and restart the timer&lt;br /&gt;
;reread&lt;br /&gt;
:request the defined URL and try to parse it just like the automatic update would do it every Interval seconds without modifying the running timer.&lt;br /&gt;
;stop&lt;br /&gt;
:stop interval timer.&lt;br /&gt;
;start&lt;br /&gt;
:restart interval timer to call GetUpdate after interval seconds&lt;br /&gt;
&lt;br /&gt;
== Get-Commands ==&lt;br /&gt;
can be defined using attributes, see advanced configuration&lt;br /&gt;
&lt;br /&gt;
== simple Attributes ==&lt;br /&gt;
;do_not_notify&lt;br /&gt;
&lt;br /&gt;
;readingFnAttributes&lt;br /&gt;
&lt;br /&gt;
;requestHeader.* &lt;br /&gt;
:Define an additional HTTP Header to set in the HTTP request&lt;br /&gt;
&lt;br /&gt;
;requestData&lt;br /&gt;
:POST Data to be sent in the request. If not defined, it will be a GET request as defined in HttpUtils used by this module&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+(-[0-9]+)?Name&lt;br /&gt;
:the name of a reading to extract with the corresponding readingRegex&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Expr&lt;br /&gt;
:defines an expression that is used in an eval to compute the readings value. The raw value will be in the variable $val.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Map&lt;br /&gt;
:defines a mapping from raw to visible values like &amp;quot;0:mittig, 1:oberhalb, 2:unterhalb&amp;quot;. If specified as readingMap then the attribute value is a default for all other readings that don&#039;t specify an explicit reading[0-9]*Map.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Format&lt;br /&gt;
:Defines a format string that will be used in sprintf to format a reading value. If specified as readingFormat then the attribute value is a default for all other readings that don&#039;t specify an explicit reading[0-9]*Format.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Decode&lt;br /&gt;
:defines an encoding to be used in a call to the perl function decode to convert the raw data string read from the device to a reading. This can be used if the device delivers strings in an encoding like cp850 instead of utf8.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Encode&lt;br /&gt;
:defines an encoding to be used in a call to the perl function encode to convert the raw data string read from the device to a reading. This can be used if the device delivers strings in an encoding like cp850 and after decoding it you want to reencode it to e.g. utf8.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+Regex&lt;br /&gt;
:defines the regex to be used for extracting the reading. The value to extract should be in a sub expression e.g. ([\d\.]+) in the above example&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+Regex&lt;br /&gt;
:defines the regex to be used for extracting the reading. The value to extract should be in a capture group / sub expression &lt;br /&gt;
:e.g. ([\d\.]+) in the above example. Multiple capture groups will create multiple readings (see explanation above)&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+XPath&lt;br /&gt;
:defines an xpath to one or more readings when parsing HTML data (see examples below)&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+XPath-Strict&lt;br /&gt;
:defines an xpath to one or more readings when parsing XML data (see examples below)&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+JSON&lt;br /&gt;
:defines a path to the JSON object wanted by concatenating the object names with an underscore as delimiter (see the example below)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;noShutdown&lt;br /&gt;
:pass the noshutdown flag to HTTPUtils for webservers that need it (some embedded webservers only deliver empty pages otherwise)&lt;br /&gt;
&lt;br /&gt;
;disable&lt;br /&gt;
:stop doing automatic HTTP requests while this attribute is set to 1&lt;br /&gt;
&lt;br /&gt;
;timeout&lt;br /&gt;
:time in seconds to wait for an answer. Default value is 2&lt;br /&gt;
&lt;br /&gt;
;enableControlSet&lt;br /&gt;
:enables the built in set commands interval, stop, start, reread&lt;br /&gt;
&lt;br /&gt;
;(get|reading)[0-9]*RecombineExpr&lt;br /&gt;
:defines an expression that is used in an eval to compute one reading value out of the list of matches. &lt;br /&gt;
:This is supposed to be used for regexes or xpath specifications that produce multiple results if only one result that combines them is wanted. &lt;br /&gt;
:The list of matches will be in the variable @matchlist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== simple Configuration of HTTP Devices ==&lt;br /&gt;
If your device expects special HTTP-headers then specify them as &amp;lt;code&amp;gt;attr requestHeader1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;attr requestHeaderX&amp;lt;/code&amp;gt;.&lt;br /&gt;
If your Device expects an HTTP POST instead of HTTP GET then the POST-data can be specified as &amp;lt;code&amp;gt;attr requestData&amp;lt;/code&amp;gt;.&lt;br /&gt;
To get the readings, specify pairs of &amp;lt;code&amp;gt;attr readingXName&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr readingXRegex&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;attr readingXXPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;attr readingXXPath-Strict&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;attr readingXJSON&amp;lt;/code&amp;gt; to define which readings you want to extract from the HTTP response and how to extract them. (The old syntax &amp;lt;code&amp;gt;attr readingsNameX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr readingsRegexX&amp;lt;/code&amp;gt; is still supported but the new one with &amp;lt;code&amp;gt;attr readingXName&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr readingXRegex&amp;lt;/code&amp;gt; should be preferred. The actual values to be extracted have to be sub expressions within () in the regex (see example below)&lt;br /&gt;
&lt;br /&gt;
=== Example for a PoolManager 5: ===&lt;br /&gt;
The PoolManager Web GUI can be queried with HTTP POST Requests like this one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
POST /cgi-bin/webgui.fcgi HTTP/1.1&lt;br /&gt;
Host: 192.168.70.90&lt;br /&gt;
Accept: */*&lt;br /&gt;
Content-Type: application/json;charset=UTF-8&lt;br /&gt;
Content-Length: 60&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;get&amp;quot; :[&amp;quot;34.4001.value&amp;quot; ,&amp;quot;34.4008.value&amp;quot; ,&amp;quot;34.4033.value&amp;quot;]}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The resulting HTTP Response would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-type: application/json; charset=UTF-8&lt;br /&gt;
Expires: 0&lt;br /&gt;
Cache-Control: no-cache&lt;br /&gt;
Date: Sun, 12 Jan 2014 12:23:11 GMT&lt;br /&gt;
Server: lighttpd/1.4.26&lt;br /&gt;
Content-Length: 179&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;data&amp;quot;:	{&lt;br /&gt;
		&amp;quot;34.4001.value&amp;quot;:	&amp;quot;7.00&amp;quot;,&lt;br /&gt;
		&amp;quot;34.4008.value&amp;quot;:	&amp;quot;0.52&amp;quot;,&lt;br /&gt;
		&amp;quot;34.4033.value&amp;quot;:	&amp;quot;24.8&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;status&amp;quot;:	{&lt;br /&gt;
		&amp;quot;code&amp;quot;:	0&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;event&amp;quot;:	{&lt;br /&gt;
		&amp;quot;type&amp;quot;:	1,&lt;br /&gt;
		&amp;quot;data&amp;quot;:	&amp;quot;48.30000.0&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To configure HTTPMOD for a PoolManager one would first define a PoolManager device with e.g. the name PM, the URL and an interval of e.g. 60 seconds. &lt;br /&gt;
&lt;br /&gt;
Then the data to be sent in the request needs to be defined because in this example the device expects a POST request so the query is not contained in the URL but in the request data.&lt;br /&gt;
&lt;br /&gt;
Also as seen above the device expects special HTTP headers in the request so these headers also need to be defined as &amp;lt;code&amp;gt;attr PM requestHeader1&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr PM requestHeader2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then the names of the readings to be extracted would be set with attributes&lt;br /&gt;
&lt;br /&gt;
Then for each reading value to be extracted a regular expression needs to be set that will match the value in question within ().&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define PM HTTPMOD http://MyPoolManager/cgi-bin/webgui.fcgi 60&lt;br /&gt;
attr PM reading01Name PH&lt;br /&gt;
attr PM reading01Regex 34.4001.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr PM reading02Name CL&lt;br /&gt;
attr PM reading02Regex 34.4008.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr PM reading03Name3TEMP&lt;br /&gt;
attr PM reading03Regex 34.4033.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr PM requestData {&amp;quot;get&amp;quot; :[&amp;quot;34.4001.value&amp;quot; ,&amp;quot;34.4008.value&amp;quot; ,&amp;quot;34.4033.value&amp;quot;, &amp;quot;14.16601.value&amp;quot;, &amp;quot;14.16602.value&amp;quot;]}&lt;br /&gt;
attr PM requestHeader1 Content-Type: application/json&lt;br /&gt;
attr PM requestHeader2 Accept: */*&lt;br /&gt;
attr PM stateFormat {sprintf(&amp;quot;%.1f Grad, PH %.1f, %.1f mg/l Chlor&amp;quot;, ReadingsVal($name,&amp;quot;TEMP&amp;quot;,0), ReadingsVal($name,&amp;quot;PH&amp;quot;,0), ReadingsVal($name,&amp;quot;CL&amp;quot;,0))}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example for AmbientMonitor ===&lt;br /&gt;
AmbientMonitor is a webbased visualisation for sensors connected to an Arduino device. Its web interface can also be queried with HTTMOD to grab the data into readings.&lt;br /&gt;
&lt;br /&gt;
This example was provided by locutus. The hardware configuration is an Arduino + Ethercard with ENC28J60 Controller + DHT22 Sensor and software can be downloaded from https://github.com/lucadentella/AmbientMonitor&lt;br /&gt;
&lt;br /&gt;
In this example an HTTP GET is sufficent, so no &amp;lt;code&amp;gt;requestData&amp;lt;/code&amp;gt; is needed. The device provides temperature and humidity readings in an HTTP response that looks like:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.0 200 OK &lt;br /&gt;
Content-Type: text/html &lt;br /&gt;
&lt;br /&gt;
myCB({&#039;temperature&#039;:22.00,&#039;humidity&#039;:46.00})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the definition could be:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define AmbientMonitor HTTPMOD http://192.168.1.221/?callback=? 300&lt;br /&gt;
attr AmbientMonitor requestHeader Content-Type: application/json&lt;br /&gt;
attr AmbientMonitor reading1Name Temperatur&lt;br /&gt;
attr AmbientMonitor reading1Regex temperature&#039;:([\d\.]+)&lt;br /&gt;
attr AmbientMonitor reading2Name Feuchtigkeit&lt;br /&gt;
attr AmbientMonitor reading2Regex humidity&#039;:([\d\.]+)&lt;br /&gt;
attr AmbientMonitor stateFormat {sprintf(&amp;quot;Temperatur %.1f C, Feuchtigkeit %.1f %&amp;quot;, ReadingsVal($name,&amp;quot;Temperatur&amp;quot;,0), ReadingsVal($name,&amp;quot;Feuchtigkeit&amp;quot;,0))}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== formating and manipulating values / readings ==&lt;br /&gt;
Values that are parsed from an HTTP response can be further treated or formatted with the following attributes:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?Expr&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?Map&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?Format&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?Decode&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?Encode&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
They can all be specified for an individual reading, for all readings in one match (e.g. if a regular expression has several capture groups)or for all readings in a get command (defined by getXX) or for all readings in the main reading list (defined by readingXX):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
reading01Format %.1f&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will format the reading with the name specified by the attribute reading01Name to be numerical with one digit after the decimal point.&lt;br /&gt;
If the attribute reading01Regex is used and contains several capture groups then the format will be applied to all readings thet are parsed by this regex unless these readings have their own format specified by reading01-1Format, reading01-2Format and so on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
reading01-2Format %.1f&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can be used in cases where a regular expression specified as reading1regex contains several capture groups or an xpath specified as reading01XPath creates several readings. &lt;br /&gt;
In this case reading01-2Format specifies the format to be applied to the second match.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingFormat %.1f&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
applies to all readings defined by a reading-Attribute that have no more specific format.&lt;br /&gt;
&lt;br /&gt;
If you need to do some calculation on a raw value before it is used as a reading, you can define the attribute &amp;lt;code&amp;gt;readingExpr&amp;lt;/code&amp;gt;.&lt;br /&gt;
It defines a Perl expression that is used in an eval to compute the readings value. The raw value will be in the variable $val.&lt;br /&gt;
&lt;br /&gt;
=== Example: ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM reading03Expr $val * 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Just like in the above example of the readingFormat attributes, readingExpr and the other following attributes can be applied on several levels.&lt;br /&gt;
&lt;br /&gt;
To map a numerical value to a name, you can use the readingMap attribute. &lt;br /&gt;
It defines a mapping from raw to visible values like &amp;quot;0:mittig, 1:oberhalb, 2:unterhalb&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example: ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM reading02-3Map 0:kalt, 1:warm, 2:sehr warm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To convert character sets, the module can first decode a string read from the device and then encode it again. For example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM getDecode UTF-8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This applies to all readings defined for Get-Commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Some help with Regular Expressions ==&lt;br /&gt;
If HTTPMOD seems not to work and the FHEM Logfile contains a message like  &lt;br /&gt;
:&amp;lt;code&amp;gt;HTTPMOD: Response didn&#039;t match Reading ...&amp;lt;/code&amp;gt;&lt;br /&gt;
then you should check if the value you want to extract is read into the internal with the name buf. Internals are visible when you click on the defined HTTPMOD Device. buf is an internal variable that contains the HTTP Response read. If the value is there and you get the mentioned message then probably something is wrong with your regular expression. If you are new to regular expressions then the introduction at http://perldoc.perl.org/perlretut.html might be helpful. &lt;br /&gt;
&lt;br /&gt;
For a typical HTTPMOD use case where you want to extract a number out of a HTTP-Response you can use something like &amp;lt;code&amp;gt;[\d\.]+&amp;lt;/code&amp;gt; to match the number itself. The expression matches the number characters (&amp;lt;code&amp;gt;\d&amp;lt;/code&amp;gt;) or a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; if one of these characters occurs at least once. &lt;br /&gt;
&lt;br /&gt;
To tell HTTPMOD that the number is what you want to use for the reading, you have to put the expression in between &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. A &amp;lt;code&amp;gt;([\d\.]+)&amp;lt;/code&amp;gt; alone would match the longest number in the HTTP Response which is very likely not the number you are looking for so you need to add something to the expression to give it a context and define how to find the number that you are looking for.&lt;br /&gt;
if there is a title text before the number or a special text after the number you can put this in the regex. In one of the examples above &amp;lt;code&amp;gt;humidity&#039;:([\d\.]+)&amp;lt;/code&amp;gt; is looking for the number that immediately follows the text &amp;lt;code&amp;gt;humidity&#039;:&amp;lt;/code&amp;gt; without any blanks in between.&lt;br /&gt;
&lt;br /&gt;
=== Regular Expressions with multiple capture Groups ===&lt;br /&gt;
The regular expressions used in the above example for a Poolmanager will take the value that matches one capture group. This is the part of the regular expression inside (). In the above example &amp;quot;([\d\.]+)&amp;quot; refers to numerical digits or points between double quotation marks. Only the string consiting of digits and points will match inside (). This piece is assigned to the reading.&lt;br /&gt;
        &lt;br /&gt;
You can also use regular expressions that have several capture groups which might be helpful when parsing tables. In this case an attribute like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
reading02Regex something[ \t]+([\d\.]+)[ \t]+([\d\.]+)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
could match two numbers. When you specify only one reading02Name like &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
reading02Name Temp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the name Temp will be used with the extension -1 and -2 thus giving a reading Temp-1 for the first number and Temp-2 for the second. You can also specify individual names for several readings that get parsed from one regular expression with several capture groups by defining attributes &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
reading02-1Name&lt;br /&gt;
reading02-2Name&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The same notation can be used for formatting attributes like readingXMap, readingXFormat and so on.&lt;br /&gt;
&lt;br /&gt;
The usual way to define readings is however to have an individual regular expression with just one capture group per reading as shown in the above example.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parsing JSON ==&lt;br /&gt;
    &lt;br /&gt;
If a webservice delivers data in JSON format, HTTPMOD can directly parse JSON which might be easier in this case than definig regular expressions.&lt;br /&gt;
The next example shows the data that can be requested from a Poolmanager with the following partial configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define test2 HTTPMOD none 0&lt;br /&gt;
attr test2 get01Name Chlor&lt;br /&gt;
attr test2 getURL http://192.168.70.90/cgi-bin/webgui.fcgi&lt;br /&gt;
attr test2 getHeader1 Content-Type: application/json&lt;br /&gt;
attr test2 getHeader2 Accept: */*&lt;br /&gt;
attr test2 getData {&amp;quot;get&amp;quot; :[&amp;quot;34.4008.value&amp;quot;]}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The data in the HTTP response looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;data&amp;quot;: {&lt;br /&gt;
			&amp;quot;34.4008.value&amp;quot;: &amp;quot;0.25&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;status&amp;quot;:       {&lt;br /&gt;
			&amp;quot;code&amp;quot;: 0&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;event&amp;quot;:        {&lt;br /&gt;
			&amp;quot;type&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;data&amp;quot;: &amp;quot;48.30000.0&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the classic way to extract the value 0.25 into a reading with the name Chlor with a regex would have been&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr test2 get01Regex 34.4008.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with JSON you can write &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr test2 get01JSON data_34.4008.value &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or if you don&#039;t care about the naming of your readings, you can simply extract all JSON data with &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr test2 extractAllJSON&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which would apply to all data read from this device and create the following readings out of the HTTP response shown above:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| data_34.4008.value || 0.25&lt;br /&gt;
|-&lt;br /&gt;
| event_data || 48.30000.0&lt;br /&gt;
|-&lt;br /&gt;
| event_type || 1&lt;br /&gt;
|-&lt;br /&gt;
| status_code || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
or you can specify&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr test2 get01ExtractAllJSON&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
which would only apply to all data read as response to the get command defined as get01.        &lt;br /&gt;
&lt;br /&gt;
== Parsing http / XML using xpath ==&lt;br /&gt;
Another alternative to regex parsing is the use of XPath to extract values from HTTP responses.&lt;br /&gt;
The following example shows how XML data can be parsed with XPath-Strict or HTML Data can be parsed with XPath.&lt;br /&gt;
Both work similar and the example uses XML Data parsed with the XPath-Strict option:&lt;br /&gt;
&lt;br /&gt;
If The XML data in the HTTP response looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;root xmlns:foo=&amp;quot;http://www.foo.org/&amp;quot; xmlns:bar=&amp;quot;http://www.bar.org&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;actors&amp;gt;&lt;br /&gt;
		&amp;lt;actor id=&amp;quot;1&amp;quot;&amp;gt;Peter X&amp;lt;/actor&amp;gt;&lt;br /&gt;
		&amp;lt;actor id=&amp;quot;2&amp;quot;&amp;gt;Charles Y&amp;lt;/actor&amp;gt;&lt;br /&gt;
		&amp;lt;actor id=&amp;quot;3&amp;quot;&amp;gt;John Doe&amp;lt;/actor&amp;gt;&lt;br /&gt;
	&amp;lt;/actor&amp;gt;&lt;br /&gt;
&amp;lt;/root&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with XPath you can write        &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr htest reading01Name Actor&lt;br /&gt;
attr htest reading01XPath-Strict //actor[2]/text()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a reading with the Name &amp;quot;Actor&amp;quot; and the value &amp;quot;Charles Y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since XPath specifications can define several values / matches, HTTPMOD can also interpret these and store them in multiple readings:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr htest reading01Name Actor&lt;br /&gt;
attr htest reading01XPath-Strict //actor/text()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will create the readings &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| Actor-1 || Peter X&lt;br /&gt;
|-&lt;br /&gt;
| Actor-2 || Charles Y&lt;br /&gt;
|-&lt;br /&gt;
| Actor-3 || John Doe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Further replacements of URL, header or post data ==&lt;br /&gt;
sometimes it might be helpful to dynamically change parts of a URL, HTTP header or post data depending on existing readings, internals or &lt;br /&gt;
perl expressions at runtime. This might be needed to pass further variables to a server, a current date or other things. &lt;br /&gt;
&lt;br /&gt;
To support this HTTPMOD offers generic replacements that are applied to a request before it is sent to the server. A replacement can be defined with the attributes &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;replacement[0-9]*Regex&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;[gs]et[0-9]*Replacement[0-9]*Value&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a replacement always replaces a match of a regular expression. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;replacement[0-9]*Mode:&#039;&#039;&#039;&lt;br /&gt;
The way the replacement value is defined can be specified with the replacement mode.&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;reading&amp;lt;/code&amp;gt;, then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is interpreted as the name of a &#039;&#039;reading&#039;&#039; of the same device or as &#039;&#039;device:reading&#039;&#039; to refer to another device.&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;internal&amp;lt;/code&amp;gt;, then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is interpreted as the name of an &#039;&#039;internal&#039;&#039; of the same device or as &#039;&#039;device:internal&#039;&#039; to refer to another device.&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is interpreted as a static text&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; , then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is evaluated as a perl expression to compute the replacement. Inside such a replacement expression it is possible to refer to capture groups of the replacement regex.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr mydevice getData {&amp;quot;get&amp;quot; :[&amp;quot;%%value%%.value&amp;quot;]}&lt;br /&gt;
attr mydevice replacement01Mode text&lt;br /&gt;
attr mydevice replacement01Regex %%value%%&lt;br /&gt;
&lt;br /&gt;
attr mydevice get01Name Chlor&lt;br /&gt;
attr mydevice get01Replacement01Value 34.4008&lt;br /&gt;
&lt;br /&gt;
attr mydevice get02Name Something&lt;br /&gt;
attr mydevice get02Replacement01Value 31.4024&lt;br /&gt;
&amp;lt;/source&amp;gt;        &lt;br /&gt;
&lt;br /&gt;
defines that &amp;lt;code&amp;gt;%%value%%&amp;lt;/code&amp;gt; will be replaced by a static text.&lt;br /&gt;
&lt;br /&gt;
All Get commands will be HTTP post requests of a similar form. Only the &amp;lt;code&amp;gt;%%value%%&amp;lt;/code&amp;gt; will be different from get to get.&lt;br /&gt;
The first get will set the reading named Chlor and for the request it will take the generic getData and replace %%value%% with 34.4008.&lt;br /&gt;
A second get will look the same except a different name and replacement value.&lt;br /&gt;
&lt;br /&gt;
The mode expression allows you to define your own replacement syntax:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;        &lt;br /&gt;
attr mydevice replacement01Mode expression&lt;br /&gt;
attr mydevice replacement01Regex {{([^}]+)}}&lt;br /&gt;
attr mydevice replacement01Value ReadingsVal(&amp;quot;mydevice&amp;quot;, $1, &amp;quot;&amp;quot;)&lt;br /&gt;
attr mydevice getData {&amp;quot;get&amp;quot; :[&amp;quot;{{temp}}.value&amp;quot;]}&lt;br /&gt;
&amp;lt;/source&amp;gt;      &lt;br /&gt;
&lt;br /&gt;
In this example any &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{name}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in a URL, header or post data will be passed on to the perl function ReadingsVal &lt;br /&gt;
which uses the string between &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; as second parameter. This way one defined replacement can be used for many different&lt;br /&gt;
readings.&lt;br /&gt;
&lt;br /&gt;
== replacing reading values when they have not been updated / the device did not respond ==&lt;br /&gt;
If a device does not respond then the values stored in readings will keep the same and only their timestamp shows that they are outdated. &lt;br /&gt;
If you want to modify reading values that have not been updated for a number of seconds, you can use the attributes&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?MaxAge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?MaxAgeReplacementMode&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;(reading|get)[0-9]*(-[0-9]+)?MaxAgeReplacement&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every time the module tries to read from a device, it will also check if readings have not been updated &lt;br /&gt;
for longer than the &amp;lt;code&amp;gt;MaxAge&amp;lt;/code&amp;gt; attributes allow. If readings are outdated, the &amp;lt;code&amp;gt;MaxAgeReplacementMode&amp;lt;/code&amp;gt; defines how the affected&lt;br /&gt;
reading values should be replaced. &amp;lt;code&amp;gt;MaxAgeReplacementMode&amp;lt;/code&amp;gt; can be &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MaxAge&amp;lt;/code&amp;gt; specifies the number of seconds that a reading should remain untouched before it is replaced. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MaxAgeReplacement&amp;lt;/code&amp;gt; contains either a static text that is used as replacement value or a Perl expression that is evaluated to &lt;br /&gt;
give the replacement value. This can be used for example to replace a temperature that has not bee updated for more than 5 minutes &lt;br /&gt;
with the string &amp;quot;outdated - was 12&amp;quot;:        &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM readingMaxAge 300&lt;br /&gt;
attr PM readingMaxAgeReplacement &amp;quot;outdated - was &amp;quot; . $val&lt;br /&gt;
attr PM readingMaxAgeReplacementMode expression&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The variable &amp;lt;code&amp;gt;$val&amp;lt;/code&amp;gt; contains the value of the reading before it became outdated.&lt;br /&gt;
&lt;br /&gt;
Or to show that a device was offline:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MyLight reading01Name color&lt;br /&gt;
attr MyLight reading01JSON result_02_color&lt;br /&gt;
attr MyLight reading01MaxAge 300&lt;br /&gt;
attr MyLight reading01MaxAgeReplacement &amp;quot;offline&amp;quot;&lt;br /&gt;
attr MyLight reading01MaxAgeReplacementMode text&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
If you don&#039;t know which URLs, headers or POST data your web GUI uses, you might try a local proxy like BurpSuite [http://portswigger.net/burp/ BurpSuite] to track requests and responses&lt;br /&gt;
&lt;br /&gt;
== Advanced configuration to define a &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; and send data to a device ==&lt;br /&gt;
       &lt;br /&gt;
When a set option is defined by attributes, the module will use the value given to the set command and integrate it into an HTTP-Request that sends the value to the device. The definitions for URL, headers and post data can contain the placeholder $val which will be replaced by the value given to the set command.&lt;br /&gt;
&lt;br /&gt;
This can be as simple as:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
# No cyclic requests and no main URL needed in this example&lt;br /&gt;
define MyDevice none 0&lt;br /&gt;
&lt;br /&gt;
attr MyDevice set01Name Licht&lt;br /&gt;
attr MyDevice set01URL http://192.168.1.22/switch=$val&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user command &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set MyDevice Licht 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will be translated into the http GET request&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
http://192.168.1.22/switch=1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example a map would also be helpful, that translates on / off to 0 or 1 and allows the user to select on/of in fhemweb:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MyDevive set01Map 0:off, 1:on&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This also provides input validation to make sure that only on and off can be used with the set command.&lt;br /&gt;
&lt;br /&gt;
In more complex Scenarios you might need to login before sending a command and the Login might create a session id that has to be part of further requests either in the URL, in headers or in the post data.&lt;br /&gt;
&lt;br /&gt;
Extension to the above example for a PoolManager 5 where a set needs a session id in the URL and the values have to be passed in JSON strings as post data:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM set01Name HeizungSoll&lt;br /&gt;
attr PM set01URL http://MyPoolManager/cgi-bin/webgui.fcgi?sid=$sid&lt;br /&gt;
attr PM set01Hint 6,10,20,30&lt;br /&gt;
attr PM set01Min 6&lt;br /&gt;
attr PM set01Max 30&lt;br /&gt;
attr PM setHeader1 Content-Type: application/json&lt;br /&gt;
attr PM set01Data {&amp;quot;set&amp;quot; :{&amp;quot;34.3118.value&amp;quot; :&amp;quot;$val&amp;quot; }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example defines a set option with the name HeizungSoll.&lt;br /&gt;
By issuing &amp;lt;code&amp;gt;set PM HeizungSoll 10&amp;lt;/code&amp;gt; in FHEM, the value 10 will be sent in the defined HTTP&lt;br /&gt;
Post to URL &amp;lt;code&amp;gt;http://MyPoolManager/cgi-bin/webgui.fcgi&amp;lt;/code&amp;gt; in the Post Data as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;set&amp;quot; :{&amp;quot;34.3118.value&amp;quot; :&amp;quot;10&amp;quot; }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optional attributes set01Min and set01Max define input validations that will be checked in the set function. &lt;br /&gt;
The optional attribute set01Hint will define a selection list for the Fhemweb GUI.&lt;br /&gt;
&lt;br /&gt;
If a parameter to a set command is not numeric but should be passed on to the device as text, then you can specify the attribute setTextArg. For example: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM set01TextArg&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a set command should not require a parameter at all, then you can specify the attribute NoArg. For example: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM set03Name On&lt;br /&gt;
attr PM set03NoArg&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced configuration to create a valid session id that might be necessary in set options ===&lt;br /&gt;
In simple cases logging in works with basic authentication. In the case HTTPMOD accepts a username and password as part of the URL in the form &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
http://User:Password@192.168.1.18/something&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However basic auth is seldom used. If you need to fill in a username and password in a HTML form and the session is then managed by a session id, here is how to configure this:&lt;br /&gt;
&lt;br /&gt;
when sending data to an HTTP-Device in a set, HTTPMOD will replace any &amp;lt;code&amp;gt;$sid&amp;lt;/code&amp;gt; in the URL, Headers and Post data with the internal &amp;lt;code&amp;gt;$hash-&amp;gt;{sid}&amp;lt;/code&amp;gt;. To authenticate towards the device and give this internal a value, you can use an optional multi step login procedure defined by the following attributes: &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sid[0-9]*URL&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sid[0-9]*IDRegex&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sid[0-9]*Data.*&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sid[0-9]*Header.*&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sid[0-9]*IgnoreRedirects&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each step can have a URL, Headers, Post Data pieces and a Regex to extract a resulting Session ID into &amp;lt;code&amp;gt;$hash-&amp;gt;{sid}&amp;lt;/code&amp;gt;.&lt;br /&gt;
HTTPMOD will create a sorted list of steps (the numbers between sid and URL / Data / Header) and the loop through these steps and send the corresponding requests to the device. For each step a $sid in a Header or Post Data will be replaced with the current content of &amp;lt;code&amp;gt;$hash-&amp;gt;{sid}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Using this feature, HTTPMOD can perform a forms based authentication and send user name, password or other necessary data to the device and save the session id for further requests.&lt;br /&gt;
        &lt;br /&gt;
To determine when this login procedure is necessary, HTTPMOD will first try to do a set without doing the login procedure. If the Attribute ReAuthRegex is defined, it will then compare the HTTP Response to the set request with the regular expression from ReAuthRegex. If it matches, then a login is performed. The ReAuthRegex is meant to match the error page a device returns if authentication or reauthentication is required e.g. because a session timeout has expired.&lt;br /&gt;
        &lt;br /&gt;
If for one step not all of the URL, Data or Header Attributes are set, then HTTPMOD tries to use a &lt;br /&gt;
&amp;lt;code&amp;gt;sidURL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sidData.*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sidHeader.*&amp;lt;/code&amp;gt; Attribue (without the step number after sid). This way parts that are the same for all steps don&#039;t need to be defined redundantly.&lt;br /&gt;
&lt;br /&gt;
=== Example for a multi step login procedure: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr PM reAuthRegex /html/dummy_login.htm &lt;br /&gt;
attr PM sidURL http://192.168.70.90/cgi-bin/webgui.fcgi?sid=$sid&lt;br /&gt;
attr PM sidHeader1 Content-Type: application/json&lt;br /&gt;
attr PM sid1IDRegex wui.init\(&#039;([^&#039;]+)&#039;&lt;br /&gt;
attr PM sid2Data {&amp;quot;set&amp;quot; :{&amp;quot;9.17401.user&amp;quot; :&amp;quot;fhem&amp;quot; ,&amp;quot;9.17401.pass&amp;quot; :&amp;quot;password&amp;quot; }}&lt;br /&gt;
attr PM sid3Data {&amp;quot;set&amp;quot; :{&amp;quot;35.5062.value&amp;quot; :&amp;quot;128&amp;quot; }}&lt;br /&gt;
attr PM sid4Data {&amp;quot;set&amp;quot; :{&amp;quot;42.8026.code&amp;quot; :&amp;quot;pincode&amp;quot; }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case HTTPMOD detects that a login is necessary by looking for the pattern /html/dummy_login.htm in the HTTP response. &lt;br /&gt;
If it matches, it starts a login sequence. In the above example all steps request the same URL. In step 1 only the defined Header is sent in an HTTP get request. The response will contain a session id that is extraced with the regex wui.init\(&#039;([^&#039;]+)&#039;.&lt;br /&gt;
&lt;br /&gt;
In the next step this session id is sent in a post request to the same URL where tha post data contains a username and password. The a third and a fourth request follow that set a value and a code. The result will be a valid and authorized session id that can be used in other requests where $sid is part of a URL, header or post data and will be replaced with the session id extracted above.&lt;br /&gt;
&lt;br /&gt;
== Advanced configuration to define a &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; and request additional data with its own request from a device ==&lt;br /&gt;
&lt;br /&gt;
The normal automatic HTTP request that is done repeatedly after the defined interval has elapsed works well in cases where all required readings can be requested in one common HTTP request. If however a device needs individual requests with different URLs or different POST data for each value, then another method is necessary. &lt;br /&gt;
For such cases a &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; option can be defined and the user can either issue Fhem &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; commands each time he needs the reading or the user can set an attribute to request the reading automatically together with the normal iteration.&lt;br /&gt;
For each &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; option attributes define an individual URL, optional headers, and post data as well as individual regular expressions and formatting options. &lt;br /&gt;
&lt;br /&gt;
Example for a Siemens webserver provided by Lanhydrock:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define ozw672 HTTPMOD https://192.168.178.8/api/auth/login.json?user=test&amp;amp;pwd=test 300&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get1Name tempAussen&lt;br /&gt;
attr ozw672 get1URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1960&lt;br /&gt;
attr ozw672 get1Poll 1&lt;br /&gt;
attr ozw672 get1PollDelay 1800&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get2Name tempAussenGemischt&lt;br /&gt;
attr ozw672 get2URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1964&lt;br /&gt;
attr ozw672 get2Poll 1&lt;br /&gt;
attr ozw672 get2PollDelay 1800&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get3Name tempTWW&lt;br /&gt;
attr ozw672 get3URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1996&lt;br /&gt;
attr ozw672 get3Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get4Name tempKesselSoll&lt;br /&gt;
attr ozw672 get4URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1910&lt;br /&gt;
attr ozw672 get4Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get5Name tempKesselRuecklauf&lt;br /&gt;
attr ozw672 get5URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1915&lt;br /&gt;
attr ozw672 get5Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get6Name tempKesselRuecklaufSoll&lt;br /&gt;
attr ozw672 get6URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1916&lt;br /&gt;
attr ozw672 get6Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get7Name anzahlStartsBrenner&lt;br /&gt;
attr ozw672 get7URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1927&lt;br /&gt;
attr ozw672 get7PollDelay 1800&lt;br /&gt;
attr ozw672 get7Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get8Name statusKessel&lt;br /&gt;
attr ozw672 get8URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1898&lt;br /&gt;
attr ozw672 get8Poll 1&lt;br /&gt;
attr ozw672 get8Regex Value&amp;quot;: &amp;quot;([a-zA-Zü ]*)&amp;quot;&lt;br /&gt;
attr ozw672 get8Map Aus:0, Nachlauf aktiv:5, Freigegeben für TWW:10, Freigegeben für HK:20, In Teillastbetrieb für TWW:40, In Teillastbetrieb für HK:50, In Betrieb für Trinkwasser:90, In Betrieb für Heizkreis:100&lt;br /&gt;
&lt;br /&gt;
attr ozw672 getRegex Value&amp;quot;: &amp;quot;[ ]*([-.0-9]*)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr ozw672 reAuthRegex .*session not valid.*&lt;br /&gt;
attr ozw672 sid1IDRegex .*&amp;quot;(.*-.*-.*-[0-9a-z]*).*&lt;br /&gt;
attr ozw672 sid1URL https://192.168.178.8/api/auth/login.json?user=test&amp;amp;pwd=test&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced attributes ===&lt;br /&gt;
&lt;br /&gt;
;ReAuthRegex&lt;br /&gt;
:regular Expression to match an error page indicating that a session has expired and a new authentication for read access needs to be done. &lt;br /&gt;
:This attribute only makes sense if you need a forms based authentication for reading data and if you specify a multi step login procedure based on the sid.. attributes.&lt;br /&gt;
:This attribute is used for all requests. For set and get operations you can however specify individual reAuthRegexes with the [gs]et[0-9]*ReAuthRegex attributes.&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*URL&lt;br /&gt;
:different URLs or one common URL to be used for each step of an optional login procedure. &lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*IDRegex&lt;br /&gt;
:different Regexes per login procedure step or one common Regex for all steps to extract the session ID from the HTTP response&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*Data.*&lt;br /&gt;
:data part for each step to be sent as POST data to the corresponding URL&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*Header.*&lt;br /&gt;
:HTTP Headers to be sent to the URL for the corresponding step&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*IgnoreRedirects&lt;br /&gt;
:Tells the HttpUtils to not follow HTTP Redirects for this Request. Might be needed for some devices that set a session cookie within a 303 Redirect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Name&lt;br /&gt;
:Name of a set option&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*URL&lt;br /&gt;
:URL to be requested for the set option&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*Data&lt;br /&gt;
:Data to be sent to the device as POST data when the set is executed&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*Header&lt;br /&gt;
:HTTP Headers to be sent to the device when the set is executed&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Min&lt;br /&gt;
:Minimum value for input validation. &lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Max&lt;br /&gt;
:Maximum value for input validation. &lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Expr&lt;br /&gt;
:Perl Expression to compute the raw value to be sent to the device from the input value passed to the set.&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Map&lt;br /&gt;
:Map that defines a mapping from raw to visible values like &amp;quot;0:mittig, 1:oberhalb, 2:unterhalb&amp;quot;. This attribute atomatically creates a hint for FhemWEB so the user can choose one of the visible values or select a value with a slider.&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Hint&lt;br /&gt;
:Explicit hint for fhemWEB that will be returned when set ? is seen. Can be used to get a slider or a list of values to choose from.&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*ReAuthRegex&lt;br /&gt;
:Regex that will detect when a session has expired an a new login needs to be performed.         &lt;br /&gt;
&lt;br /&gt;
;get[0-9]+Name&lt;br /&gt;
:Name of a get option and Reading to be retrieved / extracted&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*URL&lt;br /&gt;
:URL to be requested for the get option. If this option is missing, the URL specified during define will be used.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Data&lt;br /&gt;
:optional data to be sent to the device as POST data when the get is executed. if this attribute is not specified, an HTTP GET method will be used instead of an HTTP POST&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*NoData&lt;br /&gt;
:can be used to override a more generic attribute that specifies POST data for all get commands. With NoData no data is sent and therefor the request will be an HTTP GET.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Header&lt;br /&gt;
:optional HTTP Headers to be sent to the device when the get is executed&lt;br /&gt;
&lt;br /&gt;
;get[0-9]+Poll&lt;br /&gt;
:if set to 1 the get is executed automatically during the normal update cycle (after the interval provided in the define command has elapsed)&lt;br /&gt;
&lt;br /&gt;
;get[0-9]+PollDelay&lt;br /&gt;
:if the value should not be read in each iteration (after the interval given to the define command), then a minimum delay can be specified with this attribute. This has only an effect if the above Poll attribute has also been set. Every time the update function is called, it checks if since this get has been read the last time, the defined delay has elapsed. If not, then it is skipped this time.&lt;br /&gt;
:PollDelay can be specified as seconds or as x[0-9]+ which means a multiple of the interval in the define command.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Regex&lt;br /&gt;
:If this attribute is specified, the Regex defined here is used to extract the value from the HTTP Response and assign it to a Reading with the name defined in the get[0-9]+Name attribute.&lt;br /&gt;
:If this attribute is not specified for an individual Reading but as getRegex, then it applies to all get options where no specific Regex is defined.&lt;br /&gt;
:If neither a generic getRegex attribute nor a specific get[0-9]+Regex attribute is specified, then HTTPMOD tries all Regex / Reading pairs defined in Reading[0-9]+Name and Reading[0-9]+Regex attributes and assigns the Readings that match.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Expr&lt;br /&gt;
:this attribute behaves just like Reading[0-9]*Expr but is applied to a get value. &lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Map&lt;br /&gt;
:this attribute behaves just like Reading[0-9]*Map but is applied to a get value.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Format&lt;br /&gt;
:this attribute behaves just like Reading[0-9]*Format but is applied to a get value.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*CheckAllReadings&lt;br /&gt;
:this attribute modifies the behavior of HTTPMOD when the HTTP Response of a get command is parsed.&lt;br /&gt;
:If this attribute is set to 1, then additionally to any matching of get specific regexes (get[0-9]*Regex), also all the Regex / Reading pairs defined in Reading[0-9]+Name and Reading[0-9]+Regex attributes are checked and if they match, the coresponding Readings are assigned as well.&lt;br /&gt;
&lt;br /&gt;
;replacement[0-9]*Regex&lt;br /&gt;
:Defines a replacement to be applied to an HTTP request header, data or URL before it is sent. This allows any part of the request to be modified based on a reading, an internal or an expression.&lt;br /&gt;
:The regex defines which part of a header, data or URL should be replaced. The replacement is defined with the following attributes:&lt;br /&gt;
&lt;br /&gt;
;replacement[0-9]*Mode&lt;br /&gt;
:Defines how the replacement should be done and what replacementValue means. Valid options are text, reading, interbal and expression.&lt;br /&gt;
&lt;br /&gt;
;replacement[0-9]*Value&lt;br /&gt;
:Defines the replacement. If the corresponding replacementMode is text, then value is a static text that is used as the replacement.&amp;lt;br&amp;gt;&lt;br /&gt;
:If replacementMode is reading then Value can be the name of a reading of this device or it can be a reading of a different device referred to by devicename:reading.&amp;lt;br&amp;gt;&lt;br /&gt;
:If replacementMode is internal the Value can be the name of an internal of this device or it can be an internal of a different device referred to by devicename:internal.&amp;lt;br&amp;gt;&lt;br /&gt;
:If replacementMode is expression the the Value is treated as a Perl expression that computes the replacement value. The expression can use $1, $2 and so on to refer to capture groups of the corresponding regex that is matched against the original URL, header or post data.&lt;br /&gt;
&lt;br /&gt;
;[gs]et[0-9]*Replacement[0-9]*Value&lt;br /&gt;
:This attribute can be used to override the replacement value for a specific get or set.&lt;br /&gt;
&lt;br /&gt;
;get|reading[0-9]*MaxAge&lt;br /&gt;
:Defines how long a reading is valid before it is automatically overwritten with a replacement when the read function is called the next time.&lt;br /&gt;
&lt;br /&gt;
;get|reading[0-9]*MaxAgeReplacement&lt;br /&gt;
:specifies the replacement for MaxAge - either as a static text or as a perl expression.&lt;br /&gt;
&lt;br /&gt;
;get|reading[0-9]*MaxAgeReplacementMode&lt;br /&gt;
:specifies how the replacement is interpreted: can be text and expression.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;showMatched&lt;br /&gt;
:if set to 1 then HTTPMOD will create a reading with the name MATCHED_READINGS &lt;br /&gt;
:that contains the names of all readings that could be matched in the last request.&lt;br /&gt;
&lt;br /&gt;
;showError&lt;br /&gt;
:if set to 1 then HTTPMOD will create a reading and event with the Name LAST_ERROR &lt;br /&gt;
:that contains the error message of the last error returned from HttpUtils. &lt;br /&gt;
&lt;br /&gt;
;queueDelay&lt;br /&gt;
:HTTP Requests will be sent from a queue in order to avoid blocking when several Requests have to be sent in sequence. This attribute defines the delay between calls to the function that handles the send queue. It defaults to one second.&lt;br /&gt;
&lt;br /&gt;
;queueMax&lt;br /&gt;
:Defines the maximum size of the send queue. If it is reached then further HTTP Requests will be dropped and not be added to the queue&lt;br /&gt;
&lt;br /&gt;
;minSendDelay&lt;br /&gt;
:Defines the minimum time between two HTTP Requests.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Beispiel: [[Wetter_und_Wettervorhersagen#Wetter_von_Weather_Underground|Wetter von WeatherUnderground auslesen]]&lt;br /&gt;
* {{Link2Forum|Topic=17804|LinkText=Thread}} in Fhem Forum that discusses the first version of this module &lt;br /&gt;
* [http://perldoc.perl.org/perlretut.html Introduction to regular expressions]&lt;br /&gt;
* [http://portswigger.net/burp/ BurpSuite]: Tool (local proxy) to help analyze http traffic&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IP Components]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPMOD&amp;diff=13467</id>
		<title>HTTPMOD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPMOD&amp;diff=13467"/>
		<updated>2016-01-05T15:32:44Z</updated>

		<summary type="html">&lt;p&gt;SirUli: /* Further replacements of URL, header or post data */ Corrected a typo and extended text for better understanding&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Extract information from devices with an HTTP interface (or, more generic, from any URL) or send information to such devices &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=HTTPMOD&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_HTTPMOD.pm&lt;br /&gt;
|ModOwner=StefanStrobel ({{Link2FU|3960|Forum}} / [[Benutzer:StefanStrobel|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
HTTPMOD provides a generic way to retrieve information from devices with an HTTP Interface and store them in Readings or send information to such devices. It queries a given URL with Headers and data defined by attributes. &lt;br /&gt;
&lt;br /&gt;
From the HTTP response it extracts readings named in attributes using Regexes, JSON or XPath parsing also defined by attributes.&lt;br /&gt;
&lt;br /&gt;
In an advanced [[Konfiguration|configuration]] the module can also send information to devices. To do this, a generic &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; option can be configured using attributes. &lt;br /&gt;
&lt;br /&gt;
== Availability == &lt;br /&gt;
{{Randnotiz|RNText=An extended / modified version of this module that among other features adds XPath and JSON support is currently under development. &lt;br /&gt;
If you want to participate in early tests, please follow this {{Link2Forum|Topic=45176|LinkText=discussion thread}} in FHEM forum.&lt;br /&gt;
This page has already been updated to describe most of the new features. So if you need one of the new features described here and yout HTTPMOD is still the old version, load the new module &lt;br /&gt;
from the forum and help testing&lt;br /&gt;
}}&lt;br /&gt;
The module is part of the regular FHEM distribution.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
This module uses the non blocking HTTP function &amp;lt;code&amp;gt;HttpUtils_NonblockingGet&amp;lt;/code&amp;gt; provided by FHEM&#039;s [[HttpUtils]] in a new version published in December 2013.&lt;br /&gt;
If not already installed in your environment, please [[update]] FHEM or install it manually using appropriate commands from your environment.&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; HTTPMOD &amp;lt;URL&amp;gt; &amp;lt;Interval&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The module connects to the given &amp;lt;code&amp;gt;URL&amp;lt;/code&amp;gt; every &amp;lt;code&amp;gt;Interval&amp;lt;/code&amp;gt; seconds, sends optional headers and data and then parses the response with regular expressions, xpath or json to set readings.&lt;br /&gt;
&lt;br /&gt;
URL can be &amp;quot;none&amp;quot; and Interval can be 0 if you prefer to only query data with a get command and not in a defined interval.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define PM HTTPMOD http://MyPoolManager/cgi-bin/webgui.fcgi 60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Commands ==&lt;br /&gt;
can be defined using attributes, see advanced configuration&lt;br /&gt;
&lt;br /&gt;
If you set the attribute enableControlSet to 1, the following additional built in set commands are available:&lt;br /&gt;
;interval&lt;br /&gt;
:set new interval time in seconds and restart the timer&lt;br /&gt;
;reread&lt;br /&gt;
:request the defined URL and try to parse it just like the automatic update would do it every Interval seconds without modifying the running timer.&lt;br /&gt;
;stop&lt;br /&gt;
:stop interval timer.&lt;br /&gt;
;start&lt;br /&gt;
:restart interval timer to call GetUpdate after interval seconds&lt;br /&gt;
&lt;br /&gt;
== Get-Commands ==&lt;br /&gt;
can be defined using attributes, see advanced configuration&lt;br /&gt;
&lt;br /&gt;
== simple Attributes ==&lt;br /&gt;
;do_not_notify&lt;br /&gt;
&lt;br /&gt;
;readingFnAttributes&lt;br /&gt;
&lt;br /&gt;
;requestHeader.* &lt;br /&gt;
:Define an additional HTTP Header to set in the HTTP request&lt;br /&gt;
&lt;br /&gt;
;requestData&lt;br /&gt;
:POST Data to be sent in the request. If not defined, it will be a GET request as defined in HttpUtils used by this module&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+(-[0-9]+)?Name&lt;br /&gt;
:the name of a reading to extract with the corresponding readingRegex&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Expr&lt;br /&gt;
:defines an expression that is used in an eval to compute the readings value. The raw value will be in the variable $val.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Map&lt;br /&gt;
:defines a mapping from raw to visible values like &amp;quot;0:mittig, 1:oberhalb, 2:unterhalb&amp;quot;. If specified as readingMap then the attribute value is a default for all other readings that don&#039;t specify an explicit reading[0-9]*Map.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Format&lt;br /&gt;
:Defines a format string that will be used in sprintf to format a reading value. If specified as readingFormat then the attribute value is a default for all other readings that don&#039;t specify an explicit reading[0-9]*Format.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Decode&lt;br /&gt;
:defines an encoding to be used in a call to the perl function decode to convert the raw data string read from the device to a reading. This can be used if the device delivers strings in an encoding like cp850 instead of utf8.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]*(-[0-9]+)?Encode&lt;br /&gt;
:defines an encoding to be used in a call to the perl function encode to convert the raw data string read from the device to a reading. This can be used if the device delivers strings in an encoding like cp850 and after decoding it you want to reencode it to e.g. utf8.&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+Regex&lt;br /&gt;
:defines the regex to be used for extracting the reading. The value to extract should be in a sub expression e.g. ([\d\.]+) in the above example&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+Regex&lt;br /&gt;
:defines the regex to be used for extracting the reading. The value to extract should be in a capture group / sub expression &lt;br /&gt;
:e.g. ([\d\.]+) in the above example. Multiple capture groups will create multiple readings (see explanation above)&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+XPath&lt;br /&gt;
:defines an xpath to one or more readings when parsing HTML data (see examples below)&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+XPath-Strict&lt;br /&gt;
:defines an xpath to one or more readings when parsing XML data (see examples below)&lt;br /&gt;
&lt;br /&gt;
;reading[0-9]+JSON&lt;br /&gt;
:defines a path to the JSON object wanted by concatenating the object names with an underscore as delimiter (see the example below)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;noShutdown&lt;br /&gt;
:pass the noshutdown flag to HTTPUtils for webservers that need it (some embedded webservers only deliver empty pages otherwise)&lt;br /&gt;
&lt;br /&gt;
;disable&lt;br /&gt;
:stop doing automatic HTTP requests while this attribute is set to 1&lt;br /&gt;
&lt;br /&gt;
;timeout&lt;br /&gt;
:time in seconds to wait for an answer. Default value is 2&lt;br /&gt;
&lt;br /&gt;
;enableControlSet&lt;br /&gt;
:enables the built in set commands interval, stop, start, reread&lt;br /&gt;
&lt;br /&gt;
;(get|reading)[0-9]*RecombineExpr&lt;br /&gt;
:defines an expression that is used in an eval to compute one reading value out of the list of matches. &lt;br /&gt;
:This is supposed to be used for regexes or xpath specifications that produce multiple results if only one result that combines them is wanted. &lt;br /&gt;
:The list of matches will be in the variable @matchlist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== simple Configuration of HTTP Devices ==&lt;br /&gt;
If your device expects special HTTP-headers then specify them as &amp;lt;code&amp;gt;attr requestHeader1&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;attr requestHeaderX&amp;lt;/code&amp;gt;.&lt;br /&gt;
If your Device expects an HTTP POST instead of HTTP GET then the POST-data can be specified as &amp;lt;code&amp;gt;attr requestData&amp;lt;/code&amp;gt;.&lt;br /&gt;
To get the readings, specify pairs of &amp;lt;code&amp;gt;attr readingXName&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr readingXRegex&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;attr readingXXPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;attr readingXXPath-Strict&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;attr readingXJSON&amp;lt;/code&amp;gt; to define which readings you want to extract from the HTTP response and how to extract them. (The old syntax &amp;lt;code&amp;gt;attr readingsNameX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr readingsRegexX&amp;lt;/code&amp;gt; is still supported but the new one with &amp;lt;code&amp;gt;attr readingXName&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr readingXRegex&amp;lt;/code&amp;gt; should be preferred. The actual values to be extracted have to be sub expressions within () in the regex (see example below)&lt;br /&gt;
&lt;br /&gt;
=== Example for a PoolManager 5: ===&lt;br /&gt;
The PoolManager Web GUI can be queried with HTTP POST Requests like this one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST /cgi-bin/webgui.fcgi HTTP/1.1&lt;br /&gt;
Host: 192.168.70.90&lt;br /&gt;
Accept: */*&lt;br /&gt;
Content-Type: application/json;charset=UTF-8&lt;br /&gt;
Content-Length: 60&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;get&amp;quot; :[&amp;quot;34.4001.value&amp;quot; ,&amp;quot;34.4008.value&amp;quot; ,&amp;quot;34.4033.value&amp;quot;]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The resulting HTTP Response would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-type: application/json; charset=UTF-8&lt;br /&gt;
Expires: 0&lt;br /&gt;
Cache-Control: no-cache&lt;br /&gt;
Date: Sun, 12 Jan 2014 12:23:11 GMT&lt;br /&gt;
Server: lighttpd/1.4.26&lt;br /&gt;
Content-Length: 179&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;data&amp;quot;:	{&lt;br /&gt;
		&amp;quot;34.4001.value&amp;quot;:	&amp;quot;7.00&amp;quot;,&lt;br /&gt;
		&amp;quot;34.4008.value&amp;quot;:	&amp;quot;0.52&amp;quot;,&lt;br /&gt;
		&amp;quot;34.4033.value&amp;quot;:	&amp;quot;24.8&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;status&amp;quot;:	{&lt;br /&gt;
		&amp;quot;code&amp;quot;:	0&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;event&amp;quot;:	{&lt;br /&gt;
		&amp;quot;type&amp;quot;:	1,&lt;br /&gt;
		&amp;quot;data&amp;quot;:	&amp;quot;48.30000.0&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To configure HTTPMOD for a PoolManager one would first define a PoolManager device with e.g. the name PM, the URL and an interval of e.g. 60 seconds. &lt;br /&gt;
&lt;br /&gt;
Then the data to be sent in the request needs to be defined because in this example the device expects a POST request so the query is not contained in the URL but in the request data.&lt;br /&gt;
&lt;br /&gt;
Also as seen above the device expects special HTTP headers in the request so these headers also need to be defined as &amp;lt;code&amp;gt;attr PM requestHeader1&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;attr PM requestHeader2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then the names of the readings to be extracted would be set with attributes&lt;br /&gt;
&lt;br /&gt;
Then for each reading value to be extracted a regular expression needs to be set that will match the value in question within ().&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define PM HTTPMOD http://MyPoolManager/cgi-bin/webgui.fcgi 60&lt;br /&gt;
attr PM reading01Name PH&lt;br /&gt;
attr PM reading01Regex 34.4001.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr PM reading02Name CL&lt;br /&gt;
attr PM reading02Regex 34.4008.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr PM reading03Name3TEMP&lt;br /&gt;
attr PM reading03Regex 34.4033.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr PM requestData {&amp;quot;get&amp;quot; :[&amp;quot;34.4001.value&amp;quot; ,&amp;quot;34.4008.value&amp;quot; ,&amp;quot;34.4033.value&amp;quot;, &amp;quot;14.16601.value&amp;quot;, &amp;quot;14.16602.value&amp;quot;]}&lt;br /&gt;
attr PM requestHeader1 Content-Type: application/json&lt;br /&gt;
attr PM requestHeader2 Accept: */*&lt;br /&gt;
attr PM stateFormat {sprintf(&amp;quot;%.1f Grad, PH %.1f, %.1f mg/l Chlor&amp;quot;, ReadingsVal($name,&amp;quot;TEMP&amp;quot;,0), ReadingsVal($name,&amp;quot;PH&amp;quot;,0), ReadingsVal($name,&amp;quot;CL&amp;quot;,0))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example for AmbientMonitor ===&lt;br /&gt;
AmbientMonitor is a webbased visualisation for sensors connected to an Arduino device. Its web interface can also be queried with HTTMOD to grab the data into readings.&lt;br /&gt;
&lt;br /&gt;
This example was provided by locutus. The hardware configuration is an Arduino + Ethercard with ENC28J60 Controller + DHT22 Sensor and software can be downloaded from https://github.com/lucadentella/AmbientMonitor&lt;br /&gt;
&lt;br /&gt;
In this example an HTTP GET is sufficent, so no &amp;lt;code&amp;gt;requestData&amp;lt;/code&amp;gt; is needed. The device provides temperature and humidity readings in an HTTP response that looks like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HTTP/1.0 200 OK &lt;br /&gt;
Content-Type: text/html &lt;br /&gt;
&lt;br /&gt;
myCB({&#039;temperature&#039;:22.00,&#039;humidity&#039;:46.00})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the definition could be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define AmbientMonitor HTTPMOD http://192.168.1.221/?callback=? 300&lt;br /&gt;
attr AmbientMonitor requestHeader Content-Type: application/json&lt;br /&gt;
attr AmbientMonitor reading1Name Temperatur&lt;br /&gt;
attr AmbientMonitor reading1Regex temperature&#039;:([\d\.]+)&lt;br /&gt;
attr AmbientMonitor reading2Name Feuchtigkeit&lt;br /&gt;
attr AmbientMonitor reading2Regex humidity&#039;:([\d\.]+)&lt;br /&gt;
attr AmbientMonitor stateFormat {sprintf(&amp;quot;Temperatur %.1f C, Feuchtigkeit %.1f %&amp;quot;, ReadingsVal($name,&amp;quot;Temperatur&amp;quot;,0), ReadingsVal($name,&amp;quot;Feuchtigkeit&amp;quot;,0))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== formating and manipulating values / readings ==&lt;br /&gt;
Values that are parsed from an HTTP response can be further treated or formatted with the following attributes:&lt;br /&gt;
&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?Expr&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?Map&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?Format&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?Decode&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?Encode&lt;br /&gt;
&lt;br /&gt;
They can all be specified for an individual reading, for all readings in one match (e.g. if a regular expression has several capture groups)or for all readings in a get command (defined by getXX) or for all readings in the main reading list (defined by readingXX):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reading01Format %.1f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will format the reading with the name specified by the attribute reading01Name to be numerical with one digit after the decimal point.&lt;br /&gt;
If the attribute reading01Regex is used and contains several capture groups then the format will be applied to all readings thet are parsed by this regex unless these readings have their own format specified by reading01-1Format, reading01-2Format and so on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reading01-2Format %.1f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can be used in cases where a regular expression specified as reading1regex contains several capture groups or an xpath specified as reading01XPath creates several readings. &lt;br /&gt;
In this case reading01-2Format specifies the format to be applied to the second match.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
readingFormat %.1f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
applies to all readings defined by a reading-Attribute that have no more specific format.&lt;br /&gt;
&lt;br /&gt;
If you need to do some calculation on a raw value before it is used as a reading, you can define the attribute &amp;lt;code&amp;gt;readingExpr&amp;lt;/code&amp;gt;.&lt;br /&gt;
It defines a Perl expression that is used in an eval to compute the readings value. The raw value will be in the variable $val.&lt;br /&gt;
&lt;br /&gt;
=== Example: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM reading03Expr $val * 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Just like in the above example of the readingFormat attributes, readingExpr and the other following attributes can be applied on several levels.&lt;br /&gt;
&lt;br /&gt;
To map a numerical value to a name, you can use the readingMap attribute. &lt;br /&gt;
It defines a mapping from raw to visible values like &amp;quot;0:mittig, 1:oberhalb, 2:unterhalb&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM reading02-3Map 0:kalt, 1:warm, 2:sehr warm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To convert character sets, the module can first decode a string read from the device and then encode it again. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM getDecode UTF-8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This applies to all readings defined for Get-Commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Some help with Regular Expressions ==&lt;br /&gt;
If HTTPMOD seems not to work and the FHEM Logfile contains a message like  &lt;br /&gt;
:&amp;lt;code&amp;gt;HTTPMOD: Response didn&#039;t match Reading ...&amp;lt;/code&amp;gt;&lt;br /&gt;
then you should check if the value you want to extract is read into the internal with the name buf. Internals are visible when you click on the defined HTTPMOD Device. buf is an internal variable that contains the HTTP Response read. If the value is there and you get the mentioned message then probably something is wrong with your regular expression. If you are new to regular expressions then the introduction at http://perldoc.perl.org/perlretut.html might be helpful. &lt;br /&gt;
&lt;br /&gt;
For a typical HTTPMOD use case where you want to extract a number out of a HTTP-Response you can use something like &amp;lt;code&amp;gt;[\d\.]+&amp;lt;/code&amp;gt; to match the number itself. The expression matches the number characters (&amp;lt;code&amp;gt;\d&amp;lt;/code&amp;gt;) or a &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; if one of these characters occurs at least once. &lt;br /&gt;
&lt;br /&gt;
To tell HTTPMOD that the number is what you want to use for the reading, you have to put the expression in between &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. A &amp;lt;code&amp;gt;([\d\.]+)&amp;lt;/code&amp;gt; alone would match the longest number in the HTTP Response which is very likely not the number you are looking for so you need to add something to the expression to give it a context and define how to find the number that you are looking for.&lt;br /&gt;
if there is a title text before the number or a special text after the number you can put this in the regex. In one of the examples above &amp;lt;code&amp;gt;humidity&#039;:([\d\.]+)&amp;lt;/code&amp;gt; is looking for the number that immediately follows the text &amp;lt;code&amp;gt;humidity&#039;:&amp;lt;/code&amp;gt; without any blanks in between.&lt;br /&gt;
&lt;br /&gt;
=== Regular Expressions with multiple capture Groups ===&lt;br /&gt;
The regular expressions used in the above example for a Poolmanager will take the value that matches one capture group. This is the part of the regular expression inside (). In the above example &amp;quot;([\d\.]+)&amp;quot; refers to numerical digits or points between double quotation marks. Only the string consiting of digits and points will match inside (). This piece is assigned to the reading.&lt;br /&gt;
        &lt;br /&gt;
You can also use regular expressions that have several capture groups which might be helpful when parsing tables. In this case an attribute like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reading02Regex something[ \t]+([\d\.]+)[ \t]+([\d\.]+)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
could match two numbers. When you specify only one reading02Name like &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reading02Name Temp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the name Temp will be used with the extension -1 and -2 thus giving a reading Temp-1 for the first number and Temp-2 for the second. You can also specify individual names for several readings that get parsed from one regular expression with several capture groups by defining attributes &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reading02-1Name&lt;br /&gt;
reading02-2Name&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The same notation can be used for formatting attributes like readingXMap, readingXFormat and so on.&lt;br /&gt;
&lt;br /&gt;
The usual way to define readings is however to have an individual regular expression with just one capture group per reading as shown in the above example.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parsing JSON ==&lt;br /&gt;
    &lt;br /&gt;
If a webservice delivers data in JSON format, HTTPMOD can directly parse JSON which might be easier in this case than definig regular expressions.&lt;br /&gt;
The next example shows the data that can be requested from a Poolmanager with the following partial configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define test2 HTTPMOD none 0&lt;br /&gt;
attr test2 get01Name Chlor&lt;br /&gt;
attr test2 getURL http://192.168.70.90/cgi-bin/webgui.fcgi&lt;br /&gt;
attr test2 getHeader1 Content-Type: application/json&lt;br /&gt;
attr test2 getHeader2 Accept: */*&lt;br /&gt;
attr test2 getData {&amp;quot;get&amp;quot; :[&amp;quot;34.4008.value&amp;quot;]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The data in the HTTP response looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;data&amp;quot;: {&lt;br /&gt;
			&amp;quot;34.4008.value&amp;quot;: &amp;quot;0.25&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;status&amp;quot;:       {&lt;br /&gt;
			&amp;quot;code&amp;quot;: 0&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;event&amp;quot;:        {&lt;br /&gt;
			&amp;quot;type&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;data&amp;quot;: &amp;quot;48.30000.0&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the classic way to extract the value 0.25 into a reading with the name Chlor with a regex would have been&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr test2 get01Regex 34.4008.value&amp;quot;:[ \t]+&amp;quot;([\d\.]+)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with JSON you can write &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr test2 get01JSON data_34.4008.value &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or if you don&#039;t care about the naming of your readings, you can simply extract all JSON data with &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr test2 extractAllJSON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which would apply to all data read from this device and create the following readings out of the HTTP response shown above:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| data_34.4008.value || 0.25&lt;br /&gt;
|-&lt;br /&gt;
| event_data || 48.30000.0&lt;br /&gt;
|-&lt;br /&gt;
| event_type || 1&lt;br /&gt;
|-&lt;br /&gt;
| status_code || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
or you can specify&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr test2 get01ExtractAllJSON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
which would only apply to all data read as response to the get command defined as get01.        &lt;br /&gt;
&lt;br /&gt;
== Parsing http / XML using xpath ==&lt;br /&gt;
Another alternative to regex parsing is the use of XPath to extract values from HTTP responses.&lt;br /&gt;
The following example shows how XML data can be parsed with XPath-Strict or HTML Data can be parsed with XPath.&lt;br /&gt;
Both work similar and the example uses XML Data parsed with the XPath-Strict option:&lt;br /&gt;
&lt;br /&gt;
If The XML data in the HTTP response looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;lt;root xmlns:foo=&amp;amp;quot;http://www.foo.org/&amp;amp;quot; xmlns:bar=&amp;amp;quot;http://www.bar.org&amp;amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;actors&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;actor id=&amp;amp;quot;1&amp;amp;quot;&amp;amp;gt;Peter X&amp;amp;lt;/actor&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;actor id=&amp;amp;quot;2&amp;amp;quot;&amp;amp;gt;Charles Y&amp;amp;lt;/actor&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;actor id=&amp;amp;quot;3&amp;amp;quot;&amp;amp;gt;John Doe&amp;amp;lt;/actor&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/actors&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/root&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with XPath you can write        &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr htest reading01Name Actor&lt;br /&gt;
attr htest reading01XPath-Strict //actor[2]/text()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a reading with the Name &amp;quot;Actor&amp;quot; and the value &amp;quot;Charles Y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since XPath specifications can define several values / matches, HTTPMOD can also interpret these and store them in multiple readings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr htest reading01Name Actor&lt;br /&gt;
attr htest reading01XPath-Strict //actor/text()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will create the readings &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| Actor-1 | Peter X&lt;br /&gt;
|-&lt;br /&gt;
| Actor-2 | Charles Y&lt;br /&gt;
|-&lt;br /&gt;
| Actor-3 | John Doe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Further replacements of URL, header or post data ==&lt;br /&gt;
sometimes it might be helpful to dynamically change parts of a URL, HTTP header or post data depending on existing readings, internals or &lt;br /&gt;
perl expressions at runtime. This might be needed to pass further variables to a server, a current date or other things. &lt;br /&gt;
&lt;br /&gt;
To support this HTTPMOD offers generic replacements that are applied to a request before it is sent to the server. A replacement can be defined with the attributes &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;replacement[0-9]*Regex&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;[gs]et[0-9]*Replacement[0-9]*Value&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a replacement always replaces a match of a regular expression. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;replacement[0-9]*Mode:&#039;&#039;&#039;&lt;br /&gt;
The way the replacement value is defined can be specified with the replacement mode.&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;reading&amp;lt;/code&amp;gt;, then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is interpreted as the name of a &#039;&#039;reading&#039;&#039; of the same device or as &#039;&#039;device:reading&#039;&#039; to refer to another device.&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;internal&amp;lt;/code&amp;gt;, then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is interpreted as the name of an &#039;&#039;internal&#039;&#039; of the same device or as &#039;&#039;device:internal&#039;&#039; to refer to another device.&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is interpreted as a static text&lt;br /&gt;
* If the &amp;lt;code&amp;gt;replacement[0-9]*Mode&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; , then the corresponding &amp;lt;code&amp;gt;replacement[0-9]*Value&amp;lt;/code&amp;gt; is evaluated as a perl expression to compute the replacement. Inside such a replacement expression it is possible to refer to capture groups of the replacement regex.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr mydevice getData {&amp;quot;get&amp;quot; :[&amp;quot;%%value%%.value&amp;quot;]}&lt;br /&gt;
attr mydevice replacement01Mode text&lt;br /&gt;
attr mydevice replacement01Regex %%value%%&lt;br /&gt;
&lt;br /&gt;
attr mydevice get01Name Chlor&lt;br /&gt;
attr mydevice get01Replacement01Value 34.4008&lt;br /&gt;
&lt;br /&gt;
attr mydevice get02Name Something&lt;br /&gt;
attr mydevice get02Replacement01Value 31.4024&lt;br /&gt;
&amp;lt;/source&amp;gt;        &lt;br /&gt;
&lt;br /&gt;
defines that &amp;lt;code&amp;gt;%%value%%&amp;lt;/code&amp;gt; will be replaced by a static text.&lt;br /&gt;
&lt;br /&gt;
All Get commands will be HTTP post requests of a similar form. Only the &amp;lt;code&amp;gt;%%value%%&amp;lt;/code&amp;gt; will be different from get to get.&lt;br /&gt;
The first get will set the reading named Chlor and for the request it will take the generic getData and replace %%value%% with 34.4008.&lt;br /&gt;
A second get will look the same except a different name and replacement value.&lt;br /&gt;
&lt;br /&gt;
The mode expression allows you to define your own replacement syntax:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;        &lt;br /&gt;
attr mydevice replacement01Mode expression&lt;br /&gt;
attr mydevice replacement01Regex {{([^}]+)}}&lt;br /&gt;
attr mydevice replacement01Value ReadingsVal(&amp;quot;mydevice&amp;quot;, $1, &amp;quot;&amp;quot;)&lt;br /&gt;
attr mydevice getData {&amp;quot;get&amp;quot; :[&amp;quot;{{temp}}.value&amp;quot;]}&lt;br /&gt;
&amp;lt;/source&amp;gt;      &lt;br /&gt;
&lt;br /&gt;
In this example any &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{name}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in a URL, header or post data will be passed on to the perl function ReadingsVal &lt;br /&gt;
which uses the string between &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; as second parameter. This way one defined replacement can be used for many different&lt;br /&gt;
readings.&lt;br /&gt;
&lt;br /&gt;
== replacing reading values when they have not been updated / the device did not respond ==&lt;br /&gt;
If a device does not respond then the values stored in readings will keep the same and only their timestamp shows that they are outdated. &lt;br /&gt;
If you want to modify reading values that have not been updated for a number of seconds, you can use the attributes&lt;br /&gt;
&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?MaxAge&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?MaxAgeReplacementMode&lt;br /&gt;
* (reading|get)[0-9]*(-[0-9]+)?MaxAgeReplacement&lt;br /&gt;
&lt;br /&gt;
Every time the module tries to read from a device, it will also check if readings have not been updated &lt;br /&gt;
for longer than the MaxAge attributes allow. If readings are outdated, the MaxAgeReplacementMode defines how the affected&lt;br /&gt;
reading values should be replaced. MaxAgeReplacementMode can be &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
MaxAge specifies the number of seconds that a reading should remain untouched before it is replaced. &lt;br /&gt;
&lt;br /&gt;
MaxAgeReplacement contains either a static text that is used as replacement value or a Perl expression that is evaluated to &lt;br /&gt;
give the replacement value. This can be used for example to replace a temperature that has not bee updated for more than 5 minutes &lt;br /&gt;
with the string &amp;quot;outdated - was 12&amp;quot;:        &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM readingMaxAge 300&lt;br /&gt;
attr PM readingMaxAgeReplacement &amp;quot;outdated - was &amp;quot; . $val&lt;br /&gt;
attr PM readingMaxAgeReplacementMode expression&lt;br /&gt;
&amp;lt;/pre&amp;gt;        &lt;br /&gt;
The variable $val contains the value of the reading before it became outdated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Additional notes ==&lt;br /&gt;
If you don&#039;t know which URLs, headers or POST data your web GUI uses, you might try a local proxy like BurpSuite [http://portswigger.net/burp/ BurpSuite] to track requests and responses&lt;br /&gt;
&lt;br /&gt;
== Advanced configuration to define a &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; and send data to a device ==&lt;br /&gt;
       &lt;br /&gt;
When a set option is defined by attributes, the module will use the value given to the set command and integrate it into an HTTP-Request that sends the value to the device. The definitions for URL, headers and post data can contain the placeholder $val which will be replaced by the value given to the set command.&lt;br /&gt;
&lt;br /&gt;
This can be as simple as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# No cyclic requests and no main URL needed in this example&lt;br /&gt;
define MyDevice none 0&lt;br /&gt;
&lt;br /&gt;
attr MyDevice set01Name Licht&lt;br /&gt;
attr MyDevice set01URL http://192.168.1.22/switch=$val&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user command &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set MyDevice Licht 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will be translated into the http GET request&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://192.168.1.22/switch=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example a map would also be helpful, that translates on / off to 0 or 1 and allows the user to select on/of in fhemweb:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MyDevive set01Map 0:off, 1:on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This also provides input validation to make sure that only on and off can be used with the set command.&lt;br /&gt;
&lt;br /&gt;
In more complex Scenarios you might need to login before sending a command and the Login might create a session id that has to be part of further requests either in the URL, in headers or in the post data.&lt;br /&gt;
&lt;br /&gt;
Extension to the above example for a PoolManager 5 where a set needs a session id in the URL and the values have to be passed in JSON strings as post data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM set01Name HeizungSoll&lt;br /&gt;
attr PM set01URL http://MyPoolManager/cgi-bin/webgui.fcgi?sid=$sid&lt;br /&gt;
attr PM set01Hint 6,10,20,30&lt;br /&gt;
attr PM set01Min 6&lt;br /&gt;
attr PM set01Max 30&lt;br /&gt;
attr PM setHeader1 Content-Type: application/json&lt;br /&gt;
attr PM set01Data {&amp;quot;set&amp;quot; :{&amp;quot;34.3118.value&amp;quot; :&amp;quot;$val&amp;quot; }}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example defines a set option with the name HeizungSoll.&lt;br /&gt;
By issuing &amp;lt;code&amp;gt;set PM HeizungSoll 10&amp;lt;/code&amp;gt; in FHEM, the value 10 will be sent in the defined HTTP&lt;br /&gt;
Post to URL &amp;lt;code&amp;gt;http://MyPoolManager/cgi-bin/webgui.fcgi&amp;lt;/code&amp;gt; in the Post Data as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&amp;quot;set&amp;quot; :{&amp;quot;34.3118.value&amp;quot; :&amp;quot;10&amp;quot; }}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optional attributes set01Min and set01Max define input validations that will be checked in the set function. &lt;br /&gt;
The optional attribute set01Hint will define a selection list for the Fhemweb GUI.&lt;br /&gt;
&lt;br /&gt;
If a parameter to a set command is not numeric but should be passed on to the device as text, then you can specify the attribute setTextArg. For example: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM set01TextArg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a set command should not require a parameter at all, then you can specify the attribute NoArg. For example: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM set03Name On&lt;br /&gt;
attr PM set03NoArg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced configuration to create a valid session id that might be necessary in set options ===&lt;br /&gt;
In simple cases logging in works with basic authentication. In the case HTTPMOD accepts a username and password as part of the URL in the form &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://User:Password@192.168.1.18/something&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However basic auth is seldom used. If you need to fill in a username and password in a HTML form and the session is then managed by a session id, here is how to configure this:&lt;br /&gt;
&lt;br /&gt;
when sending data to an HTTP-Device in a set, HTTPMOD will replace any &amp;lt;code&amp;gt;$sid&amp;lt;/code&amp;gt; in the URL, Headers and Post data with the internal &amp;lt;code&amp;gt;$hash-&amp;gt;{sid}&amp;lt;/code&amp;gt;. To authenticate towards the device and give this internal a value, you can use an optional multi step login procedure defined by the following attributes: &lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*URL&lt;br /&gt;
;sid[0-9]*IDRegex&lt;br /&gt;
;sid[0-9]*Data.*&lt;br /&gt;
;sid[0-9]*Header.*&lt;br /&gt;
;sid[0-9]*IgnoreRedirects&lt;br /&gt;
&lt;br /&gt;
Each step can have a URL, Headers, Post Data pieces and a Regex to extract a resulting Session ID into &amp;lt;code&amp;gt;$hash-&amp;gt;{sid}&amp;lt;/code&amp;gt;.&lt;br /&gt;
HTTPMOD will create a sorted list of steps (the numbers between sid and URL / Data / Header) and the loop through these steps and send the corresponding requests to the device. For each step a $sid in a Header or Post Data will be replaced with the current content of &amp;lt;code&amp;gt;$hash-&amp;gt;{sid}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Using this feature, HTTPMOD can perform a forms based authentication and send user name, password or other necessary data to the device and save the session id for further requests.&lt;br /&gt;
        &lt;br /&gt;
To determine when this login procedure is necessary, HTTPMOD will first try to do a set without &lt;br /&gt;
doing the login procedure. If the Attribute ReAuthRegex is defined, it will then compare the HTTP Response to the set request with the regular expression from ReAuthRegex. If it matches, then a &lt;br /&gt;
login is performed. The ReAuthRegex is meant to match the error page a device returns if authentication or reauthentication is required e.g. because a session timeout has expired.&lt;br /&gt;
        &lt;br /&gt;
If for one step not all of the URL, Data or Header Attributes are set, then HTTPMOD tries to use a &lt;br /&gt;
&amp;lt;code&amp;gt;sidURL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sidData.*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sidHeader.*&amp;lt;/code&amp;gt; Attribue (without the step number after sid). This way parts that are the same for all steps don&#039;t need to be defined redundantly.&lt;br /&gt;
&lt;br /&gt;
=== Example for a multi step login procedure: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr PM reAuthRegex /html/dummy_login.htm &lt;br /&gt;
attr PM sidURL http://192.168.70.90/cgi-bin/webgui.fcgi?sid=$sid&lt;br /&gt;
attr PM sidHeader1 Content-Type: application/json&lt;br /&gt;
attr PM sid1IDRegex wui.init\(&#039;([^&#039;]+)&#039;&lt;br /&gt;
attr PM sid2Data {&amp;quot;set&amp;quot; :{&amp;quot;9.17401.user&amp;quot; :&amp;quot;fhem&amp;quot; ,&amp;quot;9.17401.pass&amp;quot; :&amp;quot;password&amp;quot; }}&lt;br /&gt;
attr PM sid3Data {&amp;quot;set&amp;quot; :{&amp;quot;35.5062.value&amp;quot; :&amp;quot;128&amp;quot; }}&lt;br /&gt;
attr PM sid4Data {&amp;quot;set&amp;quot; :{&amp;quot;42.8026.code&amp;quot; :&amp;quot;pincode&amp;quot; }}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case HTTPMOD detects that a login is necessary by looking for the pattern /html/dummy_login.htm in the HTTP response. &lt;br /&gt;
If it matches, it starts a login sequence. In the above example all steps request the same URL. In step 1 only the defined Header is sent in an HTTP get request. The response will contain a session id that is extraced with the regex wui.init\(&#039;([^&#039;]+)&#039;.&lt;br /&gt;
&lt;br /&gt;
In the next step this session id is sent in a post request to the same URL where tha post data contains a username and password. The a third and a fourth request follow that set a value and a code. The result will be a valid and authorized session id that can be used in other requests where $sid is part of a URL, header or post data and will be replaced with the session id extracted above.&lt;br /&gt;
&lt;br /&gt;
== Advanced configuration to define a &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; and request additional data with its own request from a device ==&lt;br /&gt;
&lt;br /&gt;
The normal automatic HTTP request that is done repeatedly after the defined interval has elapsed works well in cases where all required readings can be requested in one common HTTP request. If however a device needs individual requests with different URLs or different POST data for each value, then another method is necessary. &lt;br /&gt;
For such cases a &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; option can be defined and the user can either issue Fhem &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; commands each time he needs the reading or the user can set an attribute to request the reading automatically together with the normal iteration.&lt;br /&gt;
For each &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; option attributes define an individual URL, optional headers, and post data as well as individual regular expressions and formatting options. &lt;br /&gt;
&lt;br /&gt;
Example for a Siemens webserver provided by Lanhydrock:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define ozw672 HTTPMOD https://192.168.178.8/api/auth/login.json?user=test&amp;amp;pwd=test 300&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get1Name tempAussen&lt;br /&gt;
attr ozw672 get1URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1960&lt;br /&gt;
attr ozw672 get1Poll 1&lt;br /&gt;
attr ozw672 get1PollDelay 1800&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get2Name tempAussenGemischt&lt;br /&gt;
attr ozw672 get2URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1964&lt;br /&gt;
attr ozw672 get2Poll 1&lt;br /&gt;
attr ozw672 get2PollDelay 1800&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get3Name tempTWW&lt;br /&gt;
attr ozw672 get3URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1996&lt;br /&gt;
attr ozw672 get3Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get4Name tempKesselSoll&lt;br /&gt;
attr ozw672 get4URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1910&lt;br /&gt;
attr ozw672 get4Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get5Name tempKesselRuecklauf&lt;br /&gt;
attr ozw672 get5URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1915&lt;br /&gt;
attr ozw672 get5Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get6Name tempKesselRuecklaufSoll&lt;br /&gt;
attr ozw672 get6URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1916&lt;br /&gt;
attr ozw672 get6Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get7Name anzahlStartsBrenner&lt;br /&gt;
attr ozw672 get7URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1927&lt;br /&gt;
attr ozw672 get7PollDelay 1800&lt;br /&gt;
attr ozw672 get7Poll 1&lt;br /&gt;
&lt;br /&gt;
attr ozw672 get8Name statusKessel&lt;br /&gt;
attr ozw672 get8URL https://192.168.178.8/api/menutree/read_datapoint.json?SessionId=$sid&amp;amp;Id=1898&lt;br /&gt;
attr ozw672 get8Poll 1&lt;br /&gt;
attr ozw672 get8Regex Value&amp;quot;: &amp;quot;([a-zA-Zü ]*)&amp;quot;&lt;br /&gt;
attr ozw672 get8Map Aus:0, Nachlauf aktiv:5, Freigegeben für TWW:10, Freigegeben für HK:20, In Teillastbetrieb für TWW:40, In Teillastbetrieb für HK:50, In Betrieb für Trinkwasser:90, In Betrieb für Heizkreis:100&lt;br /&gt;
&lt;br /&gt;
attr ozw672 getRegex Value&amp;quot;: &amp;quot;[ ]*([-.0-9]*)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
attr ozw672 reAuthRegex .*session not valid.*&lt;br /&gt;
attr ozw672 sid1IDRegex .*&amp;quot;(.*-.*-.*-[0-9a-z]*).*&lt;br /&gt;
attr ozw672 sid1URL https://192.168.178.8/api/auth/login.json?user=test&amp;amp;pwd=test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced attributes ===&lt;br /&gt;
&lt;br /&gt;
;ReAuthRegex&lt;br /&gt;
:regular Expression to match an error page indicating that a session has expired and a new authentication for read access needs to be done. &lt;br /&gt;
:This attribute only makes sense if you need a forms based authentication for reading data and if you specify a multi step login procedure based on the sid.. attributes.&lt;br /&gt;
:This attribute is used for all requests. For set and get operations you can however specify individual reAuthRegexes with the [gs]et[0-9]*ReAuthRegex attributes.&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*URL&lt;br /&gt;
:different URLs or one common URL to be used for each step of an optional login procedure. &lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*IDRegex&lt;br /&gt;
:different Regexes per login procedure step or one common Regex for all steps to extract the session ID from the HTTP response&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*Data.*&lt;br /&gt;
:data part for each step to be sent as POST data to the corresponding URL&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*Header.*&lt;br /&gt;
:HTTP Headers to be sent to the URL for the corresponding step&lt;br /&gt;
&lt;br /&gt;
;sid[0-9]*IgnoreRedirects&lt;br /&gt;
:Tells the HttpUtils to not follow HTTP Redirects for this Request. Might be needed for some devices that set a session cookie within a 303 Redirect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Name&lt;br /&gt;
:Name of a set option&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*URL&lt;br /&gt;
:URL to be requested for the set option&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*Data&lt;br /&gt;
:Data to be sent to the device as POST data when the set is executed&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*Header&lt;br /&gt;
:HTTP Headers to be sent to the device when the set is executed&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Min&lt;br /&gt;
:Minimum value for input validation. &lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Max&lt;br /&gt;
:Maximum value for input validation. &lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Expr&lt;br /&gt;
:Perl Expression to compute the raw value to be sent to the device from the input value passed to the set.&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Map&lt;br /&gt;
:Map that defines a mapping from raw to visible values like &amp;quot;0:mittig, 1:oberhalb, 2:unterhalb&amp;quot;. This attribute atomatically creates a hint for FhemWEB so the user can choose one of the visible values or select a value with a slider.&lt;br /&gt;
&lt;br /&gt;
;set[0-9]+Hint&lt;br /&gt;
:Explicit hint for fhemWEB that will be returned when set ? is seen. Can be used to get a slider or a list of values to choose from.&lt;br /&gt;
&lt;br /&gt;
;set[0-9]*ReAuthRegex&lt;br /&gt;
:Regex that will detect when a session has expired an a new login needs to be performed.         &lt;br /&gt;
&lt;br /&gt;
;get[0-9]+Name&lt;br /&gt;
:Name of a get option and Reading to be retrieved / extracted&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*URL&lt;br /&gt;
:URL to be requested for the get option. If this option is missing, the URL specified during define will be used.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Data&lt;br /&gt;
:optional data to be sent to the device as POST data when the get is executed. if this attribute is not specified, an HTTP GET method will be used instead of an HTTP POST&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*NoData&lt;br /&gt;
:can be used to override a more generic attribute that specifies POST data for all get commands. With NoData no data is sent and therefor the request will be an HTTP GET.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Header&lt;br /&gt;
:optional HTTP Headers to be sent to the device when the get is executed&lt;br /&gt;
&lt;br /&gt;
;get[0-9]+Poll&lt;br /&gt;
:if set to 1 the get is executed automatically during the normal update cycle (after the interval provided in the define command has elapsed)&lt;br /&gt;
&lt;br /&gt;
;get[0-9]+PollDelay&lt;br /&gt;
:if the value should not be read in each iteration (after the interval given to the define command), then a minimum delay can be specified with this attribute. This has only an effect if the above Poll attribute has also been set. Every time the update function is called, it checks if since this get has been read the last time, the defined delay has elapsed. If not, then it is skipped this time.&lt;br /&gt;
:PollDelay can be specified as seconds or as x[0-9]+ which means a multiple of the interval in the define command.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Regex&lt;br /&gt;
:If this attribute is specified, the Regex defined here is used to extract the value from the HTTP Response and assign it to a Reading with the name defined in the get[0-9]+Name attribute.&lt;br /&gt;
:If this attribute is not specified for an individual Reading but as getRegex, then it applies to all get options where no specific Regex is defined.&lt;br /&gt;
:If neither a generic getRegex attribute nor a specific get[0-9]+Regex attribute is specified, then HTTPMOD tries all Regex / Reading pairs defined in Reading[0-9]+Name and Reading[0-9]+Regex attributes and assigns the Readings that match.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Expr&lt;br /&gt;
:this attribute behaves just like Reading[0-9]*Expr but is applied to a get value. &lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Map&lt;br /&gt;
:this attribute behaves just like Reading[0-9]*Map but is applied to a get value.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*Format&lt;br /&gt;
:this attribute behaves just like Reading[0-9]*Format but is applied to a get value.&lt;br /&gt;
&lt;br /&gt;
;get[0-9]*CheckAllReadings&lt;br /&gt;
:this attribute modifies the behavior of HTTPMOD when the HTTP Response of a get command is parsed.&lt;br /&gt;
:If this attribute is set to 1, then additionally to any matching of get specific regexes (get[0-9]*Regex), also all the Regex / Reading pairs defined in Reading[0-9]+Name and Reading[0-9]+Regex attributes are checked and if they match, the coresponding Readings are assigned as well.&lt;br /&gt;
&lt;br /&gt;
;replacement[0-9]*Regex&lt;br /&gt;
:Defines a replacement to be applied to an HTTP request header, data or URL before it is sent. This allows any part of the request to be modified based on a reading, an internal or an expression.&lt;br /&gt;
:The regex defines which part of a header, data or URL should be replaced. The replacement is defined with the following attributes:&lt;br /&gt;
&lt;br /&gt;
;replacement[0-9]*Mode&lt;br /&gt;
:Defines how the replacement should be done and what replacementValue means. Valid options are text, reading, interbal and expression.&lt;br /&gt;
&lt;br /&gt;
;replacement[0-9]*Value&lt;br /&gt;
:Defines the replacement. If the corresponding replacementMode is text, then value is a static text that is used as the replacement.&amp;lt;br&amp;gt;&lt;br /&gt;
:If replacementMode is reading then Value can be the name of a reading of this device or it can be a reading of a different device referred to by devicename:reading.&amp;lt;br&amp;gt;&lt;br /&gt;
:If replacementMode is internal the Value can be the name of an internal of this device or it can be an internal of a different device referred to by devicename:internal.&amp;lt;br&amp;gt;&lt;br /&gt;
:If replacementMode is expression the the Value is treated as a Perl expression that computes the replacement value. The expression can use $1, $2 and so on to refer to capture groups of the corresponding regex that is matched against the original URL, header or post data.&lt;br /&gt;
&lt;br /&gt;
;[gs]et[0-9]*Replacement[0-9]*Value&lt;br /&gt;
:This attribute can be used to override the replacement value for a specific get or set.&lt;br /&gt;
&lt;br /&gt;
;get|reading[0-9]*MaxAge&lt;br /&gt;
:Defines how long a reading is valid before it is automatically overwritten with a replacement when the read function is called the next time.&lt;br /&gt;
&lt;br /&gt;
;get|reading[0-9]*MaxAgeReplacement&lt;br /&gt;
:specifies the replacement for MaxAge - either as a static text or as a perl expression.&lt;br /&gt;
&lt;br /&gt;
;get|reading[0-9]*MaxAgeReplacementMode&lt;br /&gt;
:specifies how the replacement is interpreted: can be text and expression.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;showMatched&lt;br /&gt;
:if set to 1 then HTTPMOD will create a reading with the name MATCHED_READINGS &lt;br /&gt;
:that contains the names of all readings that could be matched in the last request.&lt;br /&gt;
&lt;br /&gt;
;showError&lt;br /&gt;
:if set to 1 then HTTPMOD will create a reading and event with the Name LAST_ERROR &lt;br /&gt;
:that contains the error message of the last error returned from HttpUtils. &lt;br /&gt;
&lt;br /&gt;
;queueDelay&lt;br /&gt;
:HTTP Requests will be sent from a queue in order to avoid blocking when several Requests have to be sent in sequence. This attribute defines the delay between calls to the function that handles the send queue. It defaults to one second.&lt;br /&gt;
&lt;br /&gt;
;queueMax&lt;br /&gt;
:Defines the maximum size of the send queue. If it is reached then further HTTP Requests will be dropped and not be added to the queue&lt;br /&gt;
&lt;br /&gt;
;minSendDelay&lt;br /&gt;
:Defines the minimum time between two HTTP Requests.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Beispiel: [[Wetter_und_Wettervorhersagen#Wetter_von_Weather_Underground|Wetter von WeatherUnderground auslesen]]&lt;br /&gt;
* {{Link2Forum|Topic=17804|LinkText=Thread}} in Fhem Forum that discusses the first version of this module &lt;br /&gt;
* [http://perldoc.perl.org/perlretut.html Introduction to regular expressions]&lt;br /&gt;
* [http://portswigger.net/burp/ BurpSuite]: Tool (local proxy) to help analyze http traffic&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IP Components]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13397</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13397"/>
		<updated>2015-12-30T13:27:19Z</updated>

		<summary type="html">&lt;p&gt;SirUli: /* autocreate */ Eine Codestelle vergessen, sorry :/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zusätzlichen Gruppen, in welchen sich die devices sonst noch befinden, bleiben unberührt. Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden. Es sollte nur aufgepasst werden, wenn ein &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13396</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13396"/>
		<updated>2015-12-30T13:26:35Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Formatierung und hinzufügen der renamehm funktion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zusätzlichen Gruppen, in welchen sich die devices sonst noch befinden, bleiben unberührt. Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden. Es sollte nur aufgepasst werden, wenn ein &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:570px;&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_einrichten&amp;diff=13380</id>
		<title>Homebridge einrichten</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_einrichten&amp;diff=13380"/>
		<updated>2015-12-28T14:43:43Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Überarbeitung des Wiki-Eintrags mit aktuellen Hinweisen und ein paar Neusortierungen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses HOWTO zeigt die Installation und Erstinbetriebnahme von Homebridge. &lt;br /&gt;
&lt;br /&gt;
Damit kann Siri benutzt werden, um FHEM-Devices zu steuern. So können Devices angesprochen werden, die offiziell HomeKit nicht unterstützen (die Vorgehensweise wurde auf einem Intel NUC mit Ubuntu Server 14.04 LTS und auf einem Raspberry Pi mit Raspian getestet). Der WIKI-Eintrag bezieht sich hauptsächlich auf eine {{Link2Forum|Topic=32652|LinkText=Diskussion im FHEM-Forum}}. Ein Riesendank gilt vor allem {{Link2FU|430|Andre (justme1968)}}.&lt;br /&gt;
&lt;br /&gt;
Eine Sammlung funktionsfähiger Homebridge FHEM Konfiguration kann hier gefunden werden: [[Hombridge User Configs]]. Die Sammlung befindet sich noch im Aufbau.&lt;br /&gt;
&lt;br /&gt;
= Vorbereitung der Umgebung =&lt;br /&gt;
&lt;br /&gt;
== NodeJS installieren ==&lt;br /&gt;
&#039;&#039;Die nachfolgenden Befehle sind alle mit &amp;quot;sudo&amp;quot; prefixed. Wenn du unter &amp;quot;root&amp;quot; arbeitest oder deine Distribution einen anderen Mechanismus verwendet, so kannst du dies natürlich weglassen.&#039;&#039;&lt;br /&gt;
&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;
Damit ist NodeJS installiert.&lt;br /&gt;
&lt;br /&gt;
== Python, g++, MDNS installieren ==&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 install python g++ libavahi-compat-libdnssd-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Voraussetzungen geschaffen.&lt;br /&gt;
&lt;br /&gt;
= Installation von Homebridge &amp;amp; notwendiger Shims =&lt;br /&gt;
Im Nachfolgenden Absatz wird die Installation von Homebridge sowie des notwendigen Plugins (Shim) für FHEM erläutert.&lt;br /&gt;
&lt;br /&gt;
== Homebridge installieren ==&lt;br /&gt;
Die aktuelle Homebridge version wird mit&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert, was eine Weile dauert. Anschließend wird der FHEM platform shim mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:60%;&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g homebridge-fhem&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert.&lt;br /&gt;
&lt;br /&gt;
=== Fehler während der Installation ===&lt;br /&gt;
Bei folgendem Fehler ist das abrufen von Github nicht möglich.&lt;br /&gt;
&amp;lt;pre&amp;gt;npm ERR! git clone --template=/home/hs-server-admin/.npm/_git-remotes/_templates --mirror &lt;br /&gt;
git://github.com/KhaosT/ed25519.git /home/hs-server-admin/.npm/_git-remotes/git-github-com-KhaosT-ed25519-git-d8bdee1d: &lt;br /&gt;
github.com[0: 192.30.252.128]: errno=Die Wartezeit für die Verbindung ist abgelaufen&amp;lt;/pre&amp;gt;&lt;br /&gt;
Fehlerursache konnte hier durch eine aktive Firewall verursacht werden.&lt;br /&gt;
&lt;br /&gt;
= Homebridge konfigurieren =&lt;br /&gt;
&#039;&#039;Wichtig: Für die weiteren Schritte sollte man nicht root verwenden, sondern beispielsweise einen dedizieren Nutzer für homebridge oder der Einfachheit halber den Nutzer unter dem auch FHEM läuft (meist &amp;quot;fhem&amp;quot;).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einstellungen für homebridge ==&lt;br /&gt;
&lt;br /&gt;
Zunächst wird das Verzeichnis für die Konfigurationsdatei erstellt und in dieses gewechselt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/.homebridge&lt;br /&gt;
cd ~/.homebridge/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss darin noch die config.json erstellt bzw. angepasst werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
nano ~/.homebridge/config.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise zur Konfiguration:&lt;br /&gt;
* &amp;quot;&#039;&#039;bridge&#039;&#039;&amp;quot;:&lt;br /&gt;
** &amp;quot;&#039;&#039;username&#039;&#039;&amp;quot;: Sollte so belassen werden. Sollte später auf dem iOS Device keine Homebridge gefunden werden, so kann man hier beispielsweise den String auf 31 statt 30 enden lassen um so eine neue Homebridge vorzutäuschen.&lt;br /&gt;
** &amp;quot;&#039;&#039;port&#039;&#039;&amp;quot;: Sollte so belassen werden&lt;br /&gt;
** &amp;quot;&#039;&#039;pin&#039;&#039;&amp;quot;: Der PIN kann beliebig in dem Format xxx-xx-xxx angepasst werden. Dieser muss nur einmal bei der Einrichtung in iOS eingegeben werden.&lt;br /&gt;
* &amp;quot;&#039;&#039;platforms&#039;&#039;&amp;quot;: &lt;br /&gt;
** &amp;quot;&#039;&#039;platform&#039;&#039;&amp;quot;: Hier muss &amp;quot;homebridge-fhem.fhem&amp;quot; beibehalten werden.&lt;br /&gt;
** &amp;quot;&#039;&#039;server&#039;&#039;&amp;quot;: Hier muss die IP des FHEM-Servers eingetragen werden. Dabei muss Homebridge nicht auf dem selben Server laufen wie FHEM, kann aber. Wenn es auf dem gleichen Rechner läuft, dann bietet es sich an, die IP 127.0.0.1 zu verwenden.&lt;br /&gt;
** &amp;quot;&#039;&#039;port&#039;&#039;&amp;quot;: Hier muss der Port des gewählten FHEMWEBS eingetragen werden (muss nicht das &amp;quot;normale&amp;quot; sein, kann eine extra Instanz sein)&lt;br /&gt;
** &amp;quot;&#039;&#039;auth&#039;&#039;&amp;quot;: Ist FHEM nicht mit Nutzername/Password abgesichert, so kann man diese Zeile einfach entfernen.&lt;br /&gt;
** &amp;quot;&#039;&#039;filter&#039;&#039;&amp;quot;: Damit nicht alle Devices von Homebridge berücksichtigt werden, bietet es sich an, die Devices zu filtern. In diesem Beispiel wurden alle Devices, die über Siri steuerbar sein sollen, zusätzlich in den Raum Homekit konfiguriert.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;bridge&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Homebridge&amp;quot;,&lt;br /&gt;
        &amp;quot;username&amp;quot;: &amp;quot;CC:22:3D:E3:CE:30&amp;quot;,&lt;br /&gt;
        &amp;quot;port&amp;quot;: 51826,&lt;br /&gt;
        &amp;quot;pin&amp;quot;: &amp;quot;031-45-154&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;platforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;platform&amp;quot;: &amp;quot;homebridge-fhem.FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;server&amp;quot;: &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: &amp;quot;8083&amp;quot;,&lt;br /&gt;
            &amp;quot;auth&amp;quot;: {&amp;quot;user&amp;quot;: &amp;quot;FhemUser&amp;quot;, &amp;quot;pass&amp;quot;: &amp;quot;XXX&amp;quot;},&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;room=Homekit&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
     ],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;accessories&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird FHEM mit SSL abgesichert, so muss zusätzlich in der Sektion &amp;quot;platforms&amp;quot; noch diese Zeile (nach &amp;quot;port&amp;quot;) eingefügt werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;quot;ssl&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FHEM konfigurieren =&lt;br /&gt;
Um die Devices richtig mit FHEM und Homebridge vertraut zu machen, müssen wir noch unter dem &#039;&#039;global&#039;&#039;-Device das folgende userattr hinzufügen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
genericDeviceType:ignore,switch,outlet,light,blind,speaker,thermostat,ignore,lock,window,contact&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das geht am einfachsten via Eingabefeld (nicht in der fhem.cfg):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
{ addToAttrList(&amp;quot;genericDeviceType:ignore,switch,outlet,light,blind,speaker,thermostat,ignore,lock,window,contact&amp;quot;) }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich &#039;&#039;&#039;kann&#039;&#039;&#039; man an bestimmten Devices noch einen subtype setzen (beispielsweise Thermostaten, Rolladenschaltern oder HM-Fensteröffnersensoren). Dazu erstellt man im Device (hier als Beispiel DEIN.DEVICE als Name) zunächst das userattr &amp;quot;subtype&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
{ addToDevAttrList(&amp;quot;DEIN.DEVICE&amp;quot;, &amp;quot;subtype:thermostat,blindActuator,threeStateSensor&amp;quot;) }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wenn DEIN.DEVICE nun ein HM-CC-RT-DN ist, so wählt man dann in den Attributen einfach als &#039;&#039;subtype&#039;&#039; eben &#039;&#039;thermostat&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Start von Homebridge =&lt;br /&gt;
&lt;br /&gt;
== Hinweis ==&lt;br /&gt;
Nach allen Änderungen die in FHEM gemacht werden, welche Homebridge betreffen, muss Homebridge neu gestartet werden. Wie der Neustart erfolgen muss, ist abhängig davon, wie man Homebridge gestartet hat. Bitte den entsprechenden Methoden entnehmen.&lt;br /&gt;
&lt;br /&gt;
== Einmaliger Manueller Start ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Homebridge sollte nun laufen. Hier kann man die Kommunikation nachverfolgen. Abbrechen kann das ganze mit CTRL+c (es dann auch keine Befehle mehr mit Siri möglich). Damit Siri auch Befehle ohne ständig offenes Terminal bearbeiten kann, bitten nächsten Punkt beachten.&lt;br /&gt;
&lt;br /&gt;
== Homebridge automatisch starten ==&lt;br /&gt;
Es gibt verschiedene Methoden, Homebridge automatisch zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Steuerung via FHEM ===&lt;br /&gt;
Auf Basis der unten stehenden &#039;&#039;Alternativen Methode&#039;&#039; wurde eine Version entwickelt, mit der man auch den Status einsehen und den Restart des Dienstes aus FHEM heraus erledigen kann. Diese Version ist auf der Seite [[Homebridge Start und Status in FHEM]] im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Methode ===&lt;br /&gt;
Dies startet homebridge als einen Service.&lt;br /&gt;
&lt;br /&gt;
==== Service anlegen ====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo nano /etc/init.d/homebridge&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code einfügen (startet den Homebridge Server als Benutzer &amp;quot;pi&amp;quot; und nimmt an, dass sich .homebridge/config.json in seinem Homeverzeichnis unter /home/pi/ befindet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides: homebridge&lt;br /&gt;
# Required-Start: $network $remote_fs $syslog&lt;br /&gt;
# Required-Stop: $remote_fs $syslog&lt;br /&gt;
# Default-Start: 2 3 4 5&lt;br /&gt;
# Default-Stop: 0 1 6&lt;br /&gt;
# Short-Description: Start daemon at boot time for homebridge&lt;br /&gt;
# Description: Enable service provided by daemon.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
export PATH=$PATH:/usr/local/bin&lt;br /&gt;
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules&lt;br /&gt;
PID=`pidof homebridge`&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
start)&lt;br /&gt;
if ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is already running&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        su - pi -c &amp;quot;homebridge &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Homebridge starting&amp;quot;&lt;br /&gt;
        $0 status&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
stop)&lt;br /&gt;
if ! ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is not running&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        kill $PID&lt;br /&gt;
        echo &amp;quot;Homebridge closed&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
restart)&lt;br /&gt;
if ! ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        $0 start&lt;br /&gt;
else&lt;br /&gt;
        $0 stop&lt;br /&gt;
        $0 start&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
status)&lt;br /&gt;
if ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is running PID $PID&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        echo &amp;quot;Homebridge is not running&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
*)&lt;br /&gt;
echo &amp;quot;Usage: $0 {start|stop|status|restart}&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
;;&lt;br /&gt;
esac&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Autostart aktivieren ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo chmod 755 /etc/init.d/homebridge&lt;br /&gt;
&lt;br /&gt;
sudo update-rc.d homebridge defaults&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo service homebridge start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo /etc/init.d/homebridge start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Dienst starten&lt;br /&gt;
&lt;br /&gt;
== FHEM Device Einstellungen ==&lt;br /&gt;
Damit die zu schaltenden Geräte überhaupt in der Homebridge aufgenommen werden muss man sie im Raum Homekit hinzufügen.&lt;br /&gt;
&lt;br /&gt;
Um HM-CC-RT-DN Thermostate steuern zu können, muss wie oben beschrieben folgendes attribute gesetzt werden (hier als Beispiel das Device &amp;quot;Heizung&amp;quot;):&lt;br /&gt;
# attr Heizung subtype thermostat&lt;br /&gt;
Für einen Dummy muss man den genericDeviceType setzen, also beispielsweise:&lt;br /&gt;
# attr Dummy genericDeviceType switch&lt;br /&gt;
# attr Dummy setList on off&lt;br /&gt;
&lt;br /&gt;
Wie bereits vorher angemerkt: Fügt man ein Device hinzu oder führt eine Änderung an einem Device durch, so sollte homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
= HomeKit in iOS =&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
Um FHEM über Homebridge in iOS nutzen zu können, muss HomeKit eingerichtet werden. &lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Apps. Im folgenden wird die App EVE von Elgato empfohlen, die aus dem App-Store geladen werden muss.&lt;br /&gt;
In der App auf:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
Gerät hinzufügen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es sollte ein Gerät mit der Bezeichnung &amp;quot;Homebridge&amp;quot; zur Auswahl erscheinen. Zur Ersteinrichtung auf PIN manuell eingeben gehen und (falls in der config.json nicht geändert):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
031-45-154&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
Im Anschluss können die Devices nach Belieben in verschiedene Räume zugeteilt werden, sowie Szenen und Bereiche erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Siri ==&lt;br /&gt;
&#039;&#039;&#039;HolyMoly&#039;&#039;&#039; aus dem FHEM-Forum hat ein paar Beispiele gegeben, wie man Siri dazu bringt Devices zu schalten:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Schalte alle Lampen im Obergeschoss ein.&amp;quot;&lt;br /&gt;
&amp;quot;Schalte Chloes Licht aus.&amp;quot;&lt;br /&gt;
&amp;quot;Dimme das Licht in der Küche.&amp;quot;&lt;br /&gt;
&amp;quot;Dimme das Licht im Esszimmer auf 50 %.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle das Licht in der Küche am hellsten ein.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle die Temperatur im Tahoe-Haus auf 22 °C ein.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle das Thermostat im Erdgeschoss auf 21 °C ein.&lt;br /&gt;
&amp;quot;Schalte den Drucker im Büro ein.&amp;quot;&lt;br /&gt;
&amp;quot;Siri, bereite alles für eine Party vor.&amp;quot;&lt;br /&gt;
&amp;quot;Bereite das Ambiente fürs Abendessen vor.&amp;quot;&lt;br /&gt;
&amp;quot;Aktiviere den Nachtruhemodus.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann Siri auch noch die Lichtfarbe von LEDs ändern.&lt;br /&gt;
&lt;br /&gt;
= Hinweise =&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Das Fhem Plugin von {{Link2FU|430|Andre (justme1968)}} unterstützt folgende Geräte&lt;br /&gt;
&lt;br /&gt;
    switches (devices with set on and set off commands)&lt;br /&gt;
    lights (devices with set on and set off commands)&lt;br /&gt;
    homematc and FS20 dimmers (devices with set on, set off and set dim or set pct commands)&lt;br /&gt;
    HUE, WifiLight, SWAP_0000002200000003 (hue, sat, bri, rgb)&lt;br /&gt;
    homematic, max and pid20 thermostats&lt;br /&gt;
    homematic blinds&lt;br /&gt;
    homematic, MAX and FHTTK contact sensors (door, window)&lt;br /&gt;
    HM-SEC-WIN, HM-SEC-KEY&lt;br /&gt;
    presence, ROOMMATE&lt;br /&gt;
    SONOS (power, volume)&lt;br /&gt;
    harmony scenes&lt;br /&gt;
    temperaturecw and humidity sensors&lt;br /&gt;
    CO20 air quality sensor&lt;br /&gt;
    probably some more ...&lt;br /&gt;
&lt;br /&gt;
== Steuerung von MiLight Allgemein ==&lt;br /&gt;
Wie hier im {{Link2Forum|Topic=32652|Message=351706|LinkText=Forum}} erwähnt, ist es möglich auch MiLight Geräte per Siri anzusprechen. Hierzu muss die config.json angepasst werden.&lt;br /&gt;
&lt;br /&gt;
1. Es muss die Bridge hinterlegt werden. Beispiel&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;platform&amp;quot;: &amp;quot;MiLight&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;MiLight&amp;quot;,&lt;br /&gt;
            &amp;quot;ip_address&amp;quot;: &amp;quot;192.168.001.033&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 8899,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;rgbw&amp;quot;,&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 30,&lt;br /&gt;
            &amp;quot;repeat&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;zones&amp;quot;:[&amp;quot;Wohnzimmer Lampen&amp;quot;,&amp;quot;Badezimmer Lampen&amp;quot;,&amp;quot;Büro Lampen&amp;quot;,&amp;quot;Keller Lampen&amp;quot;]&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Es muss für jedes zu Steuernde Gerät ein Dummy angelegt werden. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;accessory&amp;quot;: &amp;quot;Http&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Kitchen Lamp&amp;quot;,&lt;br /&gt;
            &amp;quot;on_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/on&amp;quot;,&lt;br /&gt;
            &amp;quot;off_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/off&amp;quot;,&lt;br /&gt;
            &amp;quot;brightness_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/brightness/%b&amp;quot;,&lt;br /&gt;
            &amp;quot;http_method&amp;quot;: &amp;quot;POST&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweis für alte homebridge Versionen ==&lt;br /&gt;
UPDATE: Homebridge funktioniert mit einer kleinen Einschränkung nun auch mit node 4.0.0. Laut&lt;br /&gt;
[https://github.com/cflurin/homebridge-shims/wiki/Minimalist-Homebridge-on-a-Raspberry-Pi Homebridge on a Raspberry Pi] müssen die folgenden Abhängigkeiten (Dependencies) aus der &#039;&#039;&#039;package.json&#039;&#039;&#039; entfernt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;harmonyhubjs-client&amp;quot;: &amp;quot;^1.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-discover&amp;quot;: &amp;quot;git+https://github.com/swissmanu/harmonyhubjs-discover.git&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweis zur Geschwindigkeitsoptimierung auf einem Raspberry PI ==&lt;br /&gt;
&lt;br /&gt;
Damit es auf einem Raspberry schneller läuft, wird darüber hinaus empfohlen auch diverse Abhängigkeiten aus der &#039;&#039;&#039;package.json&#039;&#039;&#039; zu entfernen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;ad2usb&amp;quot;: &amp;quot;git+https://github.com/alistairg/node-ad2usb.git#local&amp;quot;,&lt;br /&gt;
&amp;quot;carwingsjs&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
&amp;quot;chokidar&amp;quot;: &amp;quot;^1.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;eibd&amp;quot;: &amp;quot;^0.3.1&amp;quot;,&lt;br /&gt;
&amp;quot;elkington&amp;quot;: &amp;quot;kevinohara80/elkington&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-client&amp;quot;: &amp;quot;^1.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-discover&amp;quot;: &amp;quot;git+https://github.com/swissmanu/harmonyhubjs-discover.git&amp;quot;,&lt;br /&gt;
&amp;quot;lifx-api&amp;quot;: &amp;quot;^1.0.1&amp;quot;,&lt;br /&gt;
&amp;quot;lifx&amp;quot;: &amp;quot;git+https://github.com/magicmonkey/lifxjs.git&amp;quot;,&lt;br /&gt;
&amp;quot;node-hue-api&amp;quot;: &amp;quot;^1.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;node-icontrol&amp;quot;: &amp;quot;^0.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;node-milight-promise&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
&amp;quot;tough-cookie&amp;quot;: &amp;quot;^2.0.0&amp;quot;,&lt;br /&gt;
&amp;quot;sonos&amp;quot;: &amp;quot;0.8.x&amp;quot;,&lt;br /&gt;
&amp;quot;telldus-live&amp;quot;: &amp;quot;0.2.x&amp;quot;,&lt;br /&gt;
&amp;quot;teslams&amp;quot;: &amp;quot;1.0.1&amp;quot;,&lt;br /&gt;
&amp;quot;unofficial-nest-api&amp;quot;: &amp;quot;git+https://github.com/hachidorii/unofficial_nodejs_nest.git#d8d48edc952b049ff6320ef99afa7b2f04cdee98&amp;quot;,&lt;br /&gt;
&amp;quot;wemo&amp;quot;: &amp;quot;0.2.x&amp;quot;,&lt;br /&gt;
&amp;quot;wink-js&amp;quot;: &amp;quot;0.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;komponist&amp;quot; : &amp;quot;0.1.0&amp;quot;,&lt;br /&gt;
&amp;quot;yamaha-nodejs&amp;quot;: &amp;quot;0.4.x&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daher zunächst ein ein Backup der Datei anlegen &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo cp package.json package.json.bkp &amp;lt;/pre&amp;gt;&lt;br /&gt;
Am einfachsten geht das entfernen der Zeilen einem Editor, beispielsweise nano oder vi.&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano package.json&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das config file sollte dann wie folgt aussehen: Achtung vor den letzten zwei &amp;quot;}&amp;quot; am Ende darf kein Komma sein.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;homebridge&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;HomeKit support for the impatient&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;0.1.1&amp;quot;,&lt;br /&gt;
  &amp;quot;scripts&amp;quot;: {&lt;br /&gt;
    &amp;quot;start&amp;quot;: &amp;quot;DEBUG=* node app.js || true&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;repository&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;git&amp;quot;,&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;git://github.com/nfarina/homebridge.git&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;license&amp;quot;: &amp;quot;ISC&amp;quot;,&lt;br /&gt;
  &amp;quot;dependencies&amp;quot;: {&lt;br /&gt;
    &amp;quot;async&amp;quot;: &amp;quot;^1.4.2&amp;quot;,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;0.10.x&amp;quot;,&lt;br /&gt;
    &amp;quot;debug&amp;quot;: &amp;quot;^2.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;hap-nodejs&amp;quot;: &amp;quot;^0.0.2&amp;quot;,&lt;br /&gt;
    &amp;quot;isy-js&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;mdns&amp;quot;: &amp;quot;^2.2.4&amp;quot;,&lt;br /&gt;
    &amp;quot;netatmo&amp;quot;: &amp;quot;1.3.0&amp;quot;,&lt;br /&gt;
    &amp;quot;node-cache&amp;quot;: &amp;quot;3.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;node-persist&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
    &amp;quot;node-xmpp-client&amp;quot;: &amp;quot;1.0.0-alpha23&amp;quot;,&lt;br /&gt;
    &amp;quot;q&amp;quot;: &amp;quot;1.4.x&amp;quot;,&lt;br /&gt;
    &amp;quot;queue&amp;quot;: &amp;quot;^3.1.0&amp;quot;,&lt;br /&gt;
    &amp;quot;request&amp;quot;: &amp;quot;2.49.x&amp;quot;,&lt;br /&gt;
    &amp;quot;xml2js&amp;quot;: &amp;quot;0.4.x&amp;quot;,&lt;br /&gt;
    &amp;quot;xmldoc&amp;quot;: &amp;quot;0.1.x&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Modul_Alarm&amp;diff=13377</id>
		<title>Modul Alarm</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Modul_Alarm&amp;diff=13377"/>
		<updated>2015-12-28T12:41:19Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Absicherung des global Attributes gegen dummies und ein paar Formatierungen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul stellt eine komfortable Oberfläche bereit, um per Webinterface Sensoren mit Aktionen zu verknüpfen - und zwar nur innerhalb bestimmter Zeitfenster sowie an- und abschaltbar&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=Alarm&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=95_Alarm.pm&lt;br /&gt;
|ModOwner=Prof. Dr. Peter Henning&lt;br /&gt;
}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 95_Alarm.pm.&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Das Modul &#039;&#039;95_Alarm.pm&#039;&#039; stellt eine komfortable Oberfläche bereit, um per Webinterface bestimmte auslösende Elemente (nachfolgend &#039;Sensoren&#039; genannt) mit bestimmten Aktionen (nachfolgend &#039;Aktoren&#039; genannt) zu verknüpfen - und zwar nur innerhalb bestimmter Zeitfenster sowie an- und abschaltbar (&amp;quot;scharf/armed&amp;quot; bzw. &amp;quot;unscharf/disarmed&amp;quot;). Diese Verknüpfungen werden als &amp;quot;normale&amp;quot; FHEM-Definitionen gespeichert.&lt;br /&gt;
==Erste Schritte==&lt;br /&gt;
Damit FHEM-Devices als Aktoren oder Sensoren für die Alarmanlage genutzt werden können, müssen zwei neue globale Attribute namens &amp;lt;nowiki&amp;gt;alarmDevice&amp;lt;/nowiki&amp;gt; und &amp;lt;nowiki&amp;gt;alarmSettings&amp;lt;/nowiki&amp;gt; eingeführt werden. Dazu muss in der Grundkonfiguration von FHEM die Definition der nutzerspezifischen Attribute via &#039;&#039;userattr&#039;&#039; angepasst werden. Bei Konfiguration über FHEMWEB ist es ratsam dazu die folgenden beiden Befehle zu nutzen:&lt;br /&gt;
&lt;br /&gt;
 { addToAttrList(&amp;quot;alarmDevice:Actor,Sensor&amp;quot;) }&lt;br /&gt;
 { addToAttrList(&amp;quot;alarmSettings&amp;quot;) } &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternativ:&#039;&#039;&#039; Möchte man dies direkt im &#039;&#039;global&#039;&#039; device ändern, so sollten die weiteren Attribute beibehalten werden, dies sieht etwa so aus:&lt;br /&gt;
&lt;br /&gt;
 attr global userattr &#039;&#039;&#039;alarmDevice:Actor,Sensor alarmSettings&#039;&#039;&#039; devStateIcon devStateStyle ...&#039;&#039;(hier folgen weitere Attribute)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zur Erläuterung:&lt;br /&gt;
*Soll ein FHEM-Device als Sensor für die Alarmanlage genutzt werden, wird der Wert seines &#039;&#039;alarmDevice&#039;&#039;-Attributes auf &#039;Sensor&#039; gesetzt.&lt;br /&gt;
*Soll ein FHEM-Device als Aktor für die Alarmanlage genutzt werden, wird der Wert seines &#039;&#039;alarmDevice&#039;&#039;-Attributes auf &#039;Actor&#039; gesetzt&lt;br /&gt;
*Das Attribut &#039;&#039;alarmSettings&#039;&#039; wird beim Setzen der Alarme auf der Alarmkonfigurationsseite automatisch befüllt.&lt;br /&gt;
Ferner muss das Modul &#039;&#039;95_Alarm.pm&#039;&#039; im Modulpfad installiert werden, ebenso die JavaScript-Datei &#039;&#039;alarm.js&#039;&#039; in www/pgm2.&lt;br /&gt;
==Definition==&lt;br /&gt;
Die Alarmanlage - hier mit dem Namen &#039;&#039;AAA&#039;&#039; versehen - selbst wird über&lt;br /&gt;
 define AAA Alarm&lt;br /&gt;
definiert. Die legt einen versteckten Raum &amp;quot;AlarmRoom&amp;quot; an, welcher über einen Weblink im oberen Menü des Webinterfaces erreichbar ist&lt;br /&gt;
*Es wird ein weiterer Raum benötigt, der in der gegenwärtigen Fassung des Moduls den Namen &#039;&#039;Alarm&#039;&#039; trägt. Dieser wird automatisch erstellt, sobald die Alarme wie unten konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
Beim Anklicken des Begriffes &#039;&#039;Alarms&#039;&#039; im oberen Menü des Webinterfaces wird die Alarmkonfiguration angezeigt.  &lt;br /&gt;
===Settings===&lt;br /&gt;
Im oberen Bereich sind drei Eingabefelder zu sehen:&lt;br /&gt;
*&#039;&#039;Wait Action&#039;&#039; ist ein FHEM-Befehl, der beim Scharfschalten des Alarms ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarmanlage wird in Kürze scharf geschaltet&#039;&#039;.&lt;br /&gt;
*&#039;&#039;Arm Delay&#039;&#039; ist eine Verzögerungszeit, die zwischen dem Scharfschalten des Alarms und der tatsächlichen Wirksamkeit vergeht. Diese Zeit kann beispielsweise genutzt werden, um das Haus ohne Auslösung des Alarms zu verlassen.  &lt;br /&gt;
*&#039;&#039;Arm Action&#039;&#039; ist ein FHEM-Befehl, der beim Scharfschalten ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarmanlage scharf geschaltet&#039;&#039;.&lt;br /&gt;
*&#039;&#039;Disarm Action&#039;&#039; ist ein FHEM-Befehl, der beim Unscharfschalten ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarmanlage unscharf geschaltet&#039;&#039;.&lt;br /&gt;
*&#039;&#039;Cancel Action&#039;&#039; ist ein FHEM-Befehl, der beim Widerrufen eines Alarms ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarm widerrufen&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_settings.png]]&lt;br /&gt;
&lt;br /&gt;
8 Alarmlevel sind für das Modul normalerweise möglich (kann durch Setzen eines einzelnen Parameters im Modulcode verändert werden).&lt;br /&gt;
In der Tabelle &#039;Settings&#039; können für jeden Level die Startzeit &#039;&#039;ts&#039;&#039; und Endzeit &#039;&#039;te&#039;&#039; des Alarmlevels gesetzt werden. Formate für die Zeitangabe können sein:&lt;br /&gt;
* hh:mm - direkte Eingabe einer festen Zeit.&lt;br /&gt;
* {&#039;&#039;funktion&#039;&#039;} - eine beliebige Perl-Funktion in geschweiften Klammern, die einen gültigen Zeitwert hh:mm zurückliefert. Die Gültigkeit wird erst zur Laufzeit überprüft. Beispielsweise  &amp;quot;30 Minuten vor Sonnenuntergang&amp;quot; als {sunset_abs(-1800)}. &lt;br /&gt;
Diese Aktivierungszeiten wirken sich wie folgt auf den Alarmlevel aus:&lt;br /&gt;
*Wenn  &#039;&#039;ts&#039;&#039; &amp;lt; &#039;&#039;te&#039;&#039;, ist dieser Alarmlevel aktiv, falls &#039;&#039;ts&#039;&#039; &amp;lt; Zeit &amp;lt; &#039;&#039;te&#039;&#039;.&lt;br /&gt;
*Wenn  &#039;&#039;ts&#039;&#039; &amp;gt;= &#039;&#039;te&#039;&#039;, ist dieser Alarmlevel aktiv, falls &#039;&#039;ts&#039;&#039; &amp;lt; Zeit &amp;lt;= 23:59 sowie wenn 0:00 &amp;lt; Zeit &amp;lt;= &#039;&#039;te&#039;&#039;.&lt;br /&gt;
Ferner kann für jeden Alarmlevel gesetzt oder bedient werden&lt;br /&gt;
*Eine Nachricht zur Erläuterung des Alarms (Teil 2)&lt;br /&gt;
*Eine Checkbox &#039;&#039;Armed&#039;&#039; = scharf&lt;br /&gt;
*Ein Button &#039;&#039;Cancel&#039;&#039; zum Canceln = Aufheben des Alarms&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
Danach wird die Tabelle der Sensoren angezeigt. Für jeden Sensor kann gesetzt werden:&lt;br /&gt;
*Alarmlevel, die hierdurch ausgelöst werden&lt;br /&gt;
*Ein regulärer Ausdruck, bei dessen Erkennung die Auslösung erfolgt &lt;br /&gt;
*Eine Nachricht zur Erläuterung des Alarms (Teil 1)&lt;br /&gt;
*Ein Selektor, um festzulegen, ob dieser Sensor den Alarm &lt;br /&gt;
**auslöst (=Raise),&lt;br /&gt;
**widerruft (=Cancel),&lt;br /&gt;
**scharf schaltet (=Arm) oder&lt;br /&gt;
**unscharf schaltet (=Disarm).&lt;br /&gt;
&#039;&#039;&#039;Achtung: Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die insgesamt in den &#039;&#039;STATE&#039;&#039; der Alarmanlage geschriebene Nachricht besteht dann aus&lt;br /&gt;
 (Anzeige der Zustände) (Nachricht Teil 1)&#039; &#039;(Nachricht Teil 2).&lt;br /&gt;
Bitte weiter unten nachlesen, was mit der [[#Anzeige der Zustände|Anzeige der Zustände]] gemeint ist.&lt;br /&gt;
In diesen Nachrichten werden die folgenden Ersetzungen vorgenommen&lt;br /&gt;
* $NAME vird durch den Namen des auslösenden Devices ersetzt&lt;br /&gt;
* $EVENT wird durch den kompletten Event ersetzt&lt;br /&gt;
* $EVTPART1... wird durch den 1. Teilstring des Events gefüllt, etc.&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_sensors.png]]&lt;br /&gt;
&lt;br /&gt;
===Actors===&lt;br /&gt;
Anschließend wird die Tabelle der Aktoren angezeigt. Für jeden Aktor kann gesetzt werden: &lt;br /&gt;
*Alarmlevel, die diesen Aktor starten&lt;br /&gt;
*Ein FHEM-Kommando zum Starten des Aktors&lt;br /&gt;
*Ein FHEM-Kommando zum Stoppen des Aktors&lt;br /&gt;
*Eine Zeitverzögerung  - entweder als Angabe von Sekunden (&amp;lt;60) oder im Format mm:ss&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_actors.png]]&lt;br /&gt;
&lt;br /&gt;
==Einrichten==&lt;br /&gt;
Durch Anklicken des Buttons &#039;&#039;Set Alarms&#039;&#039; werden die &#039;&#039;alarmSettings&#039;&#039;-Attribute befüllt. &lt;br /&gt;
&#039;&#039;&#039;Achtung, Folgendes beachten&#039;&#039;&#039;&lt;br /&gt;
*Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.&lt;br /&gt;
*Der Button &#039;&#039;Set Alarms&#039;&#039; wird nur funktionieren, wenn keine [[#Sperrung|Sperrung]] vorliegt, siehe unten.&lt;br /&gt;
*Es empfiehlt sich, danach ein &#039;&#039;Save Config&#039;&#039; auszuführen, damit die Attribute und Notifier permanent sind.&lt;br /&gt;
&lt;br /&gt;
===Anzeige der Zustände===&lt;br /&gt;
Auf Wunsch können die Zustände der Alarmanlage zusammen mit der konkreten Meldung im internal &#039;&#039;STATE&#039;&#039; (bzw. reading &#039;&#039;state&#039;&#039;, beide sind in diesem Modul identisch) angezeigt werden.&lt;br /&gt;
Hierfür gibt es ein Attribut &#039;&#039;statedisplay&#039;&#039; mit den folgenden möglichen Werten, die nachfolgend am Beispiel für den Zustand &amp;quot;Alarm Level 1 ausgelöst&amp;quot; erläutert sind:&lt;br /&gt;
* &#039;&#039;none&#039;&#039; - keine Anzeige&lt;br /&gt;
* &#039;&#039;simple&#039;&#039; - OXOOOOOO&lt;br /&gt;
* &#039;&#039;color&#039;&#039; - &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 0 &amp;lt;span style=&amp;quot;width:1ex;color:red&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; 2 3 4 5 6 7&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;table&#039;&#039;&amp;amp;nbsp;-&amp;amp;nbsp;&amp;lt;table&amp;gt;&amp;lt;tr style=&amp;quot;height:1ex&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:red&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Problem ist, dass möglicherweise das internal &#039;&#039;STATE&#039;&#039; an anderer Stelle verwendet werden soll - z.B. beim Versenden von Mails als &lt;br /&gt;
 Value(&#039;AAA&#039;)&lt;br /&gt;
Es macht natürlich keinen Sinn, eine HTML-Tabelle in eine Mail zu packen. Deshalb sollte für die Weiterverarbeitung statt des obigen Code verwendet werden&lt;br /&gt;
 $defs{&#039;AAA&#039;}{READINGS}{&amp;quot;short&amp;quot;}{VAL}&lt;br /&gt;
Dies enthält nur die Meldung, nicht aber die Anzeige aller Zustände. Alternativ kann man auch die Zustandsanzeige durch Wahl des Attributwertes &#039;&#039;none&#039;&#039; komplett abstellen.&lt;br /&gt;
===Sperrung===&lt;br /&gt;
Das Attribut &#039;&#039;lockstate&#039;&#039; muss den Wert &#039;&#039;unlocked&#039;&#039; haben, damit durch Anklicken des Buttons &#039;&#039;Set Alarms&#039;&#039; die &#039;&#039;alarmSettings&#039;&#039;-Attribute befüllt werden können. Das ist in der Regel beim ersten Laden des Moduls &#039;&#039;&#039;nicht&#039;&#039;&#039; der Fall, hierzu muss also das Attribut von Hand auf den richtigen Wert gesetzt werden !&lt;br /&gt;
&lt;br /&gt;
=Sensoren=&lt;br /&gt;
==Rauchalarm==&lt;br /&gt;
&#039;&#039;&#039;Dieser Alarm ist mit Lebensgefahr verbunden und wird deshalb unabhängig von FHEM ausgelöst, und von FHEM nur registriert und mit weiteren Aktoren verbunden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden vernetzte Rauchmelder des Typs [[HM-SEC-SD_Rauchmelder|HM-SEC-SD]] verwendet. Deren Teamleader erhalten das Attribut &#039;&#039;alarmDevice Sensor&#039;&#039;, so dass sie in der Sensorenliste der Alarmanlage auftauchen. Sie lösen den Alarm mit dem höchsten Level aus. Die Realisierung lässt sich aber auch über beliebige andere in FHEM eingebundene Rauchmelder erreichen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_smoke.png]]&lt;br /&gt;
&lt;br /&gt;
==Öffnung von Fenstern oder Türen ==&lt;br /&gt;
Dies dient der Überwachung von &#039;&#039;&#039;Zustandsänderungen&#039;&#039;&#039;, ebenso wie zur &#039;&#039;&#039;Überprüfung eines statischen Zustands&#039;&#039;&#039;&lt;br /&gt;
===Szenarien===&lt;br /&gt;
====Kontrollrunde====&lt;br /&gt;
Dieses Alarmszenario (Alarmlevel 4) liegt vor, wenn die Hausbewohner anwesend sind, aber irgendwann zu Bett gehen wollen und vorher noch überprüfen, ob auch alle Türen und das Garagentor geschlossen sind. Sagen wir, beginnend um 22:00 bis 23:59. Man könnte diesen Alarmlevel aber auch durch einen externen Regensensor auslösen, der die Dachfenster auf ihren Öffnungszustand untersucht. Jedenfalls sollte dieser Alarmlevel immer scharf sein.&lt;br /&gt;
&lt;br /&gt;
Durch einen externen Auslöser (sagen wir, beginnend um 22:00 Uhr) wird in periodischen Abständen eine Hilfsroutine gestartet, welche die Zustandsprüfung vornimmt und registriert. Nur wenn diese Registrierung eine Öffnung ergibt, wird der Alarm ausgelöst. Dieser Alarmlevel gehört also zur Kategorie &#039;&#039;Warnung&#039;&#039; und wird deshalb nur eine moderate Signalisierung benötigen - beispielsweise&lt;br /&gt;
*eine Nachricht mit gelbem Hintergrund erscheint auf einem [[Digitaler_Bilderrahmen_mit_lcd4linux|Digitalen Bilderrahmen]]&lt;br /&gt;
*eine Nachricht erscheint auf einem [[1-Wire_Textdisplay]] &lt;br /&gt;
*eine LED geht an auf dem [[1-Wire LED-Statusmonitor]]&lt;br /&gt;
&lt;br /&gt;
====Zutritt====&lt;br /&gt;
Dieses Alarmszenario (Alarmlevel 5) liegt vor, wenn die Hausbewohner anwesend sind, aber vermutlich schlafen gegangen sind. Sagen wir, von 0:00 bis 5:00. &lt;br /&gt;
&lt;br /&gt;
Wenn morgens um 4:00 die Haustür geöffnet wird, handelt es sich entweder um ein spätes Heimkommen eines Hausbewohners von einer Party - oder um einen Einbruchsversuch. Der Partygeher sollte also eine gewisse Warnungszeit bekommen, bevor ein moderater akustischer Aktor (sagen wir, ein Funkgong) losgeht. Dieser Aktor  muss deshalb mit einer Verzögerung eingeschaltet werden, und der Partygeher erhält eine Warnung. Diese Warnung - sagen wir, eine bestimmte Lampe geht an -  informiert ihn, dass er innerhalb von 30 Sekunden einen bestimmten Schalter betätigen muss. Etwa den für genau diese Lampe, um sie auszuschalten. Der Einbrecher kennt diesen Schalter nicht, der moderate Alarm wird also die schlafenden Hausbewohner wecken und ihn abschrecken.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich verfügt dieser Level auch noch über einen Partymodus: Mit diesem kann er für 24 Stunden abgestellt werden, so dass man auch um 3:00 in der Frühe die eigenen Partygäste aus dem Haus lassen kann, ohne ihn auszulösen.&lt;br /&gt;
====Einbruch====&lt;br /&gt;
Dieses Alarmszenario (Alarmlevel 6) liegt vor, wenn die Hausbewohner abwesend sind und diesen Level vorher scharf geschaltet haben - und idealerweise von 0:00 bis 23:59. Jeder Zutritt zu Haus löst diesen Alarm aus, und der akustische Aktor kann durchaus kräftig sein (etwa Einschalten der Rauchmelder für 1 Minute). &lt;br /&gt;
&lt;br /&gt;
Da die Auslösung auch erfolgt, wenn der Hausbesitzer heimkommt, muss der akustische Aktor eine Verzögerung haben und innerhalb dieser einer Warnung gegeben werden, z.B. indem  zunächst eine bestimmte Lampe angeht. Dies informiert ihn, dass er innerhalb von 30 Sekunden einen bestimmten Schalter betätigen muss. Etwa die Kombination, um diesen Alarmlevel unscharf zu schalten. Der Einbrecher kennt diese Kombination nicht, die Beleuchtung wird ihn also zunächst abschrecken und der nachfolgende laute akustische Aktor auch die Nachbarn wecken.&lt;br /&gt;
===Zustandsänderung===&lt;br /&gt;
Dazu werden alle überwachten Fenster- und Türkontakte mit dem Attribut &#039;&#039;alarmDevice Sensor&#039;&#039; versehen, so dass sie in der Sensorenliste der Alarmanlage auftauchen. In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_tf.png]]&lt;br /&gt;
&lt;br /&gt;
===Zustandsprüfung===&lt;br /&gt;
Dies dient der Überprüfung eines &#039;&#039;&#039;statischen Zustands&#039;&#039;&#039;, konkret ob und welche Fenster oder Türen offen sind - z.B. abends, oder bei Regenwetter. Dazu benötigen wir drei &#039;&#039;dummy&#039;&#039; Devices, von denen zwei als &#039;&#039;alarmDevice Sensor&#039;&#039; und einer als &#039;&#039;alarmDevice Actor&#039;&#039; attributiert werden und somit in der Sensoren- bzw. Aktorenliste der Alarmanlage auftauchen. &lt;br /&gt;
&lt;br /&gt;
 define TFOpen.warn dummy&lt;br /&gt;
 attr TFOpen.warn alarmDevice Sensor&lt;br /&gt;
 &#039;&#039;&#039;attr TFOpen.warn alarmSettings alarm4,|TFOpen.warn:.*[TF].*|$EVENT|on&#039;&#039;&#039; (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr TFOpen.warn group windowDetector&lt;br /&gt;
 attr TFOpen.warn room Alarm&lt;br /&gt;
&lt;br /&gt;
 define TFClose.warn dummy&lt;br /&gt;
 attr TFClose.warn alarmDevice Sensor&lt;br /&gt;
 &#039;&#039;&#039;attr TFClose.warn alarmSettings alarm4,|TFClose.warn:yes|Alle zu|off&#039;&#039;&#039; (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr TFClose.warn group windowDetector&lt;br /&gt;
 attr TFClose.warn room Alarm&lt;br /&gt;
&lt;br /&gt;
 define TFOpen.check dummy&lt;br /&gt;
 attr TFOpen.check alarmDevice Actor&lt;br /&gt;
 &#039;&#039;&#039;attr TFOpen.check alarmSettings alarm4,|{HouseOpen()}||10:00&#039;&#039;&#039; (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr TFOpen.check group windowDetector&lt;br /&gt;
 attr TFOpen.check room Alarm&lt;br /&gt;
&lt;br /&gt;
[[Datei:TFAlarm.png|left|thumb|200px|]]Als nächstes muss eine Überwachungsroutine geschrieben werden. Das kann entweder als FHEM-Skript geschehen, oder in der Datei 99_myUtils.pm als perl-Code. Dieses Unterprogramm muss &lt;br /&gt;
*den obigen &#039;&#039;dummy&#039;&#039; TFOpen.warn setzen, und zwar auf den oder die Namen der geöffneten Fenster und Türen oder &amp;quot;none&amp;quot;, wenn keine geöffnet sind.&lt;br /&gt;
*den obigen &#039;&#039;dummy&#039;&#039; TFClose.warn setzen, und zwar auf den Wert &amp;quot;no&amp;quot;, wenn irgendeine geöffnet ist und &amp;quot;yes&amp;quot;, wenn keine geöffnet sind.&lt;br /&gt;
Ein Beispiel für eine solche Überwachungsroutine ist weiter unten zu sehen.&lt;br /&gt;
&lt;br /&gt;
Diese Doppelung ist nötig, weil jeder Sensor nur mit einem notify in den Alarmen auftauchen kann - das dient der Sicherheit gegen Fehlkonfiguration und ist beabsichtigt.&lt;br /&gt;
&lt;br /&gt;
In dem nebenstehenden Flussdiagramm wird der Ablauf dargestellt, der sich mit diesem System ergibt. Dabei wird um 22:00 der erste Test auf ein ordnungsgemäß geschlossenes Haus gestartet - und bis Mitternacht alle 10 Minuten wiederholt. Alternativ könnte man das auch mit einem Regensensor als Erstauslöser koppeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispielcode für eine Überwachungsroutine:&lt;br /&gt;
&lt;br /&gt;
 sub HouseOpen()&lt;br /&gt;
 {&lt;br /&gt;
  my $kfo = 0;&lt;br /&gt;
  my $kfs = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $kto = 0;&lt;br /&gt;
  my $kts = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $str = &amp;quot;&amp;quot;;&lt;br /&gt;
  if( $main::value{&#039;BK.F&#039;} ne &amp;quot;Closed&amp;quot; ){&lt;br /&gt;
    $kfo++;&lt;br /&gt;
    $kfs = &amp;quot;BK/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if( $main::value{&#039;WK.F&#039;} ne &#039;Closed&#039; ){&lt;br /&gt;
    $kfo++;&lt;br /&gt;
    $kfs = $kfs.&amp;quot;WK/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if( $main::value{&#039;VK.T&#039;} ne &amp;quot;Closed&amp;quot; ){&lt;br /&gt;
    $kto++;&lt;br /&gt;
    $kts = &amp;quot;VK/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if( $main::value{&#039;WZ.T&#039;} ne &#039;Closed&#039; ){&lt;br /&gt;
    $kto++;&lt;br /&gt;
    $kts = $kts.&amp;quot;WZ/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
 if( ($kfo &amp;gt;= 1) &amp;amp;&amp;amp; ($kto == 0) ){&lt;br /&gt;
    $kfs = substr($kfs,0,-1);&lt;br /&gt;
    fhem(&amp;quot;define TFOpen.delay at +00:00:30 set TFOpen.warn $kfs Fenster&amp;quot;); &lt;br /&gt;
    fhem(&amp;quot;define TFClose.delay at +00:00:30 set TFClose.warn no&amp;quot;);&lt;br /&gt;
  }elsif( ($kfo == 0) &amp;amp;&amp;amp; ($kto &amp;gt;= 1) ){&lt;br /&gt;
    $kts = substr($kts,0,-1);&lt;br /&gt;
    fhem(&amp;quot;define TFOpen.delay at +00:00:30 set TFOpen.warn $kts Tür&amp;quot;); &lt;br /&gt;
    fhem(&amp;quot;define TFClose.delay at +00:00:30 set TFClose.warn no&amp;quot;);&lt;br /&gt;
  }elsif( ($kfo &amp;gt;= 1) &amp;amp;&amp;amp; ($kto &amp;gt;= 1)){&lt;br /&gt;
     $kts = substr($kts,0,-1);&lt;br /&gt;
     $kfs = substr($kfs,0,-1);&lt;br /&gt;
     $str = &amp;quot;$kts Tür + $kfs Fenster&amp;quot;;&lt;br /&gt;
     fhem(&amp;quot;define TFOpen.delay at +00:00:30 set TFOpen.warn $kts T / $kfs F&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;define TFClose.delay at +00:00:30 set TFClose.warn no&amp;quot;);&lt;br /&gt;
  }else{&lt;br /&gt;
     fhem(&amp;quot;set TFOpen.warn none&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;set TFClose.warn yes&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
 return $str;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Batterie schwach bei FHEM-Devices==&lt;br /&gt;
Dieser Sensor besteht aus einem &#039;&#039;notify&#039;&#039; und einem &#039;&#039;dummy&#039;&#039;, der bei einer &#039;battery low&#039;-Meldung eines beliebigen FHEM-Device auf dessen Namen gesetzt wird. Der &#039;&#039;dummy&#039;&#039; wird als &#039;&#039;alarmDevice Sensor&#039;&#039; attributiert, so dass er in der Sensorenliste der Alarmanlage auftaucht. &lt;br /&gt;
	&lt;br /&gt;
 define LBatt.N notify .*:[Bb]attery.*[Ll]ow.* set LBatt.warn $NAME&lt;br /&gt;
 attr LBatt.N room Alarm&lt;br /&gt;
 attr LBatt.N group deviceDetector&lt;br /&gt;
&lt;br /&gt;
 define LBatt.warn dummy&lt;br /&gt;
 attr LBatt.warn alarmDevice Sensor&lt;br /&gt;
 attr LBatt.warn room Alarm&lt;br /&gt;
 attr LBatt.warn group deviceDetector&lt;br /&gt;
Auf einen Test, ob gleichzeitig bei anderen FHEM-Devices die Batterie ebenfalls schwach ist, wird hier verzichtet. Für diesen Sensor wird ein eigener Alarmlevel (niedriger Priorität) erzeugt. Bei einem beliebigen &#039;battery low&#039; Event wird somit der STATE der Alarmanlage gesetzt auf &#039;&#039;&#039;Batt. &amp;lt;devicename&amp;gt; schwach&#039;&#039;&#039;. Dieser Alarm muss manuell zurückgesetzt werden (schließlich sollten die Batterien ja erst gewechselt werden...) &lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_lbatt.png]]&lt;br /&gt;
&lt;br /&gt;
=Aktoren=&lt;br /&gt;
==Rauchmelder als Alarmsignal==&lt;br /&gt;
Für Alarme, bei denen es wirklich auf schnelle Reaktionen ankommt, kann man auch Rauchdetektoren verwenden, die über Funk aktivierbar sind. Im Beispiel werden vernetzte Rauchmelder des Typs [[HM-SEC-SD_Rauchmelder|HM-SEC-SD]] verwendet. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung: Es ist sehr empfehlenswert, diesen Alarm auch wieder automatisch auszuschalten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dazu wird ein &#039;&#039;dummy&#039;&#039; erzeugt und mit &#039;&#039;alarmDevice Actor&#039;&#039; attributiert, so dass er in der Aktorenliste auftaucht:&lt;br /&gt;
&lt;br /&gt;
 define SD.alarm dummy&lt;br /&gt;
 attr SD.alarm alarmDevice Actor&lt;br /&gt;
 attr SD.alarm alarmSettings alarm7,|set TH.SD0 alarmOn|set TH.SD0 alarmOff|30&lt;br /&gt;
 attr SD.alarm group alarmActor&lt;br /&gt;
 attr SD.alarm room Alarm &lt;br /&gt;
In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_smokeactor.png]]&lt;br /&gt;
&lt;br /&gt;
==Funk-Türgong / MP3-Türgong als Alarmsignal==&lt;br /&gt;
Hier wird ein FS20-Türgong als akustisches Alarmsignal verwendet.&lt;br /&gt;
&lt;br /&gt;
 define WZ.Gong FS20 &amp;lt;adresse&amp;gt;&lt;br /&gt;
 attr WZ.Gong IODev CUL&lt;br /&gt;
 attr WZ.Gong alarmDevice Actor&lt;br /&gt;
 &#039;&#039;&#039;attr WZ.Gong alarmSettings alarm5,alarm6,|set WZ.Gong on||30&#039;&#039;&#039; (Vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr WZ.Gong group alarmActor&lt;br /&gt;
 attr WZ.Gong room Alarm,Erdgeschoss&lt;br /&gt;
In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_gongactor.png]]&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung eines MP3-Funkgongs (z.B. aus dem Homematic-Programm) kann man auf diesem eine ganze Menge verschiedene MP3-Dateien speichern, die z.B. Stimmenmeldungen &amp;quot;Alarmanlage scharf geschaltet&amp;quot; abgeben. Zur Erstellung dieser Meldungen hat es sich bewährt, einen kostenlosen Online-TTS (Text-to-Speech) Service zu nutzen, z.B. Ivona.&lt;br /&gt;
==Alarmierung per SMS== &lt;br /&gt;
Für Alarme, die man auch im Urlaub auf das Handy bekommen möchte, bedarf es natürlich eines Providers, der eine bestimmte Mailadresse als SMS weiterleitet. Ferner einer FHEM-Konfiguration, die Mails versenden kann. Dann wird ein &#039;&#039;dummy&#039;&#039; erzeugt und mit &#039;&#039;alarmDevice Actor&#039;&#039; attributiert, so dass er in der Aktorenliste auftaucht:&lt;br /&gt;
 define Mail.alarm dummy&lt;br /&gt;
 attr Mail.alarm alarmDevice Actor&lt;br /&gt;
 &#039;&#039;&#039;attr Mail.alarm alarmSettings alarm6,alarm7,|{DebianMail(&amp;lt;mailadresse&amp;gt;,&#039;Alarm&#039;,Value(&#039;AAA&#039;))}||30&#039;&#039;&#039; (automatisch erzeugt)&lt;br /&gt;
 attr Mail.alarm group alarmActor&lt;br /&gt;
 attr Mail.alarm room Alarm&lt;br /&gt;
In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_mailactor.png]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=26893.0|LinkText=Forenthread}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Modul_Alarm&amp;diff=13375</id>
		<title>Modul Alarm</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Modul_Alarm&amp;diff=13375"/>
		<updated>2015-12-28T12:17:22Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Infobox &amp;amp; Link zum Forenthread hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul stellt eine komfortable Oberfläche bereit, um per Webinterface Sensoren mit Aktionen zu verknüpfen - und zwar nur innerhalb bestimmter Zeitfenster sowie an- und abschaltbar&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=Alarm&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=95_Alarm.pm&lt;br /&gt;
|ModOwner=Prof. Dr. Peter Henning&lt;br /&gt;
}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 95_Alarm.pm.&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Das Modul &#039;&#039;95_Alarm.pm&#039;&#039; stellt eine komfortable Oberfläche bereit, um per Webinterface bestimmte auslösende Elemente (nachfolgend &#039;Sensoren&#039; genannt) mit bestimmten Aktionen (nachfolgend &#039;Aktoren&#039; genannt) zu verknüpfen - und zwar nur innerhalb bestimmter Zeitfenster sowie an- und abschaltbar (&amp;quot;scharf/armed&amp;quot; bzw. &amp;quot;unscharf/disarmed&amp;quot;). Diese Verknüpfungen werden als &amp;quot;normale&amp;quot; FHEM-Definitionen gespeichert.&lt;br /&gt;
==Erste Schritte==&lt;br /&gt;
Damit FHEM-Devices als Aktoren oder Sensoren für die Alarmanlage genutzt werden können, müssen zwei neue globale Attribute eingeführt werden. Dazu muss in der Grundkonfiguration von FHEM die Zeile mit der Definition der nutzerspezifischen Attribute &#039;&#039;userattr&#039;&#039; angepasst werden:&lt;br /&gt;
 attr global userattr &#039;&#039;&#039;alarmDevice alarmSettings&#039;&#039;&#039; devStateIcon devStateStyle ...&#039;&#039;(hier folgen weitere Attribute)&#039;&#039;&lt;br /&gt;
*Soll ein FHEM-Device als Sensor für die Alarmanlage genutzt werden, wird der Wert seines &#039;&#039;alarmDevice&#039;&#039;-Attributes auf &#039;Sensor&#039; gesetzt.&lt;br /&gt;
*Soll ein FHEM-Device als Aktor für die Alarmanlage genutzt werden, wird der Wert seines &#039;&#039;alarmDevice&#039;&#039;-Attributes auf &#039;Actor&#039; gesetzt&lt;br /&gt;
*Das Attribut &#039;&#039;alarmSettings&#039;&#039; wird beim Setzen der Alarme auf der Alarmkonfigurationsseite automatisch befüllt.&lt;br /&gt;
Ferner muss das Modul &#039;&#039;95_Alarm.pm&#039;&#039; im Modulpfad installiert werden, ebenso die JavaScript-Datei &#039;&#039;alarm.js&#039;&#039; in www/pgm2.&lt;br /&gt;
==Definition==&lt;br /&gt;
Die Alarmanlage - hier mit dem Namen &#039;&#039;AAA&#039;&#039; versehen - selbst wird über&lt;br /&gt;
 define AAA Alarm&lt;br /&gt;
 attr AAA room AlarmRoom&lt;br /&gt;
definiert. Zusätzlich soll sie im oberen Menü des Webinterfaces auftauchen, dazu benötigen wir noch (wird normalerweise automatisch mit angelegt):&lt;br /&gt;
 define AAA_weblink weblink htmlCode {Alarm_Html(&amp;quot;AAA&amp;quot;)}&lt;br /&gt;
 attr AAA_weblink room AlarmRoom&lt;br /&gt;
*Der Raum &#039;&#039;AlarmRoom&#039;&#039; ist ein versteckter Raum, der nicht im unteren Menü auftaucht.&lt;br /&gt;
*Es wird ein weiterer Raum benötigt, der in der gegenwärtigen Fassung des Moduls den Namen &#039;&#039;Alarm&#039;&#039; trägt&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
Beim Anklicken des Begriffes &#039;&#039;Alarms&#039;&#039; im oberen Menü des Webinterfaces wird die Alarmkonfiguration angezeigt.  &lt;br /&gt;
===Settings===&lt;br /&gt;
Im oberen Bereich sind drei Eingabefelder zu sehen:&lt;br /&gt;
*Wait Action ist ein FHEM-Befehl, der beim Scharfschalten des Alarms ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarmanlage wird in Kürze scharf geschaltet&#039;&#039;.&lt;br /&gt;
*Arm Delay ist eine Verzögerungszeit, die zwischen dem Scharfschalten des Alarms und der tatsächlichen Wirksamkeit vergeht. Diese Zeit kann beispielsweise genutzt werden, um das Haus ohne Auslösung des Alarms zu verlassen.  &lt;br /&gt;
*Arm Action ist ein FHEM-Befehl, der beim Scharfschalten ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarmanlage scharf geschaltet&#039;&#039;.&lt;br /&gt;
*Disarm Action ist ein FHEM-Befehl, der beim Unscharfschalten ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarmanlage unscharf geschaltet&#039;&#039;.&lt;br /&gt;
*Cancel Action ist ein FHEM-Befehl, der beim Widerrufen eines Alarms ausgeführt wird. Im Beispielbild wird damit ein MP3-Funkgong ausgelöst, durch den eine Stimme sagt &#039;&#039;Alarm widerrufen&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_settings.png]]&lt;br /&gt;
&lt;br /&gt;
8 Alarmlevel sind für das Modul normalerweise möglich (kann durch Setzen eines einzelnen Parameters im Modulcode verändert werden).&lt;br /&gt;
In der Tabelle &#039;Settings&#039; können für jeden Level die Startzeit &#039;&#039;ts&#039;&#039; und Endzeit &#039;&#039;te&#039;&#039; des Alarmlevels gesetzt werden. Formate für die Zeitangabe können sein:&lt;br /&gt;
* hh:mm - direkte Eingabe einer festen Zeit.&lt;br /&gt;
* {&#039;&#039;funktion&#039;&#039;} - eine beliebige Perl-Funktion in geschweiften Klammern, die einen gültigen Zeitwert hh:mm zurückliefert. Die Gültigkeit wird erst zur Laufzeit überprüft. Beispielsweise  &amp;quot;30 Minuten vor Sonnenuntergang&amp;quot; als {sunset_abs(-1800)}. &lt;br /&gt;
Diese Aktivierungszeiten wirken sich wie folgt auf den Alarmlevel aus:&lt;br /&gt;
*Wenn  &#039;&#039;ts&#039;&#039; &amp;lt; &#039;&#039;te&#039;&#039;, ist dieser Alarmlevel aktiv, falls &#039;&#039;ts&#039;&#039; &amp;lt; Zeit &amp;lt; &#039;&#039;te&#039;&#039;.&lt;br /&gt;
*Wenn  &#039;&#039;ts&#039;&#039; &amp;gt;= &#039;&#039;te&#039;&#039;, ist dieser Alarmlevel aktiv, falls &#039;&#039;ts&#039;&#039; &amp;lt; Zeit &amp;lt;= 23:59 sowie wenn 0:00 &amp;lt; Zeit &amp;lt;= &#039;&#039;te&#039;&#039;.&lt;br /&gt;
Ferner kann für jeden Alarmlevel gesetzt oder bedient werden&lt;br /&gt;
*Eine Nachricht zur Erläuterung des Alarms (Teil 2)&lt;br /&gt;
*Eine Checkbox &#039;&#039;Armed&#039;&#039; = scharf&lt;br /&gt;
*Ein Button &#039;&#039;Cancel&#039;&#039; zum Canceln = Aufheben des Alarms&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
Danach wird die Tabelle der Sensoren angezeigt. Für jeden Sensor kann gesetzt werden:&lt;br /&gt;
*Alarmlevel, die hierdurch ausgelöst werden&lt;br /&gt;
*Ein regulärer Ausdruck, bei dessen Erkennung die Auslösung erfolgt &lt;br /&gt;
*Eine Nachricht zur Erläuterung des Alarms (Teil 1)&lt;br /&gt;
*Ein Selektor, um festzulegen, ob dieser Sensor den Alarm &lt;br /&gt;
**auslöst (=Raise),&lt;br /&gt;
**widerruft (=Cancel),&lt;br /&gt;
**scharf schaltet (=Arm) oder&lt;br /&gt;
**unscharf schaltet (=Disarm).&lt;br /&gt;
&#039;&#039;&#039;Achtung: Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die insgesamt in den &#039;&#039;STATE&#039;&#039; der Alarmanlage geschriebene Nachricht besteht dann aus&lt;br /&gt;
 (Anzeige der Zustände) (Nachricht Teil 1)&#039; &#039;(Nachricht Teil 2).&lt;br /&gt;
Bitte weiter unten nachlesen, was mit der [[#Anzeige der Zustände|Anzeige der Zustände]] gemeint ist.&lt;br /&gt;
In diesen Nachrichten werden die folgenden Ersetzungen vorgenommen&lt;br /&gt;
* $NAME vird durch den Namen des auslösenden Devices ersetzt&lt;br /&gt;
* $EVENT wird durch den kompletten Event ersetzt&lt;br /&gt;
* $EVTPART1... wird durch den 1. Teilstring des Events gefüllt, etc.&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_sensors.png]]&lt;br /&gt;
&lt;br /&gt;
===Actors===&lt;br /&gt;
Anschließend wird die Tabelle der Aktoren angezeigt. Für jeden Aktor kann gesetzt werden: &lt;br /&gt;
*Alarmlevel, die diesen Aktor starten&lt;br /&gt;
*Ein FHEM-Kommando zum Starten des Aktors&lt;br /&gt;
*Ein FHEM-Kommando zum Stoppen des Aktors&lt;br /&gt;
*Eine Zeitverzögerung  - entweder als Angabe von Sekunden (&amp;lt;60) oder im Format mm:ss&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_actors.png]]&lt;br /&gt;
&lt;br /&gt;
==Einrichten==&lt;br /&gt;
Durch Anklicken des Buttons &#039;&#039;Set Alarms&#039;&#039; werden die &#039;&#039;alarmSettings&#039;&#039;-Attribute befüllt. &lt;br /&gt;
&#039;&#039;&#039;Achtung, Folgendes beachten&#039;&#039;&#039;&lt;br /&gt;
*Es ist zwingend notwendig, dass für einen auszulösenden Alarmlevel auch ein Sensor für den Widerruf (=Cancel) des Alarms definiert wird, ansonsten ignoriert das Modul die Definition dieses Levels.&lt;br /&gt;
*Der Button &#039;&#039;Set Alarms&#039;&#039; wird nur funktionieren, wenn keine [[#Sperrung|Sperrung]] vorliegt, siehe unten.&lt;br /&gt;
*Es empfiehlt sich, danach ein &#039;&#039;Save Config&#039;&#039; auszuführen, damit die Attribute und Notifier permanent sind.&lt;br /&gt;
&lt;br /&gt;
===Anzeige der Zustände===&lt;br /&gt;
Auf Wunsch können die Zustände der Alarmanlage zusammen mit der konkreten Meldung im internal &#039;&#039;STATE&#039;&#039; (bzw. reading &#039;&#039;state&#039;&#039;, beide sind in diesem Modul identisch) angezeigt werden.&lt;br /&gt;
Hierfür gibt es ein Attribut &#039;&#039;statedisplay&#039;&#039; mit den folgenden möglichen Werten, die nachfolgend am Beispiel für den Zustand &amp;quot;Alarm Level 1 ausgelöst&amp;quot; erläutert sind:&lt;br /&gt;
* &#039;&#039;none&#039;&#039; - keine Anzeige&lt;br /&gt;
* &#039;&#039;simple&#039;&#039; - OXOOOOOO&lt;br /&gt;
* &#039;&#039;color&#039;&#039; - &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 0 &amp;lt;span style=&amp;quot;width:1ex;color:red&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; 2 3 4 5 6 7&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;table&#039;&#039;&amp;amp;nbsp;-&amp;amp;nbsp;&amp;lt;table&amp;gt;&amp;lt;tr style=&amp;quot;height:1ex&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:red&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;td style=&amp;quot;width:1ex;background-color:green&amp;quot;/&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Problem ist, dass möglicherweise das internal &#039;&#039;STATE&#039;&#039; an anderer Stelle verwendet werden soll - z.B. beim Versenden von Mails als &lt;br /&gt;
 Value(&#039;AAA&#039;)&lt;br /&gt;
Es macht natürlich keinen Sinn, eine HTML-Tabelle in eine Mail zu packen. Deshalb sollte für die Weiterverarbeitung statt des obigen Code verwendet werden&lt;br /&gt;
 $defs{&#039;AAA&#039;}{READINGS}{&amp;quot;short&amp;quot;}{VAL}&lt;br /&gt;
Dies enthält nur die Meldung, nicht aber die Anzeige aller Zustände. Alternativ kann man auch die Zustandsanzeige durch Wahl des Attributwertes &#039;&#039;none&#039;&#039; komplett abstellen.&lt;br /&gt;
===Sperrung===&lt;br /&gt;
Das Attribut &#039;&#039;lockstate&#039;&#039; muss den Wert &#039;&#039;unlocked&#039;&#039; haben, damit durch Anklicken des Buttons &#039;&#039;Set Alarms&#039;&#039; die &#039;&#039;alarmSettings&#039;&#039;-Attribute befüllt werden können. Das ist in der Regel beim ersten Laden des Moduls &#039;&#039;&#039;nicht&#039;&#039;&#039; der Fall, hierzu muss also das Attribut von Hand auf den richtigen Wert gesetzt werden !&lt;br /&gt;
&lt;br /&gt;
=Sensoren=&lt;br /&gt;
==Rauchalarm==&lt;br /&gt;
&#039;&#039;&#039;Dieser Alarm ist mit Lebensgefahr verbunden und wird deshalb unabhängig von FHEM ausgelöst, und von FHEM nur registriert und mit weiteren Aktoren verbunden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden vernetzte Rauchmelder des Typs [[HM-SEC-SD_Rauchmelder|HM-SEC-SD]] verwendet. Deren Teamleader erhalten das Attribut &#039;&#039;alarmDevice Sensor&#039;&#039;, so dass sie in der Sensorenliste der Alarmanlage auftauchen. Sie lösen den Alarm mit dem höchsten Level aus. Die Realisierung lässt sich aber auch über beliebige andere in FHEM eingebundene Rauchmelder erreichen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_smoke.png]]&lt;br /&gt;
&lt;br /&gt;
==Öffnung von Fenstern oder Türen ==&lt;br /&gt;
Dies dient der Überwachung von &#039;&#039;&#039;Zustandsänderungen&#039;&#039;&#039;, ebenso wie zur &#039;&#039;&#039;Überprüfung eines statischen Zustands&#039;&#039;&#039;&lt;br /&gt;
===Szenarien===&lt;br /&gt;
====Kontrollrunde====&lt;br /&gt;
Dieses Alarmszenario (Alarmlevel 4) liegt vor, wenn die Hausbewohner anwesend sind, aber irgendwann zu Bett gehen wollen und vorher noch überprüfen, ob auch alle Türen und das Garagentor geschlossen sind. Sagen wir, beginnend um 22:00 bis 23:59. Man könnte diesen Alarmlevel aber auch durch einen externen Regensensor auslösen, der die Dachfenster auf ihren Öffnungszustand untersucht. Jedenfalls sollte dieser Alarmlevel immer scharf sein.&lt;br /&gt;
&lt;br /&gt;
Durch einen externen Auslöser (sagen wir, beginnend um 22:00 Uhr) wird in periodischen Abständen eine Hilfsroutine gestartet, welche die Zustandsprüfung vornimmt und registriert. Nur wenn diese Registrierung eine Öffnung ergibt, wird der Alarm ausgelöst. Dieser Alarmlevel gehört also zur Kategorie &#039;&#039;Warnung&#039;&#039; und wird deshalb nur eine moderate Signalisierung benötigen - beispielsweise&lt;br /&gt;
*eine Nachricht mit gelbem Hintergrund erscheint auf einem [[Digitaler_Bilderrahmen_mit_lcd4linux|Digitalen Bilderrahmen]]&lt;br /&gt;
*eine Nachricht erscheint auf einem [[1-Wire_Textdisplay]] &lt;br /&gt;
*eine LED geht an auf dem [[1-Wire LED-Statusmonitor]]&lt;br /&gt;
&lt;br /&gt;
====Zutritt====&lt;br /&gt;
Dieses Alarmszenario (Alarmlevel 5) liegt vor, wenn die Hausbewohner anwesend sind, aber vermutlich schlafen gegangen sind. Sagen wir, von 0:00 bis 5:00. &lt;br /&gt;
&lt;br /&gt;
Wenn morgens um 4:00 die Haustür geöffnet wird, handelt es sich entweder um ein spätes Heimkommen eines Hausbewohners von einer Party - oder um einen Einbruchsversuch. Der Partygeher sollte also eine gewisse Warnungszeit bekommen, bevor ein moderater akustischer Aktor (sagen wir, ein Funkgong) losgeht. Dieser Aktor  muss deshalb mit einer Verzögerung eingeschaltet werden, und der Partygeher erhält eine Warnung. Diese Warnung - sagen wir, eine bestimmte Lampe geht an -  informiert ihn, dass er innerhalb von 30 Sekunden einen bestimmten Schalter betätigen muss. Etwa den für genau diese Lampe, um sie auszuschalten. Der Einbrecher kennt diesen Schalter nicht, der moderate Alarm wird also die schlafenden Hausbewohner wecken und ihn abschrecken.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich verfügt dieser Level auch noch über einen Partymodus: Mit diesem kann er für 24 Stunden abgestellt werden, so dass man auch um 3:00 in der Frühe die eigenen Partygäste aus dem Haus lassen kann, ohne ihn auszulösen.&lt;br /&gt;
====Einbruch====&lt;br /&gt;
Dieses Alarmszenario (Alarmlevel 6) liegt vor, wenn die Hausbewohner abwesend sind und diesen Level vorher scharf geschaltet haben - und idealerweise von 0:00 bis 23:59. Jeder Zutritt zu Haus löst diesen Alarm aus, und der akustische Aktor kann durchaus kräftig sein (etwa Einschalten der Rauchmelder für 1 Minute). &lt;br /&gt;
&lt;br /&gt;
Da die Auslösung auch erfolgt, wenn der Hausbesitzer heimkommt, muss der akustische Aktor eine Verzögerung haben und innerhalb dieser einer Warnung gegeben werden, z.B. indem  zunächst eine bestimmte Lampe angeht. Dies informiert ihn, dass er innerhalb von 30 Sekunden einen bestimmten Schalter betätigen muss. Etwa die Kombination, um diesen Alarmlevel unscharf zu schalten. Der Einbrecher kennt diese Kombination nicht, die Beleuchtung wird ihn also zunächst abschrecken und der nachfolgende laute akustische Aktor auch die Nachbarn wecken.&lt;br /&gt;
===Zustandsänderung===&lt;br /&gt;
Dazu werden alle überwachten Fenster- und Türkontakte mit dem Attribut &#039;&#039;alarmDevice Sensor&#039;&#039; versehen, so dass sie in der Sensorenliste der Alarmanlage auftauchen. In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_tf.png]]&lt;br /&gt;
&lt;br /&gt;
===Zustandsprüfung===&lt;br /&gt;
Dies dient der Überprüfung eines &#039;&#039;&#039;statischen Zustands&#039;&#039;&#039;, konkret ob und welche Fenster oder Türen offen sind - z.B. abends, oder bei Regenwetter. Dazu benötigen wir drei &#039;&#039;dummy&#039;&#039; Devices, von denen zwei als &#039;&#039;alarmDevice Sensor&#039;&#039; und einer als &#039;&#039;alarmDevice Actor&#039;&#039; attributiert werden und somit in der Sensoren- bzw. Aktorenliste der Alarmanlage auftauchen. &lt;br /&gt;
&lt;br /&gt;
 define TFOpen.warn dummy&lt;br /&gt;
 attr TFOpen.warn alarmDevice Sensor&lt;br /&gt;
 &#039;&#039;&#039;attr TFOpen.warn alarmSettings alarm4,|TFOpen.warn:.*[TF].*|$EVENT|on&#039;&#039;&#039; (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr TFOpen.warn group windowDetector&lt;br /&gt;
 attr TFOpen.warn room Alarm&lt;br /&gt;
&lt;br /&gt;
 define TFClose.warn dummy&lt;br /&gt;
 attr TFClose.warn alarmDevice Sensor&lt;br /&gt;
 &#039;&#039;&#039;attr TFClose.warn alarmSettings alarm4,|TFClose.warn:yes|Alle zu|off&#039;&#039;&#039; (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr TFClose.warn group windowDetector&lt;br /&gt;
 attr TFClose.warn room Alarm&lt;br /&gt;
&lt;br /&gt;
 define TFOpen.check dummy&lt;br /&gt;
 attr TFOpen.check alarmDevice Actor&lt;br /&gt;
 &#039;&#039;&#039;attr TFOpen.check alarmSettings alarm4,|{HouseOpen()}||10:00&#039;&#039;&#039; (Diese Zeile wird vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr TFOpen.check group windowDetector&lt;br /&gt;
 attr TFOpen.check room Alarm&lt;br /&gt;
&lt;br /&gt;
[[Datei:TFAlarm.png|left|thumb|200px|]]Als nächstes muss eine Überwachungsroutine geschrieben werden. Das kann entweder als FHEM-Skript geschehen, oder in der Datei 99_myUtils.pm als perl-Code. Dieses Unterprogramm muss &lt;br /&gt;
*den obigen &#039;&#039;dummy&#039;&#039; TFOpen.warn setzen, und zwar auf den oder die Namen der geöffneten Fenster und Türen oder &amp;quot;none&amp;quot;, wenn keine geöffnet sind.&lt;br /&gt;
*den obigen &#039;&#039;dummy&#039;&#039; TFClose.warn setzen, und zwar auf den Wert &amp;quot;no&amp;quot;, wenn irgendeine geöffnet ist und &amp;quot;yes&amp;quot;, wenn keine geöffnet sind.&lt;br /&gt;
Ein Beispiel für eine solche Überwachungsroutine ist weiter unten zu sehen.&lt;br /&gt;
&lt;br /&gt;
Diese Doppelung ist nötig, weil jeder Sensor nur mit einem notify in den Alarmen auftauchen kann - das dient der Sicherheit gegen Fehlkonfiguration und ist beabsichtigt.&lt;br /&gt;
&lt;br /&gt;
In dem nebenstehenden Flussdiagramm wird der Ablauf dargestellt, der sich mit diesem System ergibt. Dabei wird um 22:00 der erste Test auf ein ordnungsgemäß geschlossenes Haus gestartet - und bis Mitternacht alle 10 Minuten wiederholt. Alternativ könnte man das auch mit einem Regensensor als Erstauslöser koppeln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispielcode für eine Überwachungsroutine:&lt;br /&gt;
&lt;br /&gt;
 sub HouseOpen()&lt;br /&gt;
 {&lt;br /&gt;
  my $kfo = 0;&lt;br /&gt;
  my $kfs = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $kto = 0;&lt;br /&gt;
  my $kts = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $str = &amp;quot;&amp;quot;;&lt;br /&gt;
  if( $main::value{&#039;BK.F&#039;} ne &amp;quot;Closed&amp;quot; ){&lt;br /&gt;
    $kfo++;&lt;br /&gt;
    $kfs = &amp;quot;BK/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if( $main::value{&#039;WK.F&#039;} ne &#039;Closed&#039; ){&lt;br /&gt;
    $kfo++;&lt;br /&gt;
    $kfs = $kfs.&amp;quot;WK/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if( $main::value{&#039;VK.T&#039;} ne &amp;quot;Closed&amp;quot; ){&lt;br /&gt;
    $kto++;&lt;br /&gt;
    $kts = &amp;quot;VK/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  if( $main::value{&#039;WZ.T&#039;} ne &#039;Closed&#039; ){&lt;br /&gt;
    $kto++;&lt;br /&gt;
    $kts = $kts.&amp;quot;WZ/&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
 if( ($kfo &amp;gt;= 1) &amp;amp;&amp;amp; ($kto == 0) ){&lt;br /&gt;
    $kfs = substr($kfs,0,-1);&lt;br /&gt;
    fhem(&amp;quot;define TFOpen.delay at +00:00:30 set TFOpen.warn $kfs Fenster&amp;quot;); &lt;br /&gt;
    fhem(&amp;quot;define TFClose.delay at +00:00:30 set TFClose.warn no&amp;quot;);&lt;br /&gt;
  }elsif( ($kfo == 0) &amp;amp;&amp;amp; ($kto &amp;gt;= 1) ){&lt;br /&gt;
    $kts = substr($kts,0,-1);&lt;br /&gt;
    fhem(&amp;quot;define TFOpen.delay at +00:00:30 set TFOpen.warn $kts Tür&amp;quot;); &lt;br /&gt;
    fhem(&amp;quot;define TFClose.delay at +00:00:30 set TFClose.warn no&amp;quot;);&lt;br /&gt;
  }elsif( ($kfo &amp;gt;= 1) &amp;amp;&amp;amp; ($kto &amp;gt;= 1)){&lt;br /&gt;
     $kts = substr($kts,0,-1);&lt;br /&gt;
     $kfs = substr($kfs,0,-1);&lt;br /&gt;
     $str = &amp;quot;$kts Tür + $kfs Fenster&amp;quot;;&lt;br /&gt;
     fhem(&amp;quot;define TFOpen.delay at +00:00:30 set TFOpen.warn $kts T / $kfs F&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;define TFClose.delay at +00:00:30 set TFClose.warn no&amp;quot;);&lt;br /&gt;
  }else{&lt;br /&gt;
     fhem(&amp;quot;set TFOpen.warn none&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;set TFClose.warn yes&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
 return $str;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Batterie schwach bei FHEM-Devices==&lt;br /&gt;
Dieser Sensor besteht aus einem &#039;&#039;notify&#039;&#039; und einem &#039;&#039;dummy&#039;&#039;, der bei einer &#039;battery low&#039;-Meldung eines beliebigen FHEM-Device auf dessen Namen gesetzt wird. Der &#039;&#039;dummy&#039;&#039; wird als &#039;&#039;alarmDevice Sensor&#039;&#039; attributiert, so dass er in der Sensorenliste der Alarmanlage auftaucht. &lt;br /&gt;
	&lt;br /&gt;
 define LBatt.N notify .*:[Bb]attery.*[Ll]ow.* set LBatt.warn $NAME&lt;br /&gt;
 attr LBatt.N room Alarm&lt;br /&gt;
 attr LBatt.N group deviceDetector&lt;br /&gt;
&lt;br /&gt;
 define LBatt.warn dummy&lt;br /&gt;
 attr LBatt.warn alarmDevice Sensor&lt;br /&gt;
 attr LBatt.warn room Alarm&lt;br /&gt;
 attr LBatt.warn group deviceDetector&lt;br /&gt;
Auf einen Test, ob gleichzeitig bei anderen FHEM-Devices die Batterie ebenfalls schwach ist, wird hier verzichtet. Für diesen Sensor wird ein eigener Alarmlevel (niedriger Priorität) erzeugt. Bei einem beliebigen &#039;battery low&#039; Event wird somit der STATE der Alarmanlage gesetzt auf &#039;&#039;&#039;Batt. &amp;lt;devicename&amp;gt; schwach&#039;&#039;&#039;. Dieser Alarm muss manuell zurückgesetzt werden (schließlich sollten die Batterien ja erst gewechselt werden...) &lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_lbatt.png]]&lt;br /&gt;
&lt;br /&gt;
=Aktoren=&lt;br /&gt;
==Rauchmelder als Alarmsignal==&lt;br /&gt;
Für Alarme, bei denen es wirklich auf schnelle Reaktionen ankommt, kann man auch Rauchdetektoren verwenden, die über Funk aktivierbar sind. Im Beispiel werden vernetzte Rauchmelder des Typs [[HM-SEC-SD_Rauchmelder|HM-SEC-SD]] verwendet. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung: Es ist sehr empfehlenswert, diesen Alarm auch wieder automatisch auszuschalten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dazu wird ein &#039;&#039;dummy&#039;&#039; erzeugt und mit &#039;&#039;alarmDevice Actor&#039;&#039; attributiert, so dass er in der Aktorenliste auftaucht:&lt;br /&gt;
&lt;br /&gt;
 define SD.alarm dummy&lt;br /&gt;
 attr SD.alarm alarmDevice Actor&lt;br /&gt;
 attr SD.alarm alarmSettings alarm7,|set TH.SD0 alarmOn|set TH.SD0 alarmOff|30&lt;br /&gt;
 attr SD.alarm group alarmActor&lt;br /&gt;
 attr SD.alarm room Alarm &lt;br /&gt;
In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_smokeactor.png]]&lt;br /&gt;
&lt;br /&gt;
==Funk-Türgong / MP3-Türgong als Alarmsignal==&lt;br /&gt;
Hier wird ein FS20-Türgong als akustisches Alarmsignal verwendet.&lt;br /&gt;
&lt;br /&gt;
 define WZ.Gong FS20 &amp;lt;adresse&amp;gt;&lt;br /&gt;
 attr WZ.Gong IODev CUL&lt;br /&gt;
 attr WZ.Gong alarmDevice Actor&lt;br /&gt;
 &#039;&#039;&#039;attr WZ.Gong alarmSettings alarm5,alarm6,|set WZ.Gong on||30&#039;&#039;&#039; (Vom Modul 95_Alarm.pm automatisch erzeugt)&lt;br /&gt;
 attr WZ.Gong group alarmActor&lt;br /&gt;
 attr WZ.Gong room Alarm,Erdgeschoss&lt;br /&gt;
In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_gongactor.png]]&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung eines MP3-Funkgongs (z.B. aus dem Homematic-Programm) kann man auf diesem eine ganze Menge verschiedene MP3-Dateien speichern, die z.B. Stimmenmeldungen &amp;quot;Alarmanlage scharf geschaltet&amp;quot; abgeben. Zur Erstellung dieser Meldungen hat es sich bewährt, einen kostenlosen Online-TTS (Text-to-Speech) Service zu nutzen, z.B. Ivona.&lt;br /&gt;
==Alarmierung per SMS== &lt;br /&gt;
Für Alarme, die man auch im Urlaub auf das Handy bekommen möchte, bedarf es natürlich eines Providers, der eine bestimmte Mailadresse als SMS weiterleitet. Ferner einer FHEM-Konfiguration, die Mails versenden kann. Dann wird ein &#039;&#039;dummy&#039;&#039; erzeugt und mit &#039;&#039;alarmDevice Actor&#039;&#039; attributiert, so dass er in der Aktorenliste auftaucht:&lt;br /&gt;
 define Mail.alarm dummy&lt;br /&gt;
 attr Mail.alarm alarmDevice Actor&lt;br /&gt;
 &#039;&#039;&#039;attr Mail.alarm alarmSettings alarm6,alarm7,|{DebianMail(&amp;lt;mailadresse&amp;gt;,&#039;Alarm&#039;,Value(&#039;AAA&#039;))}||30&#039;&#039;&#039; (automatisch erzeugt)&lt;br /&gt;
 attr Mail.alarm group alarmActor&lt;br /&gt;
 attr Mail.alarm room Alarm&lt;br /&gt;
In der Alarmkonfiguration sieht das dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:alarm_mailactor.png]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=26893.0|LinkText=Forenthread}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OPENWEATHER&amp;diff=13374</id>
		<title>OPENWEATHER</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OPENWEATHER&amp;diff=13374"/>
		<updated>2015-12-28T12:08:42Z</updated>

		<summary type="html">&lt;p&gt;SirUli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul extrahiert Wetterdaten über die &amp;quot;openweather&amp;quot;-Schnittstelle (API) von www.wetter.com.&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=OPENWEATHER&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=59_OPENWEATHER.pm&lt;br /&gt;
|ModOwner=tupol&lt;br /&gt;
}}&lt;br /&gt;
Das Modul extrahiert Wetterdaten über die &amp;quot;openweather&amp;quot;-Schnittstelle (API) von www.wetter.com.&lt;br /&gt;
&lt;br /&gt;
== API-Key erhalten ==&lt;br /&gt;
&lt;br /&gt;
Zuerst ist eine Registrierung für wetter.com unter folgender URL notwendig: http://at.wetter.com/mein_wetter/register/&lt;br /&gt;
&lt;br /&gt;
Nach Bestätigung des Accounts mittels der zugesandten E-Mail ist der Login möglich. Sobald man an der Seite angemeldet ist, kann man über die Navigation &#039;&#039;Apps &amp;amp; Mehr&#039;&#039; - &#039;&#039;Für Ihre Website&#039;&#039; die API auswählen (http://at.wetter.com/apps_und_mehr/website/api/). Dort klickt man auf &#039;&#039;Projektverwaltung&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:ow01.png|thumb|center|200px]]&lt;br /&gt;
&lt;br /&gt;
In der Projektverwaltung wählt man &#039;&#039;Neues Projekt&#039;&#039; und vergibt dann einen Namen, eine Beschreibung und eine Kategorie des Projekts sowie eine Webseite mit weiteren Informationen zum Projekt.&lt;br /&gt;
Die AGBs müssen natürlich noch gelesen und abgenickt werden, danach kann man mit einem Klick auf &#039;&#039;Projekt anlegen&#039;&#039; den Vorgang abschließen.&lt;br /&gt;
&lt;br /&gt;
[[File:ow02.png|center|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
Anschließend erhält man den gewünschten API-Key, der auch jederzeit in der Projektverwaltung nachgesehen werden kann.&lt;br /&gt;
&lt;br /&gt;
[[File:ow03.png|center|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
In der Projektverwaltung können dann noch Such- und Vorhersageeinstellungen konfiguriert werden, je nachdem, welche Werte man bei einer Abfrage an das API zurückbekommen möche. &#039;&#039;&#039;Wichtig&#039;&#039;&#039;: Wählt man hier nur einen Tag für die Vorhersage aus (Standard-Einstellung), so gibt es keine Vorhersage für die nachfolgenden Tage!&lt;br /&gt;
&lt;br /&gt;
[[File:ow04.png|center|thumb|200px]]&lt;br /&gt;
[[File:ow05.png|center|thumb|200px]]&lt;br /&gt;
&lt;br /&gt;
== Definition in fhem ==&lt;br /&gt;
&lt;br /&gt;
Ein OpenWeather-Device kann in fhem wie folgt angelegt werden:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; OPENWEATHER &amp;lt;project&amp;gt; &amp;lt;cityCode&amp;gt; &amp;lt;apiKey&amp;gt; [language]&lt;br /&gt;
&lt;br /&gt;
Wobei&lt;br /&gt;
*&#039;&#039;&#039;name&#039;&#039;&#039; angibt, unter welchem Namen das Device in fhem angezeigt werden soll&lt;br /&gt;
*&#039;&#039;&#039;project&#039;&#039;&#039; der Projektname ist, den man beim Anlegen des Projektes auf wetter.com vergeben hat&lt;br /&gt;
*&#039;&#039;&#039;cityCode&#039;&#039;&#039; der Code ist, der auch in der URL auf wetter.com ersichtlich ist, wenn man einen Ort auswählt (z.B. Wien: http://at.wetter.com/wetter_aktuell/aktuelles_wetter/oesterreich/wien/ATAT10678.html -&amp;gt; &#039;&#039;&#039;ATAT10678&#039;&#039;&#039;)&lt;br /&gt;
*&#039;&#039;&#039;apiKey&#039;&#039;&#039; der Key ist, den man beim Anlegen des Projektes auf wetter.com erhalten hat&lt;br /&gt;
*&#039;&#039;&#039;language&#039;&#039;&#039; eine optionale Sprachangabe ist (de ... deutsch, en ... englisch, usw.)&lt;br /&gt;
&lt;br /&gt;
Vollständige Beispiel wäre also:&lt;br /&gt;
 define meinWetter OPENWEATHER meinProjekt ATAT10678 0fb12e... de&lt;br /&gt;
&lt;br /&gt;
== Konfiguration in fhem ==&lt;br /&gt;
&lt;br /&gt;
Nach der Definition des Devices können noch zwei Attribute gesetzt werden:&lt;br /&gt;
*&#039;&#039;&#039;disable&#039;&#039;&#039; (0 oder 1): Der Wert &#039;&#039;1&#039;&#039; stoppt die automatische Aktualisierung der Wettervorhersage. Standard-Wert: &#039;&#039;0&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;INTERVAL&#039;&#039;&#039; (0 oder &amp;gt;=3600): Das Zeitintervall in Sekunden, in dem die Wettervorhersage aktualisiert wird. Standard-Wert: &#039;&#039;3600&#039;&#039;. &#039;&#039;0&#039;&#039; stoppt die automatische Aktualisierung.&lt;br /&gt;
&lt;br /&gt;
Um die Aktualisierung auf sechs Stunden zu setzen verwendet man also&lt;br /&gt;
 attr meinWetter INTERVAL 21600&lt;br /&gt;
&lt;br /&gt;
== Hinweis ==&lt;br /&gt;
Das OpenWeather-Modul verwendet die Perl-Module [http://search.cpan.org/~ether/HTTP-Message-6.11/lib/HTTP/Request.pm HTTP::Request], [http://search.cpan.org/~ether/libwww-perl-6.13/lib/LWP/UserAgent.pm LWP::UserAgent], [http://search.cpan.org/~cjm/HTML-Tree-5.03/lib/HTML/Parse.pm HTML::Parse] und [http://search.cpan.org/~gaas/Digest-MD5-2.54/MD5.pm Digest::MD5]&lt;br /&gt;
Sind sie nicht vorhanden, können sie aus der Shell mittels&lt;br /&gt;
 cpan Modulname&lt;br /&gt;
installiert werden.&lt;br /&gt;
&lt;br /&gt;
== OpenWeather-API Rückgabewerte ==&lt;br /&gt;
=== Ortsdaten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Wertname&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;name&#039;&#039;&#039;&lt;br /&gt;
|Name des Ortes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;post_code&#039;&#039;&#039;&lt;br /&gt;
|PLZ des Ortes/der Wetterstation&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;url&#039;&#039;&#039;&lt;br /&gt;
|Link auf die jeweilige Ortsseite auf wetter.com&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align: top;&amp;quot;|&#039;&#039;&#039;Credit&#039;&#039;&#039;&lt;br /&gt;
|Um die kostenlose wetter.com openweather API benutzen zu dürfen, müssen zwei von den drei &lt;br /&gt;
Hinweisen auf wetter.com angezeigt werden.&lt;br /&gt;
{|&lt;br /&gt;
!Wertname&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;text&#039;&#039;&#039;&lt;br /&gt;
|Powered by wetter.com&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;link&#039;&#039;&#039;&lt;br /&gt;
|Link auf wetter.com&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;logo&#039;&#039;&#039;&lt;br /&gt;
|Ein wetter.com Logo (Downloadlink zu offiziellen wetter.com Logos)&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wetterdaten ===&lt;br /&gt;
Es gibt (derzeit) für jeden Tag vier verschiedene Tagesabschnitte:&lt;br /&gt;
*06:00 bis 11:00&lt;br /&gt;
*11:00 bis 17:00&lt;br /&gt;
*17:00 bis 23:00&lt;br /&gt;
*23:00 bis 06:00&lt;br /&gt;
Für jeden dieser Abschnitte werden (abhängig von der getroffenen Auswahl in den Projekteinstellungen) folgende Werte zurückgeliefert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Wertname&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;du&#039;&#039;&#039;&lt;br /&gt;
|Unixtimestamp Unicode [int unsigned] &lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;d&#039;&#039;&#039;&lt;br /&gt;
|Unixtimestamp lokal [int unsigned]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;dhu&#039;&#039;&#039;&lt;br /&gt;
|ISO 8601 formatiertes Datum und Zeit, UTC [string]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;dhl&#039;&#039;&#039;&lt;br /&gt;
|ISO 8601 formatiertes Datum und Zeit, lokal [string]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;p&#039;&#039;&#039;&lt;br /&gt;
|Gültigkeitszeitraum der Prognose (24 Stunden, 1 Stunde, 3 Stunden, …) [int &lt;br /&gt;
unsigned, 0-24]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;w&#039;&#039;&#039;&lt;br /&gt;
|Code für Wetterzustand [int unsigned, 0-999] (siehe [[#Definition Wetterzustände]])&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;pc&#039;&#039;&#039;&lt;br /&gt;
|Änderung des Luftdrucks [float 1 Nachkommastelle]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;wd&#039;&#039;&#039;&lt;br /&gt;
|Windrichtung in Grad [int, 0=N, 90=O, 180=S, 270=W]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;ws&#039;&#039;&#039;&lt;br /&gt;
|Windgeschwindigkeit in Kilometer/Stunde [float unsigned, 1 Nachkommastelle]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;wd_txt&#039;&#039;&#039;&lt;br /&gt;
|Windrichtung in Textform (N,NO,S,SW …) [string]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;w_txt&#039;&#039;&#039;&lt;br /&gt;
|Wetterzustand in Textform [string]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;tn&#039;&#039;&#039;&lt;br /&gt;
|Mindesttemperatur&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;tx&#039;&#039;&#039;&lt;br /&gt;
|Maximaltemperatur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Definition Wetterzustände ===&lt;br /&gt;
Die Codes von 0-9 sind die Hauptwetterzustände. Alle anderen Codes sind Varianten dieser Zustände. &lt;br /&gt;
Zum Beispiel ist &#039;&#039;65: starker Regen&#039;&#039; eine Variante von &#039;&#039;6: Regen&#039;&#039;. Sollen nur die Hauptzustände angezeigt &lt;br /&gt;
werden kann einfach die erste Stelle des Codes verwendet werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Code (w)&lt;br /&gt;
!Wetterzustand (w_txt)&lt;br /&gt;
|-&lt;br /&gt;
|0||sonnig&lt;br /&gt;
|-&lt;br /&gt;
|1||leicht bewölkt&lt;br /&gt;
|-&lt;br /&gt;
|2||wolkig&lt;br /&gt;
|-&lt;br /&gt;
|3||bedeckt&lt;br /&gt;
|-&lt;br /&gt;
|4||Nebel&lt;br /&gt;
|-&lt;br /&gt;
|5||Sprühregen&lt;br /&gt;
|-&lt;br /&gt;
|6||Regen&lt;br /&gt;
|-&lt;br /&gt;
|7||Schnee&lt;br /&gt;
|-&lt;br /&gt;
|8||Schauer&lt;br /&gt;
|-&lt;br /&gt;
|9||Gewitter&lt;br /&gt;
|-&lt;br /&gt;
|10||leicht bewölkt&lt;br /&gt;
|-&lt;br /&gt;
|20||wolkig&lt;br /&gt;
|-&lt;br /&gt;
|30||bedeckt&lt;br /&gt;
|-&lt;br /&gt;
|40||Nebel&lt;br /&gt;
|-&lt;br /&gt;
|45||Nebel&lt;br /&gt;
|-&lt;br /&gt;
|48||Nebel mit Reifbildung&lt;br /&gt;
|-&lt;br /&gt;
|49||Nebel mit Reifbildung&lt;br /&gt;
|-&lt;br /&gt;
|50||Sprühregen&lt;br /&gt;
|-&lt;br /&gt;
|51||leichter Sprühregen&lt;br /&gt;
|-&lt;br /&gt;
|53||Sprühregen&lt;br /&gt;
|-&lt;br /&gt;
|55||starker Sprühregen&lt;br /&gt;
|-&lt;br /&gt;
|56||leichter Sprühregen, gefrierend&lt;br /&gt;
|-&lt;br /&gt;
|57||starker Sprühregen, gefrierend&lt;br /&gt;
|-&lt;br /&gt;
|60||leichter Regen&lt;br /&gt;
|-&lt;br /&gt;
|61||leichter Regen&lt;br /&gt;
|-&lt;br /&gt;
|63||mäßiger Regen&lt;br /&gt;
|-&lt;br /&gt;
|65||starker Regen&lt;br /&gt;
|-&lt;br /&gt;
|66||leichter Regen, gefrierend&lt;br /&gt;
|-&lt;br /&gt;
|67||mäßiger od. starker Regen, gefrierend&lt;br /&gt;
|-&lt;br /&gt;
|68||leichter Schnee-Regen&lt;br /&gt;
|-&lt;br /&gt;
|69||starker Schnee-Regen&lt;br /&gt;
|-&lt;br /&gt;
|70||leichter Schneefall&lt;br /&gt;
|-&lt;br /&gt;
|71||leichter Schneefall&lt;br /&gt;
|-&lt;br /&gt;
|73||mäßiger Schneefall&lt;br /&gt;
|-&lt;br /&gt;
|75||starker Schneefall&lt;br /&gt;
|-&lt;br /&gt;
|80||leichter Regen - Schauer&lt;br /&gt;
|-&lt;br /&gt;
|81||Regen - Schauer&lt;br /&gt;
|-&lt;br /&gt;
|82||starker Regen - Schauer&lt;br /&gt;
|-&lt;br /&gt;
|83||leichter Schnee / Regen - Schauer&lt;br /&gt;
|-&lt;br /&gt;
|84||starker Schnee / Regen - Schauer&lt;br /&gt;
|-&lt;br /&gt;
|85||leichter Schnee - Schauer&lt;br /&gt;
|-&lt;br /&gt;
|86||mäßiger od. starker Schnee - Schauer&lt;br /&gt;
|-&lt;br /&gt;
|90||Gewitter&lt;br /&gt;
|-&lt;br /&gt;
|95||leichtes Gewitter&lt;br /&gt;
|-&lt;br /&gt;
|96||starkes Gewitter&lt;br /&gt;
|-&lt;br /&gt;
|999||Keine Angabe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings des OpenWeather-Moduls in fhem ==&lt;br /&gt;
Im folgenden werden die unterschiedlichen Readings erklärt, die das Modul liefert.&lt;br /&gt;
&lt;br /&gt;
Dabei bedeutet fc&#039;&#039;&#039;X&#039;&#039;&#039; ein Platzhalter für&lt;br /&gt;
*fc&#039;&#039;&#039;0&#039;&#039;&#039;... heute&lt;br /&gt;
*fc&#039;&#039;&#039;1&#039;&#039;&#039;... morgen&lt;br /&gt;
*fc&#039;&#039;&#039;2&#039;&#039;&#039;... übermorgen&lt;br /&gt;
&lt;br /&gt;
Die Zahlen (06,11,17,23) hinter diversen Readings bedeuten den jeweiligen Tagesabschnitt wie in den OpenWeather-Rückgabewerten beschrieben.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Reading&lt;br /&gt;
!Beispielausgabe&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!OpenWeather-Wert&lt;br /&gt;
|-&lt;br /&gt;
|city&lt;br /&gt;
|Wien&lt;br /&gt;
|Ort&lt;br /&gt;
|name&lt;br /&gt;
|-&lt;br /&gt;
|fcX_chOfRain&lt;br /&gt;
|20&lt;br /&gt;
|Regenwahrscheinlichkeit&lt;br /&gt;
|pc&lt;br /&gt;
|-&lt;br /&gt;
|fcX_tempMax&lt;br /&gt;
|4&lt;br /&gt;
|Höchsttemperatur&lt;br /&gt;
|tx&lt;br /&gt;
|-&lt;br /&gt;
|fcX_tempMin&lt;br /&gt;
|1&lt;br /&gt;
|Mindesttemperatur&lt;br /&gt;
|tn&lt;br /&gt;
|-&lt;br /&gt;
|fcX_valHours&lt;br /&gt;
|24&lt;br /&gt;
|Gültigkeitszeitraum der Prognose in Stunden&lt;br /&gt;
|p&lt;br /&gt;
|-&lt;br /&gt;
|fcX_wday&lt;br /&gt;
|Di&lt;br /&gt;
|Abkürzung des Wochentages&lt;br /&gt;
|d&lt;br /&gt;
|-&lt;br /&gt;
|fcX_weather&lt;br /&gt;
|leicht bewölkt&lt;br /&gt;
|Wetterzustand als Text&lt;br /&gt;
|w_txt&lt;br /&gt;
|-&lt;br /&gt;
|fcX_weatherCode&lt;br /&gt;
|1&lt;br /&gt;
|Code für den Wetterzustand&lt;br /&gt;
|w&lt;br /&gt;
|-&lt;br /&gt;
|fcX_wind&lt;br /&gt;
|6&lt;br /&gt;
|Windgeschwindigkeit in km/h&lt;br /&gt;
|ws&lt;br /&gt;
|-&lt;br /&gt;
|fcX_windDir&lt;br /&gt;
|135&lt;br /&gt;
|Windrichtung in Grad&lt;br /&gt;
|wd&lt;br /&gt;
|-&lt;br /&gt;
|fcX_windDirTxt&lt;br /&gt;
|SO&lt;br /&gt;
|Windrichtung als Text&lt;br /&gt;
|wd_txt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Informationen ==&lt;br /&gt;
*[http://at.wetter.com/apps_und_mehr/website/api/dokumentation/ API-Dokumentation auf wetter.com]&lt;br /&gt;
*[http://fhem.de/commandref_DE.html#OPENWEATHER fhem CommandRef]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=12027</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=12027"/>
		<updated>2015-08-20T14:13:27Z</updated>

		<summary type="html">&lt;p&gt;SirUli: /* X_Notify */ Completed example and changed a few lines as new functions are available.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. &lt;br /&gt;
Insbesondere beschreibt der Text derzeit nur einstufige Module. Die Abgrenzung zu zweistufigen Modulen und deren Eigenschaften sollte noch ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Um neue Geräte in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben, das automatisch von FHEM geladen wird, wenn ein passendes Gerät in FHEM definiert wird. Das Modul definiert dann wie mit dem Gerät kommuniziert wird, stellt Werte (&amp;quot;Readings&amp;quot;) innerhalb von FHEM zur Verfügung oder erlaubt es das Gerät mit &amp;quot;Set&amp;quot;-Befehlen zu beeinflussen. Dieser Text soll den Einstieg in die Entwicklung eigener Module erleichtern.&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;quot;define&amp;quot;, der typischerweise in die zentrale Konfigurationsdatei fhem.cfg  eingetragen wird, werden Geräte in FHEM definiert. Der Befehl sorgt dafür dass ein neues Modul bei Bedarf geladen wird und die Initialisierungsfunktion des Moduls aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen der Name des Geräts, der Name des Moduls und der Name der Initialisierungsfunktion zueinander passen. Das folgende Beispiel soll dies verdeutlichen:&lt;br /&gt;
&lt;br /&gt;
Ein Jeelink USB-Stick in einer Fritz-Box könnte beispielsweise mit dem Befehl &amp;lt;code&amp;gt;define JeeLink1 JeeLink /dev/ttyUSB0@57600&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
In der fhem.pl wird der define-Befehl verarbeitet, geprüft, ob ein Modul mit Namen JeeLink schon geladen ist und falls nicht ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (bei einer FritzBox z.B. /var/media/ftp/fhem/FHEM) gesucht und dann geladen. &lt;br /&gt;
Danach wird die Funktion JeeLink_Initialize aufgerufen.&lt;br /&gt;
Die Moduldatei muss also nach dem Namen des Geräts benannt werden und eine Funktion mit dem Namen des Geräts und einer _initialize Funktion enthalten.&lt;br /&gt;
In der Initialisierungsfunktion des Moduls werden dann die Namen der aller weiteren Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird der Hash - das ist die zentrale Datenstruktur für jede Instanz eines Gerätes - mit entsprechenden Werten gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Der Hash einer Geräteinstanz ==&lt;br /&gt;
Eine Besonderheit in Perl sind [http://de.wikipedia.org/wiki/Assoziatives_Array#Perl assoziative Arrays], (nicht ganz richtig als &amp;quot;Hash&amp;quot; bezeichnet) in denen die Adressierung nicht über eine Zählvariable erfolgt, sondern über einen beliebigen String. Die internen Abläufe bei der Adressierung führen dazu, dass die Speicherung in und der Abruf aus Hashes relativ langsam ist.&lt;br /&gt;
&lt;br /&gt;
Der zentrale Speicherort für Informationen einer Geräteinstanz bei FHEM ist ein solcher Hash, der seinerseits in fhem.pl von einem globalen Hash referenziert wird. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$defs{&#039;&#039;Devicename&#039;&#039;}&amp;lt;/code&amp;gt; in fhem.pl verweist auf den Hash der Geräteinstanz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben, das direkt von fhem.pl aufgerufen wird. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im GUI als &amp;quot;Internals&amp;quot; angezeigt werden oder die Readings des Geräts. Beispiele:&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{NAME}&amp;lt;/code&amp;gt; enthält den Namen der Geräteinstanz, &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{TYPE}&amp;lt;/code&amp;gt;  enthält die Typbezeichnung des Geräts &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; enthält ein Abfrageintervall&lt;br /&gt;
&lt;br /&gt;
==Ausführung von Modulen==&lt;br /&gt;
FHEM führt Module normalerweise nicht parallel aus. Daher wäre es ungünstig wenn Module Werte von einem Gerät abfragen und dann auf die Antwort des Geräts warten. In dieser Zeit wäre der Rest von FHEM blockiert. Die Ein- und Ausgabe sollte ohne Blockieren erfolgen und die Verarbeitung mehrerer Ein- und Ausgabekanäle quasi parallel ermöglichen. &lt;br /&gt;
&lt;br /&gt;
Dafür werden in FHEM zwei zentrale Listen gepflegt, in der die Filedeskriptoren der geöffneten Kommunikatonsverbindungen gespeichert sein können. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet und entsprechend gibt es in FHEM eine selectlist, in der die Filedeskriptoren der Geräedateien (z.B. /dev/ttyUSBx etc.) gespeichert sind. &lt;br /&gt;
&lt;br /&gt;
In der zentralen Schleife von fhem.pl wird mit select überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion (X_Read) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und die Schleife wird weiter ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per select überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion (X_Ready) implementieren, die prüft ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
Innerhalb der eigentlichen Lesefunktion (X_Read) werden dann die Daten vom zugehörigen Gerät gelesen, das nötige Protokoll implementiert und Werte in Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Werte, die von einem Gerät gelesen werden und in FHEM zur Verfügung stehen werden Readings genannt. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{VAL}&amp;lt;/code&amp;gt; für die Temperatur eines Fühlers&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{TIME}&amp;lt;/code&amp;gt; für den Zeitstempel der Messung&lt;br /&gt;
&lt;br /&gt;
Für den lesenden Zugriff auf Readings steht die Funktion ReadingsVal($$$) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Readings werden im statefile von FHEM automatisch zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen, auch bevor sie vom Modul neu gesetzt oder aktualisiert werden. &lt;br /&gt;
&lt;br /&gt;
Zum Setzen von Readings sollen &lt;br /&gt;
*bei Gruppen von Readings der Funktionsblock &amp;lt;code&amp;gt;readingsBeginUpdate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readingsBulkUpdate&amp;lt;/code&amp;gt; (mehrfach wiederholt), &amp;lt;code&amp;gt;readingsEndUpdate&amp;lt;/code&amp;gt;&lt;br /&gt;
*bei einzelnen Updates die Funktion &amp;lt;code&amp;gt;readingsSingleUpdate&amp;lt;/code&amp;gt; &lt;br /&gt;
aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht.  Events erzeugen spürbare Last auf dem System (siehe NotifyFn), das Ändern von Readings ohne dass dabei Events erzeugt werden jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Eine Sequenz zum Setzen von Readings könnte folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
readingsBulkUpdate($hash, $readingName1, $wert1 );&lt;br /&gt;
readingsBulkUpdate($hash, $readingName2, $wert2 );&lt;br /&gt;
readingsEndUpdate($hash, 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Werte, die das Modul intern als Teil des Hashes speichert, die aber keine Readings sind, nennt man Internals. Sie werden ebenfalls als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese &amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; für ein Abfrageintervall, das beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Internals werden jedoch im Gegensatz zu Readings nicht im statefile zwischengespeichert. &lt;br /&gt;
&lt;br /&gt;
Falls Werte wie das gerade erwähnte Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollen, ist eine alternative Möglichkeit die Speicherung in so genannten Attributen. Dann würde man den Define-Befehl so implementieren, dass er kein Intervall übergeben bekommt und statt dessen nach dem Define-Befehl zusätzlich den Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; erwarten.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Parameter einer Geräteinstanz können mit dem Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; als so genannte Attribute gesetzt und damit dem Modul zur Verfügung gestellt werden. Attribute werden zusammen mit der Definition der Geräte beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben, die auch bei jedem Neustart von FHEM wieder gelesen wird. Zur Laufzeit werden Attribute in der globalen Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt; gespeichert. Ein Attribut mit dem Namen &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; würde beispielsweise mit &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; adressiert (&amp;lt;code&amp;gt;$attr{$name}-&amp;gt;{&#039;header&#039;}&amp;lt;/code&amp;gt; wäre eine alternative aber unübliche Schreibweise für die selbe Variable). &lt;br /&gt;
&lt;br /&gt;
Zum Auslesen solcher Attribute sollte die Funktion &amp;lt;code&amp;gt;AttrVal($$$)&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Welche Attribute ein Modul unterstützt sollte in der Funktion &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]&amp;lt;/code&amp;gt; durch Setzen der Variable &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; bekannt gemacht werden (siehe unten). Wenn beim Setzen von Attributen die Werte geprüft werden sollen oder zusätzliche Funktionalität implementiert werden muss, dann kann dies in der Funktion &amp;lt;code&amp;gt;[[#X_Attr|X_Attr]]&amp;lt;/code&amp;gt; ([[#X_Attr|siehe unten]]) implementiert werden.&lt;br /&gt;
&lt;br /&gt;
== Die wichtigsten Funktionen in einem Modul ==&lt;br /&gt;
Eine typische Grundfunktion eines einfachen Moduls ist das Auslesen von Werten von einem physischen Gerät und Bereitstellen dieser Werte innerhalb von FHEM als Readings. Das Geräte könnte beispielsweise an einem USB-Port angeschlossen sein. Folgende Funktionen könnte man beispielsweise in einem Modul mit Namen X implementieren:&lt;br /&gt;
* [[#X_Initialize|X_Initialize]] (initialisiert das Modul und gibt de Namen der zusätzlichen Funktionen bekannt)&lt;br /&gt;
* [[#X_Define|X_Define]] (wird beim &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; aufgerufen)&lt;br /&gt;
* [[#X_Undef|X_Undef]] (wird beim Löschen einer Geräteinstanz aufgerufen - Gegenteil zu &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [[#X_Set|X_Set]] (wird beim Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; aufgerufen um Daten an das Gerät zu senden)&lt;br /&gt;
* [[#X_Get|X_Get]] (wird beim Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; aufgerufen um Daten vom Gerät abzufragen)&lt;br /&gt;
* [[#X_Attr|X_Attr]] (wird beim Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; aufgerufen um beispielsweise Werte zu prüfen)&lt;br /&gt;
* [[#X_Read|X_Read]] (wird vom globalen select aufgerufen, falls Daten zur Verfuegung stehen)&lt;br /&gt;
* [[#X_Parse|X_Parse]] (wird bei zweistufigen Modulen vom Dispatch aufgerufen und muss hier noch beschrieben werden)&lt;br /&gt;
* [[#X_Ready|X_Ready]] (wird unter windows als ReadFn-Erstatz benoetigt bzw. um zu pruefen, ob ein Geraet wieder eingesteckt ist)&lt;br /&gt;
* [[#X_Notify|X_Notify]] (falls man benachrichtigt werden will)&lt;br /&gt;
* [[#X_Rename|X_Rename]] (falls ein Gerät umbenannt wird)&lt;br /&gt;
&lt;br /&gt;
Die Funktionen werden im folgenden beschrieben (soweit diese Seite inzwischen vollständig ist):&lt;br /&gt;
&lt;br /&gt;
=== X_Initialize ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; im Namen muss dabei auf den Namen des Moduls bzw. des definierten Gerätetyps geändert werden. Im Modul mit der Datei &amp;lt;code&amp;gt;36_JeeLink.pm&amp;lt;/code&amp;gt; beispielsweise ist der Name der Funktion &amp;lt;code&amp;gt;JeeLink_Initialize&amp;lt;/code&amp;gt;. Die Funktion wird von Fhem.pl nach dem Laden des Moduls aufgerufen und bekommt einen Hash für das Modul als zentrale Datenstruktur übergeben. &lt;br /&gt;
&lt;br /&gt;
Dieser Hash wird im globalen Hash %modules gespeichert. &amp;lt;code&amp;gt;$modules{$ModulName}&amp;lt;/code&amp;gt; wäre dabei der Hash für das Modul mit dem Namen &amp;lt;code&amp;gt;$ModulName&amp;lt;/code&amp;gt;. Es handelt sich also nicht um den oben beschriebenen Hash der Geräteinstanzen sondern einen Hash, der je Modul Werte enthält, beispielsweise auch die Namen der Funktionen, die das Modul implementiert und die fhem.pl aufrufen soll. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DefFn}   = &amp;quot;X_Define&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{UndefFn} = &amp;quot;X_Undef&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{SetFn}   = &amp;quot;X_Set&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{GetFn}   = &amp;quot;X_Get&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AttrFn}  = &amp;quot;X_Attr&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; ist wieder durch den Modulnamen ohne die vorangestellte Zahl zu ersetzen. &lt;br /&gt;
Entsprechend können auch die Funktionen &amp;lt;code&amp;gt;X_Read&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X_Parse&amp;lt;/code&amp;gt; etc. durch Zuweisung an &amp;lt;code&amp;gt;$hash-&amp;gt;{ReadFn}&amp;lt;/code&amp;gt; etc. bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sollten die vom Modul unterstützen Attribute definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{AttrList} =&lt;br /&gt;
  &amp;quot;do_not_notify:1,0 &amp;quot; . &lt;br /&gt;
  &amp;quot;header &amp;quot; .&lt;br /&gt;
  $readingFnAttributes;  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem.pl werden dann die entsprechenden Werte beim Aufruf eines &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls in die globale Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt;, z.B. &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; für das Attribut &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; gespeichert. Falls im Modul weitere Aktionen oder Prüfungen beim Setzen eines Attributs nötig sind, dann kann wie im Beispiel oben die Funktion &amp;lt;code&amp;gt;X_Attr&amp;lt;/code&amp;gt; implementiert und in der Initialize-Funktion bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$readingFnAttributes&amp;lt;/code&amp;gt;, die im obigen Beispiel an die Liste der unterstützten Attribute angefügt wird, definiert Attributnamen, die dann verfügbar werden wenn das Modul zum Setzen von Readings die Funktionen readingsBeginUpdate, readingsBulkUpdate, readingsEndUpdate oder readingsSingleUpdate verwendet. In diesen Funktionen werden Attribute wie &amp;lt;code&amp;gt;event-min-interval&amp;lt;/code&amp;gt; oder auch &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; ausgewertet. Für Details hierzu siehe commandref.&lt;br /&gt;
&lt;br /&gt;
=== X_Define ===&lt;br /&gt;
Die Define-Funktion eines Moduls wird von Fhem aufgerufen wenn der Define-Befehl für ein Geräte ausgeführt wird und das Modul bereits geladen und mit der Initialize-Funktion initialisiert ist. Sie ist typischerweise dazu da, die übergebenen Parameter zu prüfen und an geeigneter Stelle zu speichern sowie einen Kommunikationsweg zum Gerät zu öffnen (z.B. TCP-Verbindung, USB-Schnittstelle o.ä.)&lt;br /&gt;
Sie beginnt typischerweise mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub HTTPMOD_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	my @a = split( &amp;quot;[ \t][ \t]*&amp;quot;, $def );&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den Rest der Parameter, die im Befehl angegeben wurden. Welche und wie viele Parameter &lt;br /&gt;
akzeptiert werden ist Sache dieser Funktion. Im obigen Beispiel wird alles nach dem übergebenen Hash in ein Array aufgeteilt und so können die vom Modul bzw. der Define-Funktion erwarteten Werte über das Array der Reihe nach verarbeitet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $name 	= $a[0];&lt;br /&gt;
my $url 	= $a[2];&lt;br /&gt;
my $inter	= 300;&lt;br /&gt;
if(int(@a) == 4) { &lt;br /&gt;
	$inter = $a[3]; &lt;br /&gt;
	if ($inter &amp;lt; 5) {&lt;br /&gt;
		return &amp;quot;interval too small, please use something &amp;gt; 5, default is 300&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit die übergebenen Werte auch anderen Funktionen zur Verfügung stehen und an die jeweilige Geräteinstanz gebunden sind, werden die Werte typischerweise als Internals im Hash der Geräteinstanz gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{url} 		= $url;&lt;br /&gt;
$hash-&amp;gt;{Interval}	= $inter;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine physische Schnittstelle geöffnet werden soll und dann bei verfügbaren Eingabedaten eine Lese-Funktion von Fhem aufgerufen werden soll, dann kann man in der Define-Funktion die Funktion DevIo_OpenDev aufrufen, die sich um alles weitere kümmert. Sie öffnet die Schnittstelle und fügt den Filedeskriptor an die globale Liste offener Verbindungen (selectlist / readyfnlist) an. Damit kann Fhem in seiner Hauptschleife erkennen, von welchem Gerät Daten bereit stehen und die zuständigen Funktionen aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $ret = DevIo_OpenDev( $hash, 0, &amp;quot;X_DevInit&amp;quot; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die optionale Funktion &amp;lt;code&amp;gt;X_DevInit&amp;lt;/code&amp;gt; wird zur weiteren Initialisierung der Verbindung von &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; aufgerufen. Der zweite Übergabeparameter an &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; (hier &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) steht für reopen und wird benötigt, da die Funktion auch aufgerufen wird, wenn ein USB-Geräte beispielsweise im Betrieb aus- und wieder eingesteckt wird. In diesem Fall wird die Funktion mit &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; aufgerufen.&lt;br /&gt;
&lt;br /&gt;
=== X_Undef ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;Undef&amp;lt;/code&amp;gt;-Funktion ist das Gegenstück zur &amp;lt;code&amp;gt;Define&amp;lt;/code&amp;gt;-Funktion und wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird oder bei der Abarbeitung des Befehls rereadcfg, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu abarbeitet. Entsprechend müssen in der Funktion typische Aufräumarbeiten durchgeführt werden wie das saubere Schließen von Verbindungen oder das Entfernen von internen Timern sofern diese im Modul zum Pollen verwendet wurden (siehe später). &lt;br /&gt;
&lt;br /&gt;
Zugewiesene Variablen im Hash der Geräteinstanz, Internals oder Readings müssen hier nicht gelöscht werden. In fhem.pl werden die entsprechenden Strukturen beim Löschen der Geräteinstanz ohnehin vollständig gelöscht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub WKRCD4_Undef($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $arg ) = @_;       &lt;br /&gt;
	DevIo_CloseDev($hash);         &lt;br /&gt;
	RemoveInternalTimer($hash);    &lt;br /&gt;
	return undef;                  &lt;br /&gt;
}    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Get ===&lt;br /&gt;
Die Get-Funktion wird aufgerufen wenn der Fhem-Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; mit einem Gerät dieses Moduls ausgeführt wird. Mit &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; werden typischerweise Werte von einem Gerät abgefragt. Einige Module verwenden für diese Funktion einen Hash im Modul, der die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen mit zusätzlichen Werten definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my X_gets = (&lt;br /&gt;
	&amp;quot;TempSoll&amp;quot;	=&amp;gt; &amp;quot;XY&amp;quot;,&lt;br /&gt;
	&amp;quot;Steilheit&amp;quot;	=&amp;gt; &amp;quot;Z&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der Get-Funktion selbst werden dann die übergebenen Parameter gegen diesen Hash geprüft.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Get($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;get X\&amp;quot; needs at least one argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	if(!$X_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %X_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Meldung mit &amp;lt;code&amp;gt;unknown ... choose one of ...&amp;lt;/code&amp;gt; ist dabei wichtig, da sie im GUI-Modul verwendet wird um die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen zu ermitteln und als Auswahl anzubieten. Im weiteren Verlauf der Get-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert abfragen und diesen als Return-Wert der Get-Funktion zurückgeben.&lt;br /&gt;
&lt;br /&gt;
=== X_Set ===&lt;br /&gt;
Die Set-Funktion ist das Gegenteil zur Get-Funktion. Sie ist dafür gedacht, Werte zum physischen Gerät zu schicken. Falls nur interne Werte im Modul gesetzt werden sollen, so sollte statt Set die Attr-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht.&lt;br /&gt;
 &lt;br /&gt;
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch nach dem Namen der Option auch den zu setzenden Wert übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;set X\&amp;quot; needs at least an argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @a);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		my @cList = keys %X_sets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das GUI FHEM-Web kann für die einzelnen Set-Optionen, die das Modul versteht auch automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht des GUI kann der Anwender dann die jeweiligen Werte komfortabel auswählen. Dafür muss die Set-Funktion, wenn sie mit der Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; aufgerufen wird, nicht nur einen Text mit  &amp;lt;code&amp;gt;&amp;quot;Unknwon ... choose one of ...&amp;quot;&amp;lt;/code&amp;gt; zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt Zusatzinformationen anhängen.&lt;br /&gt;
Meist prüft man in den Modulen gar nicht auf die Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; sondern gibt generell bei unbekannten Optionen diesen Text zurück.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of mode:verbose,ultra,relaxed turbo:NoArg&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Die möglichen Zusatzinformationen sind:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;noArg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es werden keine weiteren Argumente mehr benötigt&lt;br /&gt;
&amp;lt;pre&amp;gt;on:noArg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;slider&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es wird ein Schieberegler für den Wert angezeigt. Dabei Minimum, Schrittweite und Maximum angeben&lt;br /&gt;
&amp;lt;pre&amp;gt;dim:slider,0,1,100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RGB&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es wird ein Colorpicker angezeigt, der dem Anwender die Auswahl einer Farbe ermöglicht. Bitte dazu auch den Wiki Artikel zum Colorpicker lesen, da im Modul noch weiterer Code eingefügt werden muss.&lt;br /&gt;
&amp;lt;pre&amp;gt;rgb:colorpicker,RGB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Liste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit Kommata getrennte Werte ergeben eine Drop-Down Liste, mit der der User die Werte auswählen kann&lt;br /&gt;
&amp;lt;pre&amp;gt;timer:30,120,300&lt;br /&gt;
mode:verbose,ultra,relaxed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Leer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wird kein Doppelpunkt zum Kommando angegeben, so wird eine Eingabezeile angezeigt, die die freie Eingabe eines Wertes erlaubt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Damit in einer Eingabe bereits der aktuelle Wert vorbelegt bzw. in einer Auswahlliste der aktuelle Wert vorselektiert ist, muss es im Modul bzw. Gerät ein Reading mit dem gleichen Namen wie die Set-Option geben. Der Wert des gleichnamigen Readings wird dann als Vorbelegung / Vorselektion verwendet. &lt;br /&gt;
&lt;br /&gt;
- bei den üblichen Kommandos wie on off sollte man auf noArg verzichten, da diese durch FHEMWeb automatisch in der Raumübersicht angezeigt werden. Wenn man hier noArg spezifiziert, so werden diese nicht neben dem Modul in der Raumübersicht angezeigt und der User muss sich diese vie webCmd dann erst selbst definieren, was natürlich unschön ist&lt;br /&gt;
&lt;br /&gt;
- der User kann sich in der Raumübersicht nach wie vor via webCmd eine entsprechende Steuerung anlegen.&lt;br /&gt;
&lt;br /&gt;
=== X_Attr ===&lt;br /&gt;
Die Attr-Funktion implementiert Prüfungen der bei einem &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; übergebenen Werte und eventuell zusätzliche Aktionen wenn ein Attribut gesetzt wird. Die Liste der möglichen Attribute wird in der &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]-Funktion&amp;lt;/code&amp;gt; definiert ([[#X_Initialize|siehe oben]]). Fhem ruft bei einem Attr-Befehl die zuständige &amp;lt;code&amp;gt;X-Attr-Funktion&amp;lt;/code&amp;gt; auf und wenn diese keine Fehlermeldung sondern &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgibt, dann schreibt fhem.pl die bei &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; angegebenen Werte in die jeweilige Datenstruktur &amp;lt;code&amp;gt;$attr{$name}-&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X_Attr(@)&lt;br /&gt;
{&lt;br /&gt;
	my ($cmd,$name,$aName,$aVal) = @_;&lt;br /&gt;
  	# $cmd can be &amp;quot;del&amp;quot; or &amp;quot;set&amp;quot;&lt;br /&gt;
	# $name is device name&lt;br /&gt;
	# aName and aVal are Attribute name and value&lt;br /&gt;
	if ($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
		if ($aName eq &amp;quot;Regex&amp;quot;) {&lt;br /&gt;
			eval { qr/$aVal/ };&lt;br /&gt;
			if ($@) {&lt;br /&gt;
				Log3 $name, 3, &amp;quot;X: Invalid regex in attr $name $aName $aVal: $@&amp;quot;;&lt;br /&gt;
				return &amp;quot;Invalid Regex $aVal&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie ja auch keine Werte dort speichern muss, sondern den Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;del&amp;lt;/code&amp;gt; je nachdem ob ein Attribut gesetzt oder gelöscht wird, den Namen der Geräteinstanz sowie den Namen des Attributs und seinen Wert.&lt;br /&gt;
Im obigen Beispiel wird für ein Attribut mit Namen Regex geprüft ob die Regex fehlerhaft ist. Falls sie ok ist, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben und fhem.pl speichert den Wert des Attributs.&lt;br /&gt;
&lt;br /&gt;
Falls man Attribute mit Platzhaltern definiert (Wildcard-Attribute), z.B. mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
      &amp;quot;reading[0-9]*Name &amp;quot; .&lt;br /&gt;
    # usw.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken, da Fhemweb nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muß solche Attribute über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; Befehl eintippen.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch in der Attr-Funktion neu gesetzte Ausprägungen von Wildcard-Attributen an die gerätespezifische userattr-Variable anfügen. Dann können bereits gesetzte Attribute in Fhemweb durch Klicken ausgewählt und geändert werden.&lt;br /&gt;
Dazu reicht ein Aufruf von &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    addToDevAttrList($name, $aName);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Attr-Funktion wenn ein Attribut gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== X_Read ===&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion wird aus der Hauptschleife von FHEM aus aufgerufen wenn das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können. Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Seriell-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion &amp;lt;code&amp;gt;DevIo_SimpleRead&amp;lt;/code&amp;gt; gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann.&lt;br /&gt;
Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten zwischenspeichern. Es bietet sich an, dies im Hash der Geräteinstanz zu tun. Im Beispiel ist dies &amp;lt;code&amp;gt;$hash-&amp;gt;{buffer}&amp;lt;/code&amp;gt; an den die jeweils gelesenen Daten angehängt werden bis die folgende Prüfung ein für das jeweilige Protokoll passendes Frame identifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Read($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	&lt;br /&gt;
	# read from serial device&lt;br /&gt;
	my $buf = DevIo_SimpleRead($hash);		&lt;br /&gt;
	return &amp;quot;&amp;quot; if ( !defined($buf) );&lt;br /&gt;
&lt;br /&gt;
	# convert to hex string to make parsing with regex easier&lt;br /&gt;
	$hash-&amp;gt;{buffer} .= unpack (&#039;H*&#039;, $buf);	&lt;br /&gt;
	Log3 $name, 5, &amp;quot;Current buffer content: &amp;quot; . $hash-&amp;gt;{buffer};&lt;br /&gt;
&lt;br /&gt;
	# did we already get a full frame?&lt;br /&gt;
	if ($hash-&amp;gt;{buffer} =~ &amp;quot;ff1002(.{4})(.*)1003(.{4})ff(.*)&amp;quot;) &lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zu lesenden Nutzdaten können dann je nach Protokoll des Geräts beispielsweise an einer festgelegten Stelle im Frame (dann in &amp;lt;code&amp;gt;$hash-&amp;gt;{buffer}&amp;lt;/code&amp;gt;) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und in Readings gespeichert werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
=== X_Ready ===&lt;br /&gt;
&lt;br /&gt;
muss noch beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Ready($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	return DevIo_OpenDev($hash, 1, undef )&lt;br /&gt;
	  if ( $hash-&amp;gt;{STATE} eq &amp;quot;disconnected&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	# This is relevant for windows/USB only&lt;br /&gt;
	my $po = $hash-&amp;gt;{USBDev};&lt;br /&gt;
	my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po-&amp;gt;status;&lt;br /&gt;
	return ( $InBytes &amp;gt; 0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Notify ===&lt;br /&gt;
&lt;br /&gt;
Die X_Notify-Funktion wird aus der Funktion DoTrigger in fhem.pl heraus aufgerufen wenn ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind das Filelog-Modul oder das Average-Modul. Average reagiert auf Events anderer Module und erweitert diese mit der Berechnung von Tages- und Monats-Durchschnittswerten.&lt;br /&gt;
&lt;br /&gt;
Die Notify-Funktion bekommt dafür zwei Hashes übergeben: den Hash des eigenen Geräts und den Hash des Geräts, das die Events erzeugt hat. &lt;br /&gt;
Über den Hash des eigenen Geräts kann die Notify-Funktion beispielsweise auf die Internals oder Attribute des eigenen Geräts zugreifen.&lt;br /&gt;
Über den Hash des Geräts, das die Events erzeugt hat, kann es die Events verarbeiten. Events werden je Gerät in einem Array, das über das Internal &amp;lt;code&amp;gt;CHANGED&amp;lt;/code&amp;gt; referenziert wird, gespeichert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
  my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
&lt;br /&gt;
  return &amp;quot;&amp;quot; if(IsDisabled($hashName)); # Return without any further action if the module is disabled&lt;br /&gt;
&lt;br /&gt;
  my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
&lt;br /&gt;
  my $max = int(@{$dev_hash-&amp;gt;{CHANGED}}); # number of events / changes&lt;br /&gt;
&lt;br /&gt;
  for (my $i = 0; $i &amp;lt; $max; $i++) {&lt;br /&gt;
    my $s = $dev-&amp;gt;{CHANGED}[$i];&lt;br /&gt;
    next if(!defined($s));&lt;br /&gt;
&lt;br /&gt;
    # Insert further code here&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Notify-Funktion für jedes Gerät mit allen seinen Events aufgerufen wird, muss sie in einer Schleife alle Events prüfen und entscheiden, ob es mit dem jeweiligen Event etwas tun möchte. Ein Gerät, das die Notify-Funktion implementiert sieht dafür typischerweise einen regulären Ausdruck vor, der für die Filterung verwendet wird.&lt;br /&gt;
Als anschauliches Beispiel und für weitere Details eignet sich das Modul 98_Average.pm&lt;br /&gt;
&lt;br /&gt;
=== X_DbLog_splitFn ===&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.&amp;lt;br&amp;gt;&lt;br /&gt;
Eingangsparameter: Das generierte Event&amp;lt;br&amp;gt;&lt;br /&gt;
Rückgabewerte: Array: Reading/Value/Unit&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_DbLog_splitFn($)&lt;br /&gt;
{&lt;br /&gt;
	my ($event) = @_;&lt;br /&gt;
	my ($reading, $value, $unit);&lt;br /&gt;
&lt;br /&gt;
	if($event =~ m/temperature/) {&lt;br /&gt;
	   $reading = &#039;temperature&#039;;&lt;br /&gt;
	   $value = substr($event,12,4);&lt;br /&gt;
	   $unit = &#039;°C&#039;;&lt;br /&gt;
	}   &lt;br /&gt;
        &lt;br /&gt;
        return ($reading, $value, $unit);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pollen von Geräten ==&lt;br /&gt;
Wenn Geräte von sich aus keine Informationen senden sondern abgefragt werden müssen, kann man im Modul die Funktion &amp;lt;code&amp;gt;InternalTimer&amp;lt;/code&amp;gt; verwenden. Man übergibt ihr den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, den zu übergebenden Parameter und ein Flag ob der erste Aufruf verzögert werden soll falls die Initialiserung des Geräts noch nicht abgeschlossen ist. Als zu übergebender Parameter wird üblicherweise der Hash der betroffenen Geräteinstanz verwendet. Damit hat die aufgerufene Funktion Zugriff auf alle wichtigen Daten der Geräteinstanz. Eventuell zusätzlich benötigte Werte können einfach als weitere Internals über den Hash zugänglich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise könnte man für das Abfragen eines Geräts in der Define-Funktion den Timer folgendermassen setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# initial request after 2 secs, there timer is set to interval for further update&lt;br /&gt;
InternalTimer(gettimeofday()+2, &amp;quot;X_GetUpdate&amp;quot;, $hash, 0);	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Funktion &amp;lt;code&amp;gt;X_GetUpdate&amp;lt;/code&amp;gt; selbst wird dann der Timer neu gesetzt, so dass nach einem Intervall die Funktion erneut aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_GetUpdate($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	InternalTimer(gettimeofday()+$hash-&amp;gt;{Interval}, &amp;quot;X_GetUpdate&amp;quot;, $hash, 1);&lt;br /&gt;
	Log3 $name, 4, &amp;quot;X: GetUpdate called ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im weiteren Verlauf der Funktion könnte man dann das Gerät abfragen und die abgefragten Werte in Readings speichern. Falls das Abfragen der Werte jedoch zu einer Verzögerung und damit zu einer Blockade von FHEM führen kann, ist es möglich, in der GetUpdate-Funktion nur die Aufforderung zum Senden bestimmter Daten an das angeschlossene Gerät zu senden und dann das Lesen über die oben beschriebene Read-Funktion zu implementieren, die beim Anstehen von Daten aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
== Logging / Debugging ==&lt;br /&gt;
Um Innerhalb eines Moduls eine Protokollmeldung in die Fhem-Logdatei zu schreiben, wird die Funktion Log3 aufgerufen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Log3 $name, 3, &amp;quot;X: Problem erkannt ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Parameter der Funktion Log3 sind der Name oder der Hash der Geräteinstanz, das Verbose-Level, in dem die Meldung sichtbar sein soll und die Meldung selbst.&lt;br /&gt;
Den Namen der Geräteinstanz kann man in den Funktionen, die den Hash übergeben bekommen einfach aus diesem Hash nehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für ein neues Modul das Verbose-Level zu erhöhen, ohne gleich für das Gesamte FHEM alle Meldungen zu erzeugen kann man den Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;attr gerätename verbose&amp;lt;/code&amp;gt; verwenden. Beispielsweise &amp;lt;code&amp;gt;attr PM verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit bietet es sich an im Modul Meldungen, die im normalen Betrieb nicht benötigt werden, beim Aufruf von Log3 mit dem Level 4 oder 5 anzugeben. Wenn man dann bei der Fehlersuche mehr Meldungen sehen möchte, erhöht man mit attr X verbose das Level für das betroffene Gerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zweistufiges Modell für Module ==&lt;br /&gt;
siehe auch&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,18920.msg128100.html#msg128100|The FHEM two-level model]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,13438.msg83643.html#msg83643|Zum Initialize bei physikalischen und logischen Geräten]&lt;br /&gt;
&lt;br /&gt;
Das zweistufige Modell besteht aus &lt;br /&gt;
* physisches Modul - z.B. für CUL (00_CUL.pm), der mehrer Protokolle empfängt, u.a. FS20&lt;br /&gt;
* logische Modul(e) - z.B. das Protokoll FS20 (10_FS20.pm)&lt;br /&gt;
&lt;br /&gt;
Das physische Modul öffnet die Datenverbindung zum Gerät. &lt;br /&gt;
&lt;br /&gt;
=== Kommunikation vom Gerät zu den logischen Modulen ===&lt;br /&gt;
Die [[#X_Read|X_Read]]-Funktion wird aus der Hauptschleife von Fhem aufgerufen sobald das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können.&lt;br /&gt;
&lt;br /&gt;
Unter Windows funktioniert &amp;quot;select&amp;quot; nur für Geräte, die via TCP verbunden sind. Für alle anderen Geräte ist eine [[#X_Ready|X_Ready]]-Funktion von Nöten, die 10x pro Sekunde das Gerät abfrägt und &amp;quot;true&amp;quot; zurück gibt, sollten Daten bereit stehen.&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion stellt sicher, dass die Daten&lt;br /&gt;
* komplett und&lt;br /&gt;
* korrekt&lt;br /&gt;
sind und sie ruft die globale Funktion Dispatch() mit einer Nachricht auf.&lt;br /&gt;
&lt;br /&gt;
Dispatch() sucht nach einem passenden lokalen Modul via &lt;br /&gt;
* $hash-&amp;gt;{Clients} oder $hash-&amp;gt;{MatchList} im physischen Modul&lt;br /&gt;
* $hash-&amp;gt;{Match} in allen passenden logischen Modulen&lt;br /&gt;
und ruft X_Parse in den gefundenen Modulen auf.&lt;br /&gt;
&lt;br /&gt;
X_Parse &lt;br /&gt;
* untersucht die übergebenen Daten (von Dispatch() übergeben)&lt;br /&gt;
* setzt alle [[#Readings|readings]] via readings*update Funktionen&lt;br /&gt;
* gibt den Namen des logischen Device zurück&lt;br /&gt;
&lt;br /&gt;
Es findet kein Event-Triggering statt, wenn die readings*update Funktionen &lt;br /&gt;
* von X_Parse aufgerufen werden und&lt;br /&gt;
* X_Parse wiederum von Dispatch() aufgerufen wurde.&lt;br /&gt;
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )&lt;br /&gt;
&lt;br /&gt;
Dispatch() triggert das Event-Handling für das  von X_Parse zurückgegebene logische Device.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von den logischen Modulen zum Gerät ===&lt;br /&gt;
&lt;br /&gt;
Um von einem logischen Modul an ein physisches Gerät zu senden, wird im logischen Modul das Attribut IODev mit dem namen des physischen Devices gesetzt.&lt;br /&gt;
Der Befehl&lt;br /&gt;
&amp;lt;code&amp;gt;AssignIoPort($hash);&amp;lt;/code&amp;gt;&lt;br /&gt;
in der X_Define-Funktion des logischen Devices erledigt das.&lt;br /&gt;
&lt;br /&gt;
Als Befehl zum Schreiben vom logischen ins physische Gerät soll &amp;lt;code&amp;gt;IOWrite()&amp;lt;/code&amp;gt; verwendet werden. IOWrite() ruft im physischen Gerät die X_Write-Funktion auf.&lt;br /&gt;
&lt;br /&gt;
Wenn es keine direkte Kommunikation zwischen dem logischen und dem physischen Gerät gibt(keine direkten Aufrufe von Funktionen, kein direktes überprüfen von $hash Werten,...) so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie in RFR) oder mittels  FHEM2FHEM:RAW zwei Fhem Installationen verbunden werden und die logischen Devices werden dennoch funktionieren.&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Die Wahl der vorangestellten Nummer für den Dateinamen eines neuen Moduls hat keine Bedeutung mehr, es sei denn die Nummer ist 99. Module, die mit 99_ beginnen, werden von FHEM automatisch geladen. Module mit einer anderen Nummer nur wenn ein &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl dafür sorgt, dass das Modul geladen wird.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Modul Initialisierungsdaten benötigt, sollten diese im Modul selbst enthalten sein. Eine zusätzliche Datei oder sogar ein Unterverzeichnis mit mehreren Dateien ist bei FHEM nicht üblich und sollte bei Modulen, die mit FHEM ausgeliefert werden nur in Rücksprache mit Rudolf König angelegt werden, da sie sonst bei einem Update nicht verteilt werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
Wenn man weitere Details wissen möchte, ist ein erster sinnvoller Schritt ein Blick in die Datei fhem.pl. Dort sieht man im Perl-Code wie die Module aufgerufen werden, was vorher passiert und was danach. Am Anfang der Datei (ca. ab Zeile 130) findet man beispielsweise eine Liste der globalen Variablen, die den Modulen zur Verfügung stehen sowie Details zu den wichtigen Hashes %modules und %defs. Wer mit Perl noch nicht so gut klar kommt, dem hilft eventuell ein Blick auf die Perldoc Website[http://perldoc.perl.org/] oder in das Perl-Buch seiner Wahl. Auch die FHEM Commandref [http://fhem.de/commandref.html] sollte nicht unterschätzt werden. Es stehen oft mehr interessante Details auch für Modulentwickler darin als man zunächst vermuten könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hello World&amp;quot; Beispiel ==&lt;br /&gt;
&lt;br /&gt;
98_Hello.pm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package main;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my %Hello_gets = (&lt;br /&gt;
	&amp;quot;whatyouwant&amp;quot;	=&amp;gt; &amp;quot;can&#039;t&amp;quot;,&lt;br /&gt;
	&amp;quot;whatyouneed&amp;quot;	=&amp;gt; &amp;quot;try sometimes&amp;quot;,&lt;br /&gt;
	&amp;quot;satisfaction&amp;quot;  =&amp;gt; &amp;quot;no&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
sub Hello_Initialize($) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{DefFn}      = &#039;Hello_Define&#039;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn}    = &#039;Hello_Undef&#039;;&lt;br /&gt;
    $hash-&amp;gt;{SetFn}      = &#039;Hello_Set&#039;;&lt;br /&gt;
    $hash-&amp;gt;{GetFn}      = &#039;Hello_Get&#039;;&lt;br /&gt;
    $hash-&amp;gt;{AttrFn}     = &#039;Hello_Attr&#039;;&lt;br /&gt;
    $hash-&amp;gt;{ReadFn}     = &#039;Hello_Read&#039;;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
          &amp;quot;formal:yes,no &amp;quot;&lt;br /&gt;
        . $readingFnAttributes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Define($$) {&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    my @param = split(&#039;[ \t]+&#039;, $def);&lt;br /&gt;
    &lt;br /&gt;
    if(int(@param) &amp;lt; 3) {&lt;br /&gt;
        return &amp;quot;too few parameters: define &amp;lt;name&amp;gt; Hello &amp;lt;greet&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    my $hash-&amp;gt;{name}  = $param[0];&lt;br /&gt;
    my $hash-&amp;gt;{greet} = $param[2];&lt;br /&gt;
    &lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Undef($$) {&lt;br /&gt;
    my ($hash, $arg) = @_; &lt;br /&gt;
    # nothing to do&lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Get($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;get Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	if(!$Hello_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if($attr{$name}{formal} eq &#039;yes&#039;) {&lt;br /&gt;
	    return $Hello_gets{$opt}.&#039;, sir&#039;;&lt;br /&gt;
    }&lt;br /&gt;
	return $Hello_gets{$opt};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Set($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;set Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @param);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($Hello_gets{$opt})) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
    $hash-&amp;gt;{STATE} = $Hello_gets{$opt} = $value;&lt;br /&gt;
    &lt;br /&gt;
	return &amp;quot;$opt set to $value. Try to get it.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub Hello_Attr(@) {&lt;br /&gt;
	my ($cmd,$name,$attr_name,$attr_value) = @_;&lt;br /&gt;
	if($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
        if($attr_name eq &amp;quot;formal&amp;quot;) {&lt;br /&gt;
			if($attr_value !~ /^yes|no$/) {&lt;br /&gt;
			    my $err = &amp;quot;Invalid argument $attr_value to $attr_name. Must be yes or no.&amp;quot;;&lt;br /&gt;
			    Log 3, &amp;quot;Hello: &amp;quot;.$err;&lt;br /&gt;
			    return $err;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
		    return &amp;quot;Unknown attr $attr_name&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=begin html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a name=&amp;quot;Hello&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Hello&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;i&amp;gt;Hello&amp;lt;/i&amp;gt; implements the classical &amp;quot;Hello World&amp;quot; as a starting point for module development. &lt;br /&gt;
    You may want to copy 98_Hello.pm to start implementing a module of your very own. See &lt;br /&gt;
    &amp;lt;a href=&amp;quot;http://www.fhemwiki.de/wiki/DevelopmentModuleIntro&amp;quot;&amp;gt;DevelopmentModuleIntro&amp;lt;/a&amp;gt; for an &lt;br /&gt;
    in-depth instruction to your first module.&lt;br /&gt;
    &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Hellodefine&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Define&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; Hello &amp;amp;lt;greet&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Example: &amp;lt;code&amp;gt;define HELLO Hello TurnUrRadioOn&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        The &amp;quot;greet&amp;quot; parameter has no further meaning, it just demonstrates&lt;br /&gt;
        how to set a so called &amp;quot;Internal&amp;quot; value. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#define&amp;quot;&amp;gt;commandref#define&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the define command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloset&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Set&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;set &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;set&amp;lt;/i&amp;gt; any value to any of the following options. They&#039;re just there to &lt;br /&gt;
        &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; them. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#set&amp;quot;&amp;gt;commandref#set&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the set command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Options:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;satisfaction&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;no&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouwant&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;can&#039;t&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouneed&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;try sometimes&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloget&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Get&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;get &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; the value of any of the options described in &lt;br /&gt;
        &amp;lt;a href=&amp;quot;#Helloset&amp;quot;&amp;gt;paragraph &amp;quot;Set&amp;quot; above&amp;lt;/a&amp;gt;. See &lt;br /&gt;
        &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#get&amp;quot;&amp;gt;commandref#get&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the get command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloattr&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Attributes&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;attr &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;attribute&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#attr&amp;quot;&amp;gt;commandref#attr&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the attr command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Attributes:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;formal&amp;lt;/i&amp;gt; no|yes&amp;lt;br&amp;gt;&lt;br /&gt;
                When you set formal to &amp;quot;yes&amp;quot;, all output of &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; will be in a&lt;br /&gt;
                more formal language. Default is &amp;quot;no&amp;quot;.&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Noch zu beschreiben ==&lt;br /&gt;
* Zweistufiges Modell für Module&lt;br /&gt;
* Funktion X_Ready ...&lt;br /&gt;
* Funktion X_State_Fn: {{Link2Forum|Topic=32680}}, siehe auch [[DevelopmentState]]&lt;br /&gt;
* FW_summaryFn (wird von FHEMWEB aufgerufen fuer Raum-Uebersicht)&lt;br /&gt;
* FW_detailFn (wird von FHEMWEB aufgerufen fuer Detail-Ansicht)&lt;br /&gt;
* DevIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=11564</id>
		<title>Yowsup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=11564"/>
		<updated>2015-06-30T14:01:02Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Änderungen von http://forum.fhem.de/index.php/topic,27543.msg307101/topicseen.html#msg307101&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:yowsup}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Schnittstelle, um WhatsApp-Nachrichten empfangen und senden zu können.&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=yowsup&lt;br /&gt;
|ModFTopic=27543&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=32_yowsup.pm&lt;br /&gt;
|ModOwner=André / justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[yowsup]] dient dazu, WhatsApp-Nachrichten zu empfangen und zu senden.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
* Die Funktionalität ist vermutlich auf Linux/Unix Systeme beschränkt.&lt;br /&gt;
* Nach der Erstinstallation/-einrichtung &#039;&#039;&#039;muss&#039;&#039;&#039; zwingend das &#039;&#039;cmd&#039;&#039; Attribut korrekt gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
Die ursprüngliche Einrichtung wurde hier {{Link2Forum|Topic=27543|Message=204426|LinkText=hier beschrieben}}, jedoch sind noch einige wichtige Dinge zu setzen.&lt;br /&gt;
&lt;br /&gt;
=== Yowsup Installation ===&lt;br /&gt;
Bevor man loslegt sollte man wie immer sicherstellen, dass Debian auf dem aktuellen Stand ist:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get dist-upgrade&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los gehts mit den Paketen:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install python-soappy python-dateutil python-pip python-dev build-essential&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun erstmal pip updaten:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo pip install --upgrade pip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann axolotl installieren (das dauert ne Weile):&lt;br /&gt;
&amp;lt;code&amp;gt;sudo pip install python-axolotl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man Bilder verarbeiten, so braucht man noch ein paar Pakete mehr:&lt;br /&gt;
* Paketinstallationen:&lt;br /&gt;
** Unter Debian Wheezy: &amp;lt;code&amp;gt;sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk&amp;lt;/code&amp;gt;&lt;br /&gt;
** Unter Debian Jessie: &amp;lt;code&amp;gt;sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk&amp;lt;/code&amp;gt;&lt;br /&gt;
* PIP:&amp;lt;code&amp;gt;sudo pip install pillow&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun loggt man sich unter dem User ein, unter dem fhem läuft (in den folgenden Beispielen als &amp;quot;fhem&amp;quot; benannt, sein home ist /home/fhem und seine gruppe nenne ich &amp;quot;dialout&amp;quot;) und lässt dort die $HOME-Variable heraus:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su - fhem&lt;br /&gt;
echo $HOME&lt;br /&gt;
cd $HOME&lt;br /&gt;
logout&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diesen Wert braucht man später - gut merken. Sollte hier ein Fehler auftreten (z.B. das home nicht vorhanden), so muss dies zuerst korrigiert werden.&lt;br /&gt;
&lt;br /&gt;
Desweiteren muss man nun yowsup installieren, was wie folgt vonstatten geht:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /opt&lt;br /&gt;
mkdir yowsup-config&lt;br /&gt;
sudo wget https://github.com/tgalal/yowsup/archive/master.zip&lt;br /&gt;
sudo unzip master.zip&lt;br /&gt;
rm master.zip&lt;br /&gt;
cd yowsup-config&lt;br /&gt;
sudo nano yowsup.config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie bemerkt, ist man nun im Editor für die yowsup.config gelandet. Diese wird nun wie folgt gefüllt:&lt;br /&gt;
&amp;lt;pre&amp;gt;## Actual config starts below ##&lt;br /&gt;
&lt;br /&gt;
#cc ist wichtig ansonsten funktioniert es nicht aus dem Script&lt;br /&gt;
cc=49&lt;br /&gt;
phone=498912345678&lt;br /&gt;
id=0000000000&lt;br /&gt;
password=&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ersetze die Nummer 498912345678 gegen eine Festnetz oder Handynummer welche derzeit nicht mit WhatsApp verwendet wird. Mittels STRG+o wird die Datei nun gespeichert und mittels STRG+x verlässt man den Editor.&lt;br /&gt;
&lt;br /&gt;
Vor den weiteren Schritten sollte man nun erstmal die yowsup Verzeichnisse dem fhem-user zugängig machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown -R fhem:dialout /opt/yowsup-master /opt/yowsup-config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Schritte würde ich auf den FHEM-Nutzer wechseln:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su - fhem&lt;br /&gt;
cd /opt/yowsup-master&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun erfolgt die anmeldung am WhatsApp-Server. Dies kann man nun via &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sms&amp;lt;/code&amp;gt; machen. Bei einem Handy bietet sich SMS an, ansonsten bei Festnetznummern unbedingt etwas zum schreiben bereit halten&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -r sms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Rückmeldung ist nun entscheidend. Wenn man diese zurückbekommt:&lt;br /&gt;
&amp;lt;pre&amp;gt;de sms&lt;br /&gt;
status: fail&lt;br /&gt;
retry_after: 3600&lt;br /&gt;
reason: no_routes&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dann ist die Nummer so nicht kompatibel. Was man dann noch probieren kann, ist die registration via voice - meistens ist das aber vergebene Liebesmüh&#039;.&lt;br /&gt;
&lt;br /&gt;
Wenn man folgende Rückmeldung bekommt:&lt;br /&gt;
&amp;lt;pre&amp;gt;Detected cc: 49&lt;br /&gt;
status: sent&lt;br /&gt;
retry_after: 1805&lt;br /&gt;
length: 6&lt;br /&gt;
method: sms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So ist alles gut gelaufen und man sollte kurz später eine SMS bekommen. Darin ist ein Text, der am Ende z.B. 123-456 lautet. Diesen fügt man ohne Bindestrich am Ende des folgenden Befehls ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -R 123456&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann kommt ein Text der etwa so aussehen sollte:&lt;br /&gt;
&amp;lt;pre&amp;gt;status: ok&lt;br /&gt;
kind: free&lt;br /&gt;
pw: bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx&lt;br /&gt;
price: 0,89 €&lt;br /&gt;
price_expiration: 1432127524&lt;br /&gt;
currency: EUR&lt;br /&gt;
cost: 0.89&lt;br /&gt;
login: 498912345678&lt;br /&gt;
type: existing&lt;br /&gt;
expiration: 1460832553&amp;lt;/pre&amp;gt;&lt;br /&gt;
Den Text hinter dem Zeilenanfang &amp;lt;code&amp;gt;pw: &amp;lt;/code&amp;gt; benötigt man nun für die Konfigurationsdatei, wo dieser eingefügt werden muss:&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /opt/yowsup-config/yowsup.config&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sodass die Datei beispielhaft dann so aussieht:&lt;br /&gt;
&amp;lt;pre&amp;gt;## Actual config starts below ##&lt;br /&gt;
&lt;br /&gt;
#cc ist wichtig ansonsten funktioniert es nicht aus dem Script&lt;br /&gt;
cc=49&lt;br /&gt;
phone=498912345678&lt;br /&gt;
id=0000000000&lt;br /&gt;
password=bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man schon gesehen hat, ist der Account nur begrenzt gültig - die Gültigkeit kann man anhand der als &amp;lt;code&amp;gt;expiration: &amp;lt;/code&amp;gt; bezeichneten Zeile ablesen, welche einen Unix-Timestamp beinhaltet. Diese kann man hier umrechnen lassen.&lt;br /&gt;
&lt;br /&gt;
Nun mal ein schneller test an die eigene Nummer (im Beispiel 491751234567):&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli demos -c /opt/yowsup-config/yowsup.config -s 491751234567 &amp;quot;Das ist ein Test&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sollte dir eine Nachricht einbringen. Wenn du darauf antwortest, kommt diese allerdings noch nicht an - der Client hat sich nach dem Befehl sofort beendet. Damit dieser dauerhaft im Hintergrund läuft legen wir nun in FHEM ein Gerät an, welches dies steuert.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Define ===&lt;br /&gt;
* Fhem Device anlegen: &amp;lt;code&amp;gt; define &amp;lt;name&amp;gt; yowsup&amp;lt;/code&amp;gt;, also z.B. &amp;lt;code&amp;gt;define WhatsApp yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun muss man den Pfad zu yowsup anpassen: &amp;lt;code&amp;gt;attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* Und das Home directory mit dem Pfad zum Home des fhem users: &amp;lt;code&amp;gt;attr WhatsApp home PWD&amp;lt;/code&amp;gt;&lt;br /&gt;
* Wenn alles gut geht, gibt es danach im Device ein internal PID und das Reading &#039;&#039;state&#039;&#039;&lt;br /&gt;
* Im Whatsapp Client auf dem Handy sollte man sehen, dass Fhem online ist&lt;br /&gt;
* Zum Senden aus Fhem kann man das Kommando &amp;lt;code&amp;gt;set WhatsApp send &amp;lt;nummer&amp;gt; &amp;lt;text&amp;gt;&amp;lt;/code&amp;gt; verwenden&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Bitte sehe immer in der [[http://fhem.de/commandref.html#yowsup Commandref]] nach - diese hier könnten veraltet sein.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;komplettes Kommando, um den yowsup Client zu starten. z.B.: &amp;lt;code&amp;gt;attr WhatsApp cmd /opt/local/bin/yowsup-cli demos -c /root/config.yowsup --yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;accept_from&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;kommagetrennte Liste von Kontakten (Nummern), von denen Nachrichten akzeptiert werden. Ist das Attribut nicht gesetzt, so werden die Nachrichten von jedem akzeptiert.&lt;br /&gt;
* &amp;lt;code&amp;gt;commandPrefix&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;nicht gesetzt -&amp;gt; es werden keine Befehle akzeptiert.&amp;lt;br /&amp;gt;0 -&amp;gt; es werden keine Befehle akzeptiert.&amp;lt;br /&amp;gt;1 -&amp;gt; erlaubt Befehle, jede Nachricht wird als Fhem-Befehl interpretiert.&amp;lt;br /&amp;gt;alles andere -&amp;gt; Wenn die Nachricht mit diesem Prefix startet, wird alles weitere als Befehle interpretiert.&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;allowedCommands&#039;&#039;&#039; should work as intended, but no guarantee can be given, that there is no way to circumvent it.}}&lt;br /&gt;
* &amp;lt;code&amp;gt;allowedCommands&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Eine Komma-getrennte Liste von zulässigen Befehlen für diesen Kontakt. Wenn die Liste leer ist (z.B. nur ein Komma), dann werden keine Befehle akzeptiert.&lt;br /&gt;
* &amp;lt;code&amp;gt;home&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Setzt das Home-directory welches für yowsup verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
== Befehle ==&lt;br /&gt;
* image -&amp;gt; Über diesen Befehl können Bilder gesendet werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
=== Beispielnachricht ===&lt;br /&gt;
Beim Empfang einer Nachricht wird automatisch ein Fhem Device für diesen Kontakt angelegt. In diesem Device gibt es das Reading &#039;&#039;&#039;message&#039;&#039;&#039; für die empfangene Nachricht und ab der ersten Nachricht auch das Reading &#039;&#039;&#039;chatstate&#039;&#039;&#039;, in dem zu sehen ist, ob gerade getippt wird.&lt;br /&gt;
Nachdem ein Device für einen Kontakt angelegt ist, lässt sich auch direkt dieses Device zum Senden verwenden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; send &amp;lt;text&amp;gt;&amp;lt;/code&amp;gt;, &lt;br /&gt;
d.h., man spart sich die Angabe der Nummer.&lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
Gruppennachrichten werden von yowsup mit Sonderzeichen im Absender empfangen:&lt;br /&gt;
: 49yyyyyyyyyyyy/49xxxxxxxxxxx-1234567890&lt;br /&gt;
: absender/gründer-timestamp&lt;br /&gt;
Aufgrund der Sonderzeichen schlägt das automatische Anlegen einer yowsup Instanz fehl. Es kann aber zum Versenden direkt die JID der Gruppe genutzt werden, oder manuell die yowsup Instanz ohne Sonderzeichen gemacht werden. &lt;br /&gt;
: erst kommt die Nummer des Gruppenerstellers, dann die Uhrzeit im Unix Zeitformat.&lt;br /&gt;
: 49xxxxxxxxxxx-1234567890&lt;br /&gt;
: gründer-timestamp&lt;br /&gt;
:&amp;lt;code&amp;gt;define whatsapp.gruppe yowsup 49xxxxxxxxxxx-1234567890&amp;lt;/code&amp;gt;&lt;br /&gt;
==== JID der Gruppe ermitteln ====&lt;br /&gt;
Am einfachsten ist es, eine Nachricht an die Gruppe zu senden und aus der Fehlermeldung von Fhem die JID herauszusuchen.&lt;br /&gt;
Etwas gezielter geht es mit der Auflistungsfunktion von yowsup direkt.&lt;br /&gt;
:&amp;lt;code&amp;gt;set WhatsApp raw /groups list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Ergebnisse eines raw Befehls im Log zu sehen, muss noch [[verbose]] 4 gesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WhatsApp verbose 4&amp;lt;/code&amp;gt;&lt;br /&gt;
Dieses Attribut sollte, wenn nicht mehr benötigt, wieder gelöscht werden, um unnötige Logeinträge zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=27543|LinkText=Forenthread}}, in dem die Whatsapp Anwendung beschrieben wird&lt;br /&gt;
* {{Link2Forum|Topic=27543|Message=299292|LinkText=Foreneintrag}}, ab dem das yowsup Modul beschrieben wird&lt;br /&gt;
* Die Python Whatsapp Library auf [https://github.com/tgalal/yowsup github]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=11520</id>
		<title>Yowsup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=11520"/>
		<updated>2015-06-21T13:28:21Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Link to commandref&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:yowsup}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Schnittstelle, um WhatsApp-Nachrichten empfangen und senden zu können.&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=yowsup&lt;br /&gt;
|ModFTopic=27543&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=32_yowsup.pm&lt;br /&gt;
|ModOwner=André / justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[yowsup]] dient dazu, WhatsApp-Nachrichten zu empfangen und zu senden.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
* Die Funktionalität ist vermutlich auf Linux/Unix Systeme beschränkt.&lt;br /&gt;
* Nach der Erstinstallation/-einrichtung &#039;&#039;&#039;muss&#039;&#039;&#039; zwingend das &#039;&#039;cmd&#039;&#039; Attribut korrekt gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
Die ursprüngliche Einrichtung wurde hier {{Link2Forum|Topic=27543|Message=204426|LinkText=hier beschrieben}}, jedoch sind noch einige wichtige Dinge zu setzen.&lt;br /&gt;
&lt;br /&gt;
=== Yowsup Installation ===&lt;br /&gt;
Los gehts mit den Paketen:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install python-soappy python-dateutil python-pip python-dev build-essential&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun erstmal pip updaten:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo pip install --upgrade pip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann axolotl installieren (das dauert ne Weile):&lt;br /&gt;
&amp;lt;code&amp;gt;sudo pip install python-axolotl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man Bilder verarbeiten, so braucht man noch ein paar Pakete mehr:&lt;br /&gt;
* Paketinstallationen:&lt;br /&gt;
** Unter Debian Wheezy: &amp;lt;code&amp;gt;sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tkv&amp;lt;/code&amp;gt;&lt;br /&gt;
** Unter Debian Jessie: &amp;lt;code&amp;gt;sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk&amp;lt;/code&amp;gt;&lt;br /&gt;
* PIP:&amp;lt;code&amp;gt;sudo pip install -l pillow&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun loggt man sich unter dem User ein, unter dem fhem läuft (in den folgenden Beispielen als &amp;quot;fhem&amp;quot; benannt, sein home ist /home/fhem und seine gruppe nenne ich &amp;quot;dialout&amp;quot;) und lässt dort die $HOME-Variable heraus:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su - fhem&lt;br /&gt;
echo $HOME&lt;br /&gt;
cd $HOME&lt;br /&gt;
logout&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diesen Wert braucht man später - gut merken. Sollte hier ein Fehler auftreten (z.B. das home nicht vorhanden), so muss dies zuerst korrigiert werden.&lt;br /&gt;
&lt;br /&gt;
Desweiteren muss man nun yowsup installieren, was wie folgt vonstatten geht:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /opt&lt;br /&gt;
mkdir yowsup-config&lt;br /&gt;
sudo wget https://github.com/tgalal/yowsup/archive/master.zip&lt;br /&gt;
sudo unzip master.zip&lt;br /&gt;
rm master.zip&lt;br /&gt;
cd yowsup-config&lt;br /&gt;
sudo nano yowsup.config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie bemerkt, ist man nun im Editor für die yowsup.config gelandet. Diese wird nun wie folgt gefüllt:&lt;br /&gt;
&amp;lt;pre&amp;gt;## Actual config starts below ##&lt;br /&gt;
&lt;br /&gt;
#cc ist wichtig ansonsten funktioniert es nicht aus dem Script&lt;br /&gt;
cc=49&lt;br /&gt;
phone=498912345678&lt;br /&gt;
id=0000000000&lt;br /&gt;
password=&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ersetze die Nummer 498912345678 gegen eine Festnetz oder Handynummer welche derzeit nicht mit WhatsApp verwendet wird. Mittels STRG+o wird die Datei nun gespeichert und mittels STRG+x verlässt man den Editor.&lt;br /&gt;
&lt;br /&gt;
Vor den weiteren Schritten sollte man nun erstmal die yowsup Verzeichnisse dem fhem-user zugängig machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown -R fhem:dialout /opt/yowsup-master /opt/yowsup-config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Schritte würde ich auf den FHEM-Nutzer wechseln:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su - fhem&lt;br /&gt;
cd /opt/yowsup-master&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun erfolgt die anmeldung am WhatsApp-Server. Dies kann man nun via &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sms&amp;lt;/code&amp;gt; machen. Bei einem Handy bietet sich SMS an, ansonsten bei Festnetznummern unbedingt etwas zum schreiben bereit halten&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -r sms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Rückmeldung ist nun entscheidend. Wenn man diese zurückbekommt:&lt;br /&gt;
&amp;lt;pre&amp;gt;de sms&lt;br /&gt;
status: fail&lt;br /&gt;
retry_after: 3600&lt;br /&gt;
reason: no_routes&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dann ist die Nummer so nicht kompatibel. Was man dann noch probieren kann, ist die registration via voice - meistens ist das aber vergebene Liebesmüh&#039;.&lt;br /&gt;
&lt;br /&gt;
Wenn man folgende Rückmeldung bekommt:&lt;br /&gt;
&amp;lt;pre&amp;gt;Detected cc: 49&lt;br /&gt;
status: sent&lt;br /&gt;
retry_after: 1805&lt;br /&gt;
length: 6&lt;br /&gt;
method: sms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So ist alles gut gelaufen und man sollte kurz später eine SMS bekommen. Darin ist ein Text, der am Ende z.B. 123-456 lautet. Diesen fügt man ohne Bindestrich am Ende des folgenden Befehls ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -R 123456&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann kommt ein Text der etwa so aussehen sollte:&lt;br /&gt;
&amp;lt;pre&amp;gt;status: ok&lt;br /&gt;
kind: free&lt;br /&gt;
pw: bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx&lt;br /&gt;
price: 0,89 €&lt;br /&gt;
price_expiration: 1432127524&lt;br /&gt;
currency: EUR&lt;br /&gt;
cost: 0.89&lt;br /&gt;
login: 498912345678&lt;br /&gt;
type: existing&lt;br /&gt;
expiration: 1460832553&amp;lt;/pre&amp;gt;&lt;br /&gt;
Den Text hinter dem Zeilenanfang &amp;lt;code&amp;gt;pw: &amp;lt;/code&amp;gt; benötigt man nun für die Konfigurationsdatei, wo dieser eingefügt werden muss:&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /opt/yowsup-config/yowsup.config&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sodass die Datei beispielhaft dann so aussieht:&lt;br /&gt;
&amp;lt;pre&amp;gt;## Actual config starts below ##&lt;br /&gt;
&lt;br /&gt;
#cc ist wichtig ansonsten funktioniert es nicht aus dem Script&lt;br /&gt;
cc=49&lt;br /&gt;
phone=498912345678&lt;br /&gt;
id=0000000000&lt;br /&gt;
password=bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man schon gesehen hat, ist der Account nur begrenzt gültig - die Gültigkeit kann man anhand der als &amp;lt;code&amp;gt;expiration: &amp;lt;/code&amp;gt; bezeichneten Zeile ablesen, welche einen Unix-Timestamp beinhaltet. Diese kann man hier umrechnen lassen.&lt;br /&gt;
&lt;br /&gt;
Nun mal ein schneller test an die eigene Nummer (im Beispiel 491751234567):&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli demos -c /opt/yowsup-config/yowsup.config -s 491751234567 &amp;quot;Das ist ein Test&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sollte dir eine Nachricht einbringen. Wenn du darauf antwortest, kommt diese allerdings noch nicht an - der Client hat sich nach dem Befehl sofort beendet. Damit dieser dauerhaft im Hintergrund läuft legen wir nun in FHEM ein Gerät an, welches dies steuert.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Define ===&lt;br /&gt;
* Fhem Device anlegen: &amp;lt;code&amp;gt; define &amp;lt;name&amp;gt; yowsup&amp;lt;/code&amp;gt;, also z.B. &amp;lt;code&amp;gt;define WhatsApp yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun muss man den Pfad zu yowsup anpassen: &amp;lt;code&amp;gt;attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* Und das Home directory mit dem Pfad zum Home des fhem users: &amp;lt;code&amp;gt;attr WhatsApp home /home/fhem&amp;lt;/code&amp;gt;&lt;br /&gt;
* Wenn alles gut geht, gibt es danach im Device ein internal PID und das Reading &#039;&#039;state&#039;&#039;&lt;br /&gt;
* Im Whatsapp Client auf dem Handy sollte man sehen, dass Fhem online ist&lt;br /&gt;
* Zum Senden aus Fhem kann man das Kommando &amp;lt;code&amp;gt;set WhatsApp send &amp;lt;nummer&amp;gt; &amp;lt;text&amp;gt;&amp;lt;/code&amp;gt; verwenden&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Bitte sehe immer in der [[http://fhem.de/commandref.html#yowsup Commandref]] nach - diese hier könnten veraltet sein.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;komplettes Kommando, um den yowsup Client zu starten. z.B.: &amp;lt;code&amp;gt;attr WhatsApp cmd /opt/local/bin/yowsup-cli demos -c /root/config.yowsup --yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;accept_from&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;kommagetrennte Liste von Kontakten (Nummern), von denen Nachrichten akzeptiert werden. Ist das Attribut nicht gesetzt, so werden die Nachrichten von jedem akzeptiert.&lt;br /&gt;
* &amp;lt;code&amp;gt;commandPrefix&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;nicht gesetzt -&amp;gt; es werden keine Befehle akzeptiert.&amp;lt;br /&amp;gt;0 -&amp;gt; es werden keine Befehle akzeptiert.&amp;lt;br /&amp;gt;1 -&amp;gt; erlaubt Befehle, jede Nachricht wird als Fhem-Befehl interpretiert.&amp;lt;br /&amp;gt;alles andere -&amp;gt; Wenn die Nachricht mit diesem Prefix startet, wird alles weitere als Befehle interpretiert.&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;allowedCommands&#039;&#039;&#039; should work as intended, but no guarantee can be given, that there is no way to circumvent it.}}&lt;br /&gt;
* &amp;lt;code&amp;gt;allowedCommands&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Eine Komma-getrennte Liste von zulässigen Befehlen für diesen Kontakt. Wenn die Liste leer ist (z.B. nur ein Komma), dann werden keine Befehle akzeptiert.&lt;br /&gt;
* &amp;lt;code&amp;gt;home&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Setzt das Home-directory welches für yowsup verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
== Befehle ==&lt;br /&gt;
* image -&amp;gt; Über diesen Befehl können Bilder gesendet werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
=== Beispielnachricht ===&lt;br /&gt;
Beim Empfang einer Nachricht wird automatisch ein Fhem Device für diesen Kontakt angelegt. In diesem Device gibt es das Reading &#039;&#039;&#039;message&#039;&#039;&#039; für die empfangene Nachricht und ab der ersten Nachricht auch das Reading &#039;&#039;&#039;chatstate&#039;&#039;&#039;, in dem zu sehen ist, ob gerade getippt wird.&lt;br /&gt;
Nachdem ein Device für einen Kontakt angelegt ist, lässt sich auch direkt dieses Device zum Senden verwenden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; send &amp;lt;text&amp;gt;&amp;lt;/code&amp;gt;, &lt;br /&gt;
d.h., man spart sich die Angabe der Nummer.&lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
Gruppennachrichten werden von yowsup mit Sonderzeichen im Absender empfangen:&lt;br /&gt;
: 49yyyyyyyyyyyy/49xxxxxxxxxxx-1234567890&lt;br /&gt;
: absender/gründer-timestamp&lt;br /&gt;
Aufgrund der Sonderzeichen schlägt das automatische Anlegen einer yowsup Instanz fehl. Es kann aber zum Versenden direkt die JID der Gruppe genutzt werden, oder manuell die yowsup Instanz ohne Sonderzeichen gemacht werden. &lt;br /&gt;
: erst kommt die Nummer des Gruppenerstellers, dann die Uhrzeit im Unix Zeitformat.&lt;br /&gt;
: 49xxxxxxxxxxx-1234567890&lt;br /&gt;
: gründer-timestamp&lt;br /&gt;
:&amp;lt;code&amp;gt;define whatsapp.gruppe yowsup 49xxxxxxxxxxx-1234567890&amp;lt;/code&amp;gt;&lt;br /&gt;
==== JID der Gruppe ermitteln ====&lt;br /&gt;
Am einfachsten ist es, eine Nachricht an die Gruppe zu senden und aus der Fehlermeldung von Fhem die JID herauszusuchen.&lt;br /&gt;
Etwas gezielter geht es mit der Auflistungsfunktion von yowsup direkt.&lt;br /&gt;
:&amp;lt;code&amp;gt;set WhatsApp raw /groups list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Ergebnisse eines raw Befehls im Log zu sehen, muss noch [[verbose]] 4 gesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WhatsApp verbose 4&amp;lt;/code&amp;gt;&lt;br /&gt;
Dieses Attribut sollte, wenn nicht mehr benötigt, wieder gelöscht werden, um unnötige Logeinträge zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=27543|LinkText=Forenthread}}, in dem die Whatsapp Anwendung beschrieben wird&lt;br /&gt;
* {{Link2Forum|Topic=27543|Message=299292|LinkText=Foreneintrag}}, ab dem das yowsup Modul beschrieben wird&lt;br /&gt;
* Die Python Whatsapp Library auf [https://github.com/tgalal/yowsup github]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=11519</id>
		<title>Yowsup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Yowsup&amp;diff=11519"/>
		<updated>2015-06-21T13:25:54Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Update der Installation - die Kleinigkeiten waren alle im Thread zu finden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:yowsup}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Schnittstelle, um WhatsApp-Nachrichten empfangen und senden zu können.&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=yowsup&lt;br /&gt;
|ModFTopic=27543&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=32_yowsup.pm&lt;br /&gt;
|ModOwner=André / justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:justme|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[yowsup]] dient dazu, WhatsApp-Nachrichten zu empfangen und zu senden.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
* Die Funktionalität ist vermutlich auf Linux/Unix Systeme beschränkt.&lt;br /&gt;
* Nach der Erstinstallation/-einrichtung &#039;&#039;&#039;muss&#039;&#039;&#039; zwingend das &#039;&#039;cmd&#039;&#039; Attribut korrekt gesetzt werden. &lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
Die ursprüngliche Einrichtung wurde hier {{Link2Forum|Topic=27543|Message=204426|LinkText=hier beschrieben}}, jedoch sind noch einige wichtige Dinge zu setzen.&lt;br /&gt;
&lt;br /&gt;
=== Yowsup Installation ===&lt;br /&gt;
Los gehts mit den Paketen:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install python-soappy python-dateutil python-pip python-dev build-essential&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun erstmal pip updaten:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo pip install --upgrade pip&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann axolotl installieren (das dauert ne Weile):&lt;br /&gt;
&amp;lt;code&amp;gt;sudo pip install python-axolotl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man Bilder verarbeiten, so braucht man noch ein paar Pakete mehr:&lt;br /&gt;
* Paketinstallationen:&lt;br /&gt;
** Unter Debian Wheezy: &amp;lt;code&amp;gt;sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tkv&amp;lt;/code&amp;gt;&lt;br /&gt;
** Unter Debian Jessie: &amp;lt;code&amp;gt;sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk&amp;lt;/code&amp;gt;&lt;br /&gt;
* PIP:&amp;lt;code&amp;gt;sudo pip install -l pillow&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun loggt man sich unter dem User ein, unter dem fhem läuft (in den folgenden Beispielen als &amp;quot;fhem&amp;quot; benannt, sein home ist /home/fhem und seine gruppe nenne ich &amp;quot;dialout&amp;quot;) und lässt dort die $HOME-Variable heraus:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su - fhem&lt;br /&gt;
echo $HOME&lt;br /&gt;
cd $HOME&lt;br /&gt;
logout&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diesen Wert braucht man später - gut merken. Sollte hier ein Fehler auftreten (z.B. das home nicht vorhanden), so muss dies zuerst korrigiert werden.&lt;br /&gt;
&lt;br /&gt;
Desweiteren muss man nun yowsup installieren, was wie folgt vonstatten geht:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd /opt&lt;br /&gt;
mkdir yowsup-config&lt;br /&gt;
sudo wget https://github.com/tgalal/yowsup/archive/master.zip&lt;br /&gt;
sudo unzip master.zip&lt;br /&gt;
rm master.zip&lt;br /&gt;
cd yowsup-config&lt;br /&gt;
sudo nano yowsup.config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie bemerkt, ist man nun im Editor für die yowsup.config gelandet. Diese wird nun wie folgt gefüllt:&lt;br /&gt;
&amp;lt;pre&amp;gt;## Actual config starts below ##&lt;br /&gt;
&lt;br /&gt;
#cc ist wichtig ansonsten funktioniert es nicht aus dem Script&lt;br /&gt;
cc=49&lt;br /&gt;
phone=498912345678&lt;br /&gt;
id=0000000000&lt;br /&gt;
password=&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ersetze die Nummer 498912345678 gegen eine Festnetz oder Handynummer welche derzeit nicht mit WhatsApp verwendet wird. Mittels STRG+o wird die Datei nun gespeichert und mittels STRG+x verlässt man den Editor.&lt;br /&gt;
&lt;br /&gt;
Vor den weiteren Schritten sollte man nun erstmal die yowsup Verzeichnisse dem fhem-user zugängig machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown -R fhem:dialout /opt/yowsup-master /opt/yowsup-config&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Schritte würde ich auf den FHEM-Nutzer wechseln:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su - fhem&lt;br /&gt;
cd /opt/yowsup-master&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun erfolgt die anmeldung am WhatsApp-Server. Dies kann man nun via &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sms&amp;lt;/code&amp;gt; machen. Bei einem Handy bietet sich SMS an, ansonsten bei Festnetznummern unbedingt etwas zum schreiben bereit halten&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -r sms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Rückmeldung ist nun entscheidend. Wenn man diese zurückbekommt:&lt;br /&gt;
&amp;lt;pre&amp;gt;de sms&lt;br /&gt;
status: fail&lt;br /&gt;
retry_after: 3600&lt;br /&gt;
reason: no_routes&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dann ist die Nummer so nicht kompatibel. Was man dann noch probieren kann, ist die registration via voice - meistens ist das aber vergebene Liebesmüh&#039;.&lt;br /&gt;
&lt;br /&gt;
Wenn man folgende Rückmeldung bekommt:&lt;br /&gt;
&amp;lt;pre&amp;gt;Detected cc: 49&lt;br /&gt;
status: sent&lt;br /&gt;
retry_after: 1805&lt;br /&gt;
length: 6&lt;br /&gt;
method: sms&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So ist alles gut gelaufen und man sollte kurz später eine SMS bekommen. Darin ist ein Text, der am Ende z.B. 123-456 lautet. Diesen fügt man ohne Bindestrich am Ende des folgenden Befehls ein:&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -R 123456&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann kommt ein Text der etwa so aussehen sollte:&lt;br /&gt;
&amp;lt;pre&amp;gt;status: ok&lt;br /&gt;
kind: free&lt;br /&gt;
pw: bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx&lt;br /&gt;
price: 0,89 €&lt;br /&gt;
price_expiration: 1432127524&lt;br /&gt;
currency: EUR&lt;br /&gt;
cost: 0.89&lt;br /&gt;
login: 498912345678&lt;br /&gt;
type: existing&lt;br /&gt;
expiration: 1460832553&amp;lt;/pre&amp;gt;&lt;br /&gt;
Den Text hinter dem Zeilenanfang &amp;lt;code&amp;gt;pw: &amp;lt;/code&amp;gt; benötigt man nun für die Konfigurationsdatei, wo dieser eingefügt werden muss:&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /opt/yowsup-config/yowsup.config&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sodass die Datei beispielhaft dann so aussieht:&lt;br /&gt;
&amp;lt;pre&amp;gt;## Actual config starts below ##&lt;br /&gt;
&lt;br /&gt;
#cc ist wichtig ansonsten funktioniert es nicht aus dem Script&lt;br /&gt;
cc=49&lt;br /&gt;
phone=498912345678&lt;br /&gt;
id=0000000000&lt;br /&gt;
password=bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man schon gesehen hat, ist der Account nur begrenzt gültig - die Gültigkeit kann man anhand der als &amp;lt;code&amp;gt;expiration: &amp;lt;/code&amp;gt; bezeichneten Zeile ablesen, welche einen Unix-Timestamp beinhaltet. Diese kann man hier umrechnen lassen.&lt;br /&gt;
&lt;br /&gt;
Nun mal ein schneller test an die eigene Nummer (im Beispiel 491751234567):&lt;br /&gt;
&amp;lt;pre&amp;gt;python yowsup-cli demos -c /opt/yowsup-config/yowsup.config -s 491751234567 &amp;quot;Das ist ein Test&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sollte dir eine Nachricht einbringen. Wenn du darauf antwortest, kommt diese allerdings noch nicht an - der Client hat sich nach dem Befehl sofort beendet. Damit dieser dauerhaft im Hintergrund läuft legen wir nun in FHEM ein Gerät an, welches dies steuert.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Define ===&lt;br /&gt;
* Fhem Device anlegen: &amp;lt;code&amp;gt; define &amp;lt;name&amp;gt; yowsup&amp;lt;/code&amp;gt;, also z.B. &amp;lt;code&amp;gt;define WhatsApp yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nun muss man den Pfad zu yowsup anpassen: &amp;lt;code&amp;gt;attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* Und das Home directory mit dem Pfad zum Home des fhem users: &amp;lt;code&amp;gt;attr WhatsApp home /home/fhem&amp;lt;/code&amp;gt;&lt;br /&gt;
* Wenn alles gut geht, gibt es danach im Device ein internal PID und das Reading &#039;&#039;state&#039;&#039;&lt;br /&gt;
* Im Whatsapp Client auf dem Handy sollte man sehen, dass Fhem online ist&lt;br /&gt;
* Zum Senden aus Fhem kann man das Kommando &amp;lt;code&amp;gt;set WhatsApp send &amp;lt;nummer&amp;gt; &amp;lt;text&amp;gt;&amp;lt;/code&amp;gt; verwenden&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Bitte sehe immer in der Commandref nach - diese hier könnten veraltet sein.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;komplettes Kommando, um den yowsup Client zu starten. z.B.: &amp;lt;code&amp;gt;attr WhatsApp cmd /opt/local/bin/yowsup-cli demos -c /root/config.yowsup --yowsup&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;accept_from&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;kommagetrennte Liste von Kontakten (Nummern), von denen Nachrichten akzeptiert werden. Ist das Attribut nicht gesetzt, so werden die Nachrichten von jedem akzeptiert.&lt;br /&gt;
* &amp;lt;code&amp;gt;commandPrefix&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;nicht gesetzt -&amp;gt; es werden keine Befehle akzeptiert.&amp;lt;br /&amp;gt;0 -&amp;gt; es werden keine Befehle akzeptiert.&amp;lt;br /&amp;gt;1 -&amp;gt; erlaubt Befehle, jede Nachricht wird als Fhem-Befehl interpretiert.&amp;lt;br /&amp;gt;alles andere -&amp;gt; Wenn die Nachricht mit diesem Prefix startet, wird alles weitere als Befehle interpretiert.&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;allowedCommands&#039;&#039;&#039; should work as intended, but no guarantee can be given, that there is no way to circumvent it.}}&lt;br /&gt;
* &amp;lt;code&amp;gt;allowedCommands&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Eine Komma-getrennte Liste von zulässigen Befehlen für diesen Kontakt. Wenn die Liste leer ist (z.B. nur ein Komma), dann werden keine Befehle akzeptiert.&lt;br /&gt;
* &amp;lt;code&amp;gt;home&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Setzt das Home-directory welches für yowsup verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Befehle ===&lt;br /&gt;
* image -&amp;gt; Über diesen Befehl können Bilder gesendet werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
=== Beispielnachricht ===&lt;br /&gt;
Beim Empfang einer Nachricht wird automatisch ein Fhem Device für diesen Kontakt angelegt. In diesem Device gibt es das Reading &#039;&#039;&#039;message&#039;&#039;&#039; für die empfangene Nachricht und ab der ersten Nachricht auch das Reading &#039;&#039;&#039;chatstate&#039;&#039;&#039;, in dem zu sehen ist, ob gerade getippt wird.&lt;br /&gt;
Nachdem ein Device für einen Kontakt angelegt ist, lässt sich auch direkt dieses Device zum Senden verwenden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; send &amp;lt;text&amp;gt;&amp;lt;/code&amp;gt;, &lt;br /&gt;
d.h., man spart sich die Angabe der Nummer.&lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
Gruppennachrichten werden von yowsup mit Sonderzeichen im Absender empfangen:&lt;br /&gt;
: 49yyyyyyyyyyyy/49xxxxxxxxxxx-1234567890&lt;br /&gt;
: absender/gründer-timestamp&lt;br /&gt;
Aufgrund der Sonderzeichen schlägt das automatische Anlegen einer yowsup Instanz fehl. Es kann aber zum Versenden direkt die JID der Gruppe genutzt werden, oder manuell die yowsup Instanz ohne Sonderzeichen gemacht werden. &lt;br /&gt;
: erst kommt die Nummer des Gruppenerstellers, dann die Uhrzeit im Unix Zeitformat.&lt;br /&gt;
: 49xxxxxxxxxxx-1234567890&lt;br /&gt;
: gründer-timestamp&lt;br /&gt;
:&amp;lt;code&amp;gt;define whatsapp.gruppe yowsup 49xxxxxxxxxxx-1234567890&amp;lt;/code&amp;gt;&lt;br /&gt;
==== JID der Gruppe ermitteln ====&lt;br /&gt;
Am einfachsten ist es, eine Nachricht an die Gruppe zu senden und aus der Fehlermeldung von Fhem die JID herauszusuchen.&lt;br /&gt;
Etwas gezielter geht es mit der Auflistungsfunktion von yowsup direkt.&lt;br /&gt;
:&amp;lt;code&amp;gt;set WhatsApp raw /groups list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Ergebnisse eines raw Befehls im Log zu sehen, muss noch [[verbose]] 4 gesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WhatsApp verbose 4&amp;lt;/code&amp;gt;&lt;br /&gt;
Dieses Attribut sollte, wenn nicht mehr benötigt, wieder gelöscht werden, um unnötige Logeinträge zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=27543|LinkText=Forenthread}}, in dem die Whatsapp Anwendung beschrieben wird&lt;br /&gt;
* {{Link2Forum|Topic=27543|Message=299292|LinkText=Foreneintrag}}, ab dem das yowsup Modul beschrieben wird&lt;br /&gt;
* Die Python Whatsapp Library auf [https://github.com/tgalal/yowsup github]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMS_100_WD_Wassermelder&amp;diff=11287</id>
		<title>HMS 100 WD Wassermelder</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMS_100_WD_Wassermelder&amp;diff=11287"/>
		<updated>2015-05-21T06:26:36Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Bild-Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HMS100WD.jpg&lt;br /&gt;
|Bildbeschreibung=HMS 100 WD&lt;br /&gt;
|HWProtocol=HMS&lt;br /&gt;
|HWType=Sender&lt;br /&gt;
|HWCategory=HMS&lt;br /&gt;
|HWComm=868MHz&lt;br /&gt;
|HWChannels=1&lt;br /&gt;
|HWVoltage=3V&lt;br /&gt;
|HWPowerConsumption=?&lt;br /&gt;
|HWPoweredBy=Batterie, 2xAA&lt;br /&gt;
|HWSize=70 x 100 x 24 mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#HMS 12_HMS.pm]&lt;br /&gt;
|HWManufacturer=ELV / eq3&lt;br /&gt;
}}&lt;br /&gt;
Durch zwei, in das Gehäuse integrierte Fühlerpaare registriert der Wassermelder HMS 100 WD auftretende Feuchtigkeit und Flüssigkeiten auf dem Boden. Bereits geringe Pegel sind durch das flache aufliegen des Gehäuses messbar.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Zustandsänderungen werden sofort übertragen und alle 30 Minuten wiederholt. Zudem wird im Alarmfall der Zustand &amp;quot;ständig&amp;quot; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Der Wassermelder ist bis zu einem Wasserstand von 2mm einsetzbar.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
!  Parameter &lt;br /&gt;
!  Wertbeispiel &lt;br /&gt;
!  Erklärung&lt;br /&gt;
|- &lt;br /&gt;
| battery &lt;br /&gt;
|  empty&lt;br /&gt;
|  Ladezustand der Batterie&lt;br /&gt;
|- &lt;br /&gt;
| state&lt;br /&gt;
|  Water Detect: off&lt;br /&gt;
|  Zustand des Wassermelders&lt;br /&gt;
|- &lt;br /&gt;
| water_detect&lt;br /&gt;
|  off &lt;br /&gt;
|  Zustand des Wassermelders&lt;br /&gt;
|- &lt;br /&gt;
| type&lt;br /&gt;
|  HMS100WD&lt;br /&gt;
|  Typenbezeichnung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Das Gerät ist uneingeschränkt mit FHEM nutzbar.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Link ==&lt;br /&gt;
* Bedienungsanleitung [http://files.elv.de/service/manuals/HMS100WD/HMS100WD_UM_G_030226.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HMS Components]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:HMS100WD.jpg&amp;diff=11286</id>
		<title>Datei:HMS100WD.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:HMS100WD.jpg&amp;diff=11286"/>
		<updated>2015-05-21T06:26:10Z</updated>

		<summary type="html">&lt;p&gt;SirUli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMS_100_WD_Wassermelder&amp;diff=11285</id>
		<title>HMS 100 WD Wassermelder</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMS_100_WD_Wassermelder&amp;diff=11285"/>
		<updated>2015-05-21T06:06:52Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Erste Version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=PlatzHalter.png&lt;br /&gt;
|Bildbeschreibung=HMS 100 WD&lt;br /&gt;
|HWProtocol=HMS&lt;br /&gt;
|HWType=Sender&lt;br /&gt;
|HWCategory=HMS&lt;br /&gt;
|HWComm=868MHz&lt;br /&gt;
|HWChannels=1&lt;br /&gt;
|HWVoltage=3V&lt;br /&gt;
|HWPowerConsumption=?&lt;br /&gt;
|HWPoweredBy=Batterie, 2xAA&lt;br /&gt;
|HWSize=70 x 100 x 24 mm&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#HMS 12_HMS.pm]&lt;br /&gt;
|HWManufacturer=ELV / eq3&lt;br /&gt;
}}&lt;br /&gt;
Durch zwei, in das Gehäuse integrierte Fühlerpaare registriert der Wassermelder HMS 100 WD auftretende Feuchtigkeit und Flüssigkeiten auf dem Boden. Bereits geringe Pegel sind durch das flache aufliegen des Gehäuses messbar.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Zustandsänderungen werden sofort übertragen und alle 30 Minuten wiederholt. Zudem wird im Alarmfall der Zustand &amp;quot;ständig&amp;quot; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Der Wassermelder ist bis zu einem Wasserstand von 2mm einsetzbar.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
!  Parameter &lt;br /&gt;
!  Wertbeispiel &lt;br /&gt;
!  Erklärung&lt;br /&gt;
|- &lt;br /&gt;
| battery &lt;br /&gt;
|  empty&lt;br /&gt;
|  Ladezustand der Batterie&lt;br /&gt;
|- &lt;br /&gt;
| state&lt;br /&gt;
|  Water Detect: off&lt;br /&gt;
|  Zustand des Wassermelders&lt;br /&gt;
|- &lt;br /&gt;
| water_detect&lt;br /&gt;
|  off &lt;br /&gt;
|  Zustand des Wassermelders&lt;br /&gt;
|- &lt;br /&gt;
| type&lt;br /&gt;
|  HMS100WD&lt;br /&gt;
|  Typenbezeichnung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Das Gerät ist uneingeschränkt mit FHEM nutzbar.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Keine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Link ==&lt;br /&gt;
* Bedienungsanleitung [http://files.elv.de/service/manuals/HMS100WD/HMS100WD_UM_G_030226.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HMS Components]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-LC-DIM1T-FM_1-Kanal-Dimmer_UP&amp;diff=9271</id>
		<title>HM-LC-DIM1T-FM 1-Kanal-Dimmer UP</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-LC-DIM1T-FM_1-Kanal-Dimmer_UP&amp;diff=9271"/>
		<updated>2015-01-10T13:33:08Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Link aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Homematic Funk 1-Kanal-Dimmer, Phasenabschnitt (Unterputz)&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
Schalten eines angeschlossenen Verbrauchers mittels [[CUL]]/[[CUN]]/[[HMLAN Konfigurator]] und über einen mechanischen spannungsfesten Taster. &lt;br /&gt;
&lt;br /&gt;
Schaltdoseneinsatz zusätzlich zu vorhandenem Taster (erfordert evtl. tiefere Schaltdose).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Schaltvermögen: 180VA 230V/50Hz&lt;br /&gt;
* Art: Phasenabschnittdimmer&lt;br /&gt;
* Standby Verbrauch: 1W&lt;br /&gt;
* Maße(BxHxT): 53x53x30mm&lt;br /&gt;
&lt;br /&gt;
= Hinweise zur Hardware-Installation =&lt;br /&gt;
&lt;br /&gt;
Will man die Funk-Schaltaktoren auch manuell betreiben, d.h. man upgradet eine vorhandene Elektroinstallation, so sind Taster notwendig. Schalter können notfalls mittels einer zusätzlichen Feder zu Taster umgebaut werden, Tastschalter sind leider nicht geeignet. Schalter und Tastschalter führen dazu, dass der Aktor nach Betätigung des Schalters in den Anlernmodus versetzt wird und auch in diesem verbleibt.&lt;br /&gt;
&lt;br /&gt;
Je nach vorhandenen Schalterdosen empfiehlt es sich bestehende Schalterdosen nach hinten auszuweiten, d.h. die Abdeckung nach hinten heraus zu brechen, da die Aktoren und Kabel nicht gerade sparsam mit dem Platz umgehen. Alternativ könnte man den Aktor auch in eine zusätzliche Schalterdosen unterbringen und diese mit einem Federdeckel abschließen. Dies hat den Vorteil, dass man auch durch relativ dicke Tapete die LED und somit den Zustand des Aktors ablesen kann.&lt;br /&gt;
&lt;br /&gt;
= Kompatible Leuchtmittel =&lt;br /&gt;
&lt;br /&gt;
Hier eine Übersicht über die Kompatibilität des HM-LC-DIM1T-FM mit diversen Leuchtmitteln:&lt;br /&gt;
&lt;br /&gt;
{|  cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;Art&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Bezeichnung&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Sockel&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Verbrauch&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Farbtemperatur&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Laut Hersteller geeignet für&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Funktion&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Einschränkungen&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Kompatibilitätsliste&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Hersteller Link&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| Glühlampe&lt;br /&gt;
| Glühlampe&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| An-/Abschnitt&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| Energiesparlampe&lt;br /&gt;
| Osram Dulux Intelligent Dim Globe&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Anschnitt&lt;br /&gt;
| vermutlich nein&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/kompaktleuchtstofflampen/osram-dulux-intelligent/osram-dulux-intelligent-dim-globe/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| Energiesparlampe&lt;br /&gt;
| Osram Dulux Intelligent Dim Stick&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Anschnitt&lt;br /&gt;
| vermutlich nein&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/kompaktleuchtstofflampen/osram-dulux-intelligent/osram-dulux-intelligent-dim-stick/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| Energiesparlampe&lt;br /&gt;
| Phlilips Softone Dimmable&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| An-/Abschnitt&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/energiesparlampen/energiesparlampen-gluehlampenform/softone-dimmable/20165/cat/]&lt;br /&gt;
|- &lt;br /&gt;
| Energiesparlampe&lt;br /&gt;
| Phlilips MASTER PL-Electronic Dimmable&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| An-/Abschnitt&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
| [http://www.ecat.lighting.philips.at/l/professionelle-lampen/energiesparlampen/energiesparlampen-roehrenform/master-pl-electronic-dimmable/18109/cat/]&lt;br /&gt;
|- &lt;br /&gt;
| Energiesparlampe&lt;br /&gt;
| Phlilips TORNADO ESaver Dimmable&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Anschnitt&lt;br /&gt;
| vermutlich nein&lt;br /&gt;
| ?&lt;br /&gt;
| &lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/energiesparlampen/energiesparlampen-spezialform/tornado-esaver-dimmable/19666/cat/]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Delock Lighting&lt;br /&gt;
| GU10&lt;br /&gt;
| 6W&lt;br /&gt;
| 3000K&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1075/107524/Downloads/107524_delock.pdf]&lt;br /&gt;
| [http://www.delock-lighting.de/produkte/G_46327/merkmale.html]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Ledon LED-Spot MR16&lt;br /&gt;
| GU10&lt;br /&gt;
| 5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1026/102699/Downloads/102699_ledon.pdf]&lt;br /&gt;
| [http://www.ledon-lamp.com/de/ledon_led-lampe_MR16_5W_GU10_DIM.htm]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Ledon Tropfenform&lt;br /&gt;
| E14&lt;br /&gt;
| 5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/9/995/99557/Downloads/099557_Ledon.pdf]&lt;br /&gt;
| [http://www.ledon-lamp.com/de/ledon_led-lampe_P45_5W_E14_DIM.htm]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Ledon Kerzenform klar B35/C&lt;br /&gt;
| E14&lt;br /&gt;
| 5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/9/995/99554/Downloads/099554_Ledon.pdf]&lt;br /&gt;
| [http://www.ledon-lamp.com/de/ledon_led-lampe_B35_C_5W_E14%20DIM.htm]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Ledon Globe G80&lt;br /&gt;
| E27&lt;br /&gt;
| 6W&lt;br /&gt;
| 2800K&lt;br /&gt;
| k.A.&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/9/995/99586/Downloads/099586_Ledon.pdf]&lt;br /&gt;
| [http://www.ledon-lamp.com/de/ledon_led-lampe_G80_6W_E27_DIM.htm]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Ledon A65&lt;br /&gt;
| E27&lt;br /&gt;
| 10W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1000/100026/Downloads/100026_Ledon.pdf]&lt;br /&gt;
| [http://www.ledon-lamp.com/de/ledon_led-lampe_A65_10W_E27_DIM.htm]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Ledon G95&lt;br /&gt;
| E27&lt;br /&gt;
| 10W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1022/102273/Downloads/102273_ledon.pdf]&lt;br /&gt;
| [http://www.ledon-lamp.com/de/ledon_led-lampe_G95_10W_E27_DIM.htm]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| LG LED-Glühbirne A19&lt;br /&gt;
| E27&lt;br /&gt;
| 12,8W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1020/102043/Downloads/102043_LG.pdf]&lt;br /&gt;
| [http://www.lg.com/de/innenbeleuchtung/lg-A1912GD0GE1.C0AASAA-gluehbirne]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram SUPERSTAR PAR 16&lt;br /&gt;
| GU10&lt;br /&gt;
| 5,5W&lt;br /&gt;
| 3000K&lt;br /&gt;
| k.A.&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1025/102569/Downloads/102569_osram.pdf]&lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/consumer-led-reflektorlampen/led-superstar-par-16/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM PRO PAR 16 advanced 50&lt;br /&gt;
| GU10&lt;br /&gt;
| 9W&lt;br /&gt;
| 4000K&lt;br /&gt;
| k.A.&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1083/108338/Downloads/108338_osram.pdf]&lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-reflektorlampen/parathom-pro-par-16-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM PRO PAR 16 advanced 35&lt;br /&gt;
| GU10&lt;br /&gt;
| 5,2W&lt;br /&gt;
| 4000K&lt;br /&gt;
| k.A.&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1083/108337/Downloads/108337_osram.pdf]&lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-reflektorlampen/parathom-pro-par-16-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram LED Superstar Classic A50&lt;br /&gt;
| E27&lt;br /&gt;
| 12W&lt;br /&gt;
| 3000K&lt;br /&gt;
| k.A.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/consumer-led-lampen-mit-klassischen-kolbenformen/led-superstar-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram LED Superstar Classic A40&lt;br /&gt;
| E27&lt;br /&gt;
| 8,5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1082/108212/Downloads/108212_osram.pdf]&lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/consumer-led-lampen-mit-klassischen-kolbenformen/led-superstar-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram LED Superstar Classic A60&lt;br /&gt;
| E27&lt;br /&gt;
| 12W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1077/107748/Downloads/107748_osram.pdf]&lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/consumer-led-lampen-mit-klassischen-kolbenformen/led-superstar-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram LED Superstar Classic A75&lt;br /&gt;
| E27&lt;br /&gt;
| 14,5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1077/107749/Downloads/107749_osram.pdf]&lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/consumer-led-lampen-mit-klassischen-kolbenformen/led-superstar-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM CLASSIC A advanced 50&lt;br /&gt;
| E27&lt;br /&gt;
| 12W&lt;br /&gt;
| 3000K&lt;br /&gt;
| k.A.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-lampen-mit-klassischen-kolbenformen/parathom-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM CLASSIC A advanced 60&lt;br /&gt;
| E27&lt;br /&gt;
| 12W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-lampen-mit-klassischen-kolbenformen/parathom-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM CLASSIC A advanced 60&lt;br /&gt;
| E27&lt;br /&gt;
| 13W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-lampen-mit-klassischen-kolbenformen/parathom-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM CLASSIC A advanced 75&lt;br /&gt;
| E27&lt;br /&gt;
| 14,5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-lampen-mit-klassischen-kolbenformen/parathom-classic-a-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM CLASSIC P advanced 25&lt;br /&gt;
| E14&lt;br /&gt;
| 4,5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-lampen-mit-klassischen-kolbenformen/parathom-classic-p-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Osram PARATHOM CLASSIC P advanced 25&lt;br /&gt;
| E25&lt;br /&gt;
| 4,5W&lt;br /&gt;
| 2700K&lt;br /&gt;
| k.A.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.osram.de/osram_de/produkte/lampen/led-lampen/professional-led-lampen-mit-klassischen-kolbenformen/parathom-classic-p-advanced/index.jsp]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Philips MASTER LEDspot HV&lt;br /&gt;
| GU10&lt;br /&gt;
| 4W&lt;br /&gt;
| 2700K&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1065/106561/Downloads/106561_philips.pdf]&lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/oem/led-systems/led-retrofit-lampen/master-ledspot-hv/929000212702_eu/]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Philips MASTER LEDspot BBL&lt;br /&gt;
| GU10&lt;br /&gt;
| 7W&lt;br /&gt;
| 2700K&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1018/101863/Downloads/101863_Philips.pdf]&lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/led-lampen-und-komponenten/led-lampen/master-led-dimtone/61144/cat/]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Philips MASTER LEDbulb Designer&lt;br /&gt;
| E27&lt;br /&gt;
| 7W&lt;br /&gt;
| 2700k&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/led-lampen-und-komponenten/led-lampen/master-ledbulb-designer/61143/cat/]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Philips MASTER LEDlamps DimTone&lt;br /&gt;
| E27&lt;br /&gt;
| 8W&lt;br /&gt;
| 2200-2700K&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1027/102789/Downloads/102789_philips.pdf]&lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/led-lampen-komponenten/led-lampen/master-ledlamps-dimtone/929000215102_eu/]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Philips MASTER LEDbulb D&lt;br /&gt;
| E27&lt;br /&gt;
| 8W&lt;br /&gt;
| 2700K&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1022/102239/Downloads/102239_Philips.pdf]&lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/led-lampen-und-komponenten/led-lampen/master-ledbulb/19890/cat/]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Philips MASTER LEDbulb D&lt;br /&gt;
| E27&lt;br /&gt;
| 12W&lt;br /&gt;
| 2700K&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| eingeschränkt&lt;br /&gt;
| Dimmbereich&lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1006/100657/Downloads/100657_Philips.pdf]&lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/led-lampen-und-komponenten/led-lampen/master-ledbulb/19890/cat/]&lt;br /&gt;
|- &lt;br /&gt;
| LED&lt;br /&gt;
| Philips MASTER LEDbulb D&lt;br /&gt;
| E27&lt;br /&gt;
| 17W&lt;br /&gt;
| 2700K&lt;br /&gt;
| Anschnitt/Universal (RL/RLC)&lt;br /&gt;
| ja&lt;br /&gt;
| &lt;br /&gt;
| ELV [http://www.elv-downloads.de/Assets/Produkte/10/1060/106098/Downloads/106098_philips.pdf]&lt;br /&gt;
| [http://www.ecat.lighting.philips.de/l/professionelle-lampen/led-lampen-und-komponenten/led-lampen/master-ledbulb/19890/cat/]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wichtiger Hinweis zum Betrieb eines Phasenabschnittdimmers ==&lt;br /&gt;
&lt;br /&gt;
Der Dimmer ist nur mit folgenden Lampen zu betreiben:&lt;br /&gt;
* Hochvolt-Halogenlampen&lt;br /&gt;
* Niedervolt- Halogenlampen mit elektronischem Trafo&lt;br /&gt;
* Glühlampen&lt;br /&gt;
* dimmbare Energiesparlampen&lt;br /&gt;
&lt;br /&gt;
Im Zweifel vorher beim Hersteller nachhaken, bevor es zu Flackern oder Brummen kommt.&lt;br /&gt;
&lt;br /&gt;
= Hinweise zum Betrieb mit FHEM = &lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. Hierfür wird ein am Aktor temporär angeschlossener spannungsfester Taster zwingend benötigt. Im Gegensatz zu den Schaltaktoren, muss der Phasenabschnittdimmer innerhalb der ersten 5 Minuten nach Zuschalten der Netzspannung erfolgen. Nach dieser Zeitspanne ist ein Anlernen nicht mehr möglich. Darum sollte zum Anlernen des HM-LC-DIM1T-FM zuerst die Netzspannung ab- und zugeschaltet werden, d.h. praktischerweise Sicherung kurz raus und nach einer Minute wieder rein. Bitte auch zuvor alle angeschlossenen Geräte von der Sicherung trennen oder ausschalten.&lt;br /&gt;
&lt;br /&gt;
== FHEM Config-Auszug ==&lt;br /&gt;
&lt;br /&gt;
Ein exemplarischer Auszug aus der fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LichtWohnzimmerDimmer CUL_HM 184436&lt;br /&gt;
attr LichtWohnzimmerDimmer devInfo 110100&lt;br /&gt;
attr LichtWohnzimmerDimmer firmware 1.2&lt;br /&gt;
attr LichtWohnzimmerDimmer hmClass receiver&lt;br /&gt;
attr LichtWohnzimmerDimmer model HM-LC-DIM1T-FM&lt;br /&gt;
attr LichtWohnzimmerDimmer room Wohnzimmer&lt;br /&gt;
attr LichtWohnzimmerDimmer serialNr IEQ0xxxxxx&lt;br /&gt;
attr LichtWohnzimmerDimmer subType dimmer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mögliche Schaltoperationen ==&lt;br /&gt;
&lt;br /&gt;
Der Aktor versteht folgende Aktionen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;name&amp;gt; on -&amp;gt; Schaltet den Aktor ein&lt;br /&gt;
set &amp;lt;name&amp;gt; off -&amp;gt; Schaltet den Aktor aus&lt;br /&gt;
set &amp;lt;name&amp;gt; toggle -&amp;gt; Ein eingeschalteter Dimmer wird ausgeschaltet und ein ausgeschalteter Dimmer wird auf den letztgenutzten Wert hochgedimmt.&lt;br /&gt;
set &amp;lt;name&amp;gt; &amp;lt;Helligkeit&amp;gt; [&amp;lt;Einschaltdauer&amp;gt;] [&amp;lt;Rampenzeit&amp;gt;] -&amp;gt; Schaltet den Aktor ein und dimmt dabei auf &amp;lt;Helligkeit&amp;gt;%,&lt;br /&gt;
  100% entspricht dabei einem &amp;quot;on&amp;quot;. Optional kann als Einschaltdauer die Zeit in Sekunden angegeben werden, &lt;br /&gt;
  bis der Dimmer wieder automatisch abschalten soll (Bereich 0.00-111600 Sekunden). Optional kann weiterhin angegeben werden,&lt;br /&gt;
  dass der Dimmer über eine angegebene Zeit in Sekunden (Rampenzeit) auf die angegebene Helligkeit hochdimmt&lt;br /&gt;
  (Bereich 0.00 Sekunden - 111600 Sekunden) abgeschaltet wird.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Log-Auszug ==&lt;br /&gt;
In FHEM ist nach dem Schalten des HM-LC-DIM1T-FM folgendes Log zu sehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2012.02.05 23:09:19 2: CUL_HM set LichtWohnzimmerDimmer on&lt;br /&gt;
2012.02.05 23:09:21 2: CUL_HM set LichtWohnzimmerDimmer off&lt;br /&gt;
2012.02.06 22:40:15 2: CUL_HM set LichtWohnzimmerDimmer toggle&lt;br /&gt;
2012.02.06 22:41:15 2: CUL_HM set LichtWohnzimmerDimmer 32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
Ein Integrationsbeispiel ist in [[Jalousie und Beleuchtung in mehreren Räumen]] zu finden.&lt;br /&gt;
&lt;br /&gt;
Anleitung [http://www.eq-3.de/Downloads/eq3/pdf_produkte/HM-LC-Dim1T-FM_UM_GE_eQ-3_100422.pdf] PDF&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Dimmer]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=9160</id>
		<title>HMinfo</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=9160"/>
		<updated>2015-01-02T20:23:34Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Tag war falsch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HMInfo&#039;&#039;&#039; ist ein Modul, das alle [[HomeMatic]] repräsentiert. Es bietet Funktionen zur Übersicht, Kontrolle, Archivierung  und, begrenzt, zur Programmierung der Homematic Komponenten. Somit soll es eine Hilfestellung bei Konfiguration und Fehlerbehandlung geben. &lt;br /&gt;
 &lt;br /&gt;
== Definition == &lt;br /&gt;
HMInfo wird erstellt / angelegt mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;define hm HMinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach können alle Funktionen aufgelistet werden mit&lt;br /&gt;
:&amp;lt;code&amp;gt;get hm help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integritätsprüfungen ==&lt;br /&gt;
Befehle, um die Gültigkeit von verschiedenen HomeMatic Eigenschaften zu überprüfen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Erläuterungen !! Definition&lt;br /&gt;
|-&lt;br /&gt;
| Überprüfen, ob alle peerings auch beidseitig sind:&lt;br /&gt;
| &amp;lt;code&amp;gt;set hm peerCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Überprüfen, ob alle register korrekt gelesen wurden:&lt;br /&gt;
| &amp;lt;code&amp;gt;set hm regCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Kombination von peerCheck und regCheck&lt;br /&gt;
| &amp;lt;code&amp;gt;set hm configCheck&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anzeigen zur Übertragungssituation ==&lt;br /&gt;
===RSSI ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm rssi [&amp;lt;filter&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erzeugt eine Tabelle aller RSSI Werte.&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm clear [&amp;lt;filter&amp;gt;] rssi&amp;lt;/code&amp;gt;&lt;br /&gt;
:setzt die RSSI Werte aller devices gemäß filter zurück. Eine neue Messung kann beginnen&lt;br /&gt;
&lt;br /&gt;
===protoEvents ===&lt;br /&gt;
;&amp;lt;code&amp;gt;get hm protoEvents [&amp;lt;filter&amp;gt;][short|long] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Es wird eine Tabelle mit allen wichtigen Ereignissen zur Datenübertragung erzeugt. Dies beinhaltet Wiederholungen sowie Übertragungsfehler. &lt;br /&gt;
short ist eine Fassung ohne Zeitstempel und lässt sich besser am Bildschirm darstellen.&lt;br /&gt;
Ausserdem kann man sehen, welche Abfragen noch in der queue sind, z.B. durch autoReadReg erzeugt. &lt;br /&gt;
Die Zustände aller für HM zuständigen IOs sind beinhaltet. &lt;br /&gt;
Alles in allen ist hier ein kompletter Überblick zur Kommunikation zu sehen. Insbesondere bei&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm clear [&amp;lt;filter&amp;gt;] Protocol &amp;lt;/code&amp;gt;&lt;br /&gt;
setzt die Protokol Einträge aller gemäß Filter zurück. Kann gut vor einer Konfigurationsaktion genutzt werden, um hinterher zu kontrollieren, ob Fehler aufgetreten sind. &lt;br /&gt;
&lt;br /&gt;
===msgStat===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm msgStat &amp;lt;/code&amp;gt;&lt;br /&gt;
:Statistic der Übertragenen Messages insgesamt. Es gibt eine Tabelle über die letzten 24h und eine über die letzte Woche. &lt;br /&gt;
&lt;br /&gt;
== Speichern von Konfigurationen==&lt;br /&gt;
HMInfo speichert Konfigurationen der Geräte in Files. Mit dem Attribut configDir kann man ein Verzeichnis festlegen, in das alles geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
=== saveConfig===&lt;br /&gt;
Peers und Register werden in eine Datei geschrieben. Die Daten kann man ggf. wieder in ein Gerät oder ein Austauschgerät schreiben. Die Speicherung erfolgt kumulativ, man kann alles in eine Datei schreiben. &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig [&amp;lt;filter&amp;gt;] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== archConfig ===&lt;br /&gt;
Arbeitet prinzipiell wie saveConfig. Es werden jedoch nur vollständige Registersätze gespeichert, was einen höheren Level an Sicherheit der Dateninhalte gewährt.  &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm archConfig [-a] [&amp;lt;file&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
Mit dem &#039;&#039;&#039;Attribut autoArchive&#039;&#039;&#039; kann man einstellen, dass automatisch nach erfolgreichem Lesen einer Device-Konfiguration diese archiviert wird. &lt;br /&gt;
Das Speichern erfolgt kumulativ. Ab einer Dateigröße von 1MB wird gepurged, also alles bis auf den neusten Eintrag jeder Entity gelöscht.  &lt;br /&gt;
&lt;br /&gt;
Um eine Konfiguration zu sichern, sollte eine Kopie des Archivs gemacht werden. Das Archiv wird bei Gelegenheit überschrieben. &lt;br /&gt;
&lt;br /&gt;
Template erstellen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm saveConfig -f ^meinDevice$ &amp;lt;myTempalteFile&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loadConfig ===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm loadConfig [&amp;lt;filter&amp;gt;] [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest die Registerwerte, die für eine Entity in einem File gespeichert sind, zurück in die Readings. Sollten die Register schon in FHEM vorhanden sein, wird &#039;&#039;&#039;nicht&#039;&#039;&#039; überschrieben. &lt;br /&gt;
Sinn macht dies beispielsweise für remotes, die nicht automatisch gelesen werden sollen. Man kann somit nach einem system-reboot die Register &amp;quot;rekonstruieren&amp;quot; und wieder darstellen. &lt;br /&gt;
Es liegt im ermessen des User, eine bekannt aktuelle Version der Register einzulesen. &lt;br /&gt;
&lt;br /&gt;
=== purgeConfig===&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm purgeConfig [&amp;lt;filename&amp;gt;] &amp;lt;/code&amp;gt;&lt;br /&gt;
:Löscht alle älteren Datensätze in einem File. &lt;br /&gt;
&lt;br /&gt;
== Konfigurationen bearbeiten ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
HMInfo erlaubt das Erstellen und Nutzen von Templates. Das sind Schablonen, die das Setzen von Registern abstrahieren und auf eine höhere Ebene heben. So kann man das Setzen der Konfiguration eines Aktors beispielsweise um mit einem Bewegungsmelder zusammen zu arbeiten in einem Kommando zusammenfassen.&lt;br /&gt;
Faktisch setzt das Template also eine Gruppe von Registern auf einmal.&lt;br /&gt;
&lt;br /&gt;
====templateList ====&lt;br /&gt;
Die vorhandenen templates kann man mit templateList sehen. &lt;br /&gt;
  get hm templateList&lt;br /&gt;
  &lt;br /&gt;
  SwOnCond         params:level cond               Info:switch: execute only if condition [geLo|ltLo] level is below limit&lt;br /&gt;
  SwToggle         params:                         Info:Switch: toggle on trigger&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
  motionOnDim      params:ontime brightness        Info:Dimmer: on for time if MDIR-brightness below level&lt;br /&gt;
  motionOnSw       params:ontime brightness        Info:Switch: on for time if MDIR-brightness below level&lt;br /&gt;
Die Liste der verfügbaren Tempaltes, deren Parameter falls nötig und eine kurze Info, was das Template bewirken soll&lt;br /&gt;
&lt;br /&gt;
  get hm templateList autoOff&lt;br /&gt;
&lt;br /&gt;
  autoOff          params:time                     Info:staircase - auto off after &amp;lt;time&amp;gt;, extend time with each trigger&lt;br /&gt;
    ActionType       :jmpToTarget&lt;br /&gt;
    OffTime          :111600&lt;br /&gt;
    OnTime           :time&lt;br /&gt;
    SwJtDlyOff       :dlyOn&lt;br /&gt;
    SwJtDlyOn        :no&lt;br /&gt;
    SwJtOff          :dlyOn&lt;br /&gt;
    SwJtOn           :on&lt;br /&gt;
Ein templateList auf ein einzelnes Template zeigt im Detail, was das Template verändern wird.&lt;br /&gt;
&lt;br /&gt;
====templateSet ====&lt;br /&gt;
Um ein Template auf einen Aktor anzuwenden, muss man neben den spezifischen Parametern angeben, für welchen Peer es gelten soll und ob es bei einem kurzen oder langen Tastendruck angewendet werden soll. &lt;br /&gt;
  set hm templateSet &amp;lt;entity&amp;gt; &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  set hm templateSet Licht1 autoOff FB1_Btn2:short 10&lt;br /&gt;
  set hm templateSet Licht1 SwOn FB1_Btn2:long&lt;br /&gt;
Licht1 soll, wenn ein kurzer Trigger von FB1_Btn2 kommt für 10 sec eingeschaltet werden, dann ausgehen (Treppenhausfunktion). Kommt aber ein langer Tastendruck wird das Licht dauerhaft eingeschaltet. &lt;br /&gt;
  set hm templateSet Licht1 motionOnSw MD1:short 30 20&lt;br /&gt;
Der Switch Aktor Licht1 soll mit einem Bewegungsmelder betrieben werden. Der Bewegungsmelder sendet keine &#039;langen&#039; Trigger sondern nur kurze. Im Beispiel wird Licht1 für 30 Sekunden eingeschaltet, wenn der Bewegungsmelder einen Trigger sendet UND es dunkler ist als &amp;quot;20&amp;quot; (Brightness level). &lt;br /&gt;
&lt;br /&gt;
====templateDef ====&lt;br /&gt;
Neben den vorbereiteten Templates kann der User eigene definieren oder von anderen Usern sich Templates geben lassen. Die Definition von Templates ist für erfahrene User gedacht, im Gegensatz zur Nutzung eines Templates mit set - das ist für Anfänger gedacht. &lt;br /&gt;
  set hm templateDef &amp;lt;templateName&amp;gt; &amp;lt;param1[:&amp;lt;param2&amp;gt;...] &amp;lt;description&amp;gt; &amp;lt;reg1&amp;gt;:&amp;lt;val1&amp;gt; [&amp;lt;reg2&amp;gt;:&amp;lt;val2&amp;gt;] ... &lt;br /&gt;
  set hm templateDef myTemplate anzeit:auszeit &amp;quot;licht schaltet ständig an und aus&amp;quot; OnTime:anzeit OffTime:auszeit OnDly:0&lt;br /&gt;
Mit diesem Template wird die Anzeit und die Auszeit eines Schalt-Aktors auf den vom User gewünschten Wert gesetzt. Die Verzögerung OnDly wird auf 0 gesetzt.&lt;br /&gt;
&lt;br /&gt;
====templateChk ====&lt;br /&gt;
Man kann prüfen, ob ein Aktor/Peer gemäss einem Template programmiert ist. &lt;br /&gt;
  get hm templateChk [&amp;lt;filter&amp;gt;] &amp;lt;templateName&amp;gt; &amp;lt;peer:[long|short]&amp;gt; [&amp;lt;param1&amp;gt; ...] &lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01 5&lt;br /&gt;
Es wird geprüft für alle HM-Komponenten, die &amp;quot;Rollo&amp;quot; im Namen haben (siehe [[Homematic HMInfo#Filter|Filter]]) dem (hoffentlich vorhandenen) template &amp;quot;RolloHoch&amp;quot; verglichen. Geprüft wird nur der Peer &amp;quot;self01&amp;quot;, aber für long UND short.&lt;br /&gt;
  get hm templateChk -f Rollo RolloHoch self01:sort 5&lt;br /&gt;
das selbe, nur für short Einträge&lt;br /&gt;
&lt;br /&gt;
===Temperaturlisten===&lt;br /&gt;
HMInfo bietet verschiedene Methoden, Temperaturlisten für Thermostate (CC-TC, TC-IT oder RT) zu verwalten und zu nutzen. Prinzip ist, dass die Temperaturlisten in einer Konfigurationsdatei abgelegt werden. Der Dateiname ist frei wählbar.&lt;br /&gt;
Für alle Kommandos können die [[Homematic HMInfo#Filter|Filter]] genutzt werden. &lt;br /&gt;
Beim Prüfen und Speichern wird davon ausgegangen, dass die Register und Daten in FHEM aktuell sind. Die Funktionen speichern und vergleichen aus Performancegründen nicht direkt im Device sondern die Daten, die FHEM schon gelesen hat. &lt;br /&gt;
Siehe auch &#039;&#039;&#039;autoReadReg&#039;&#039;&#039; Attribut der HM Komponenten.&lt;br /&gt;
&lt;br /&gt;
====Speichern ====&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm tempList save &amp;lt;filename&amp;gt; &amp;lt;code&amp;gt;&lt;br /&gt;
:Die in FHEM vorhandenen Temperaturlisten aller devices (hier ist kein Filter gesetzt, also alle) werden in die Datei &amp;lt;filename&amp;gt; geschrieben. Man kann dieses als Basis nehmen, um seine Temperaturlisten zu bearbeiten. &lt;br /&gt;
====Prüfen====&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm tempList verify &amp;lt;filename&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:HMInfo vergleicht die in der Datei abgelegten Temperaturlisten mit den in FHEM vorliegenden. Unterschiede werden gemeldet. Es wird nichts in das Device geschrieben oder verändert.&lt;br /&gt;
&lt;br /&gt;
====Restore====&lt;br /&gt;
;&amp;lt;code&amp;gt;set hm tempList restore &amp;lt;filename&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
:Es werden alle Temperaturlisten aus der Datei in die dafür eingerichteten Komponenten eingetragen. Dabei werden ausschließlich die Änderungen geschrieben. Liegen keine Unterschiede zwischen Dateiinhalt und aktuellen Daten vor, wird auch nichts geschrieben. Ein mehrfaches anwenden des Kommandos ist also keine Belastung des Systems.&lt;br /&gt;
Will man das &#039;&#039;&#039;Schreiben&#039;&#039;&#039; ungeachtet der vorhandenen Daten &#039;&#039;&#039;erzwingen&#039;&#039;&#039; sollte man mit &amp;quot;clear Register&amp;quot; die in FHEM vorhandenen Einträge löschen und dann ein tempList restore ausführen.&lt;br /&gt;
&lt;br /&gt;
====Defaults====&lt;br /&gt;
Der Default-Dateiname ist &#039;&#039;&#039;tempList.cfg&#039;&#039;&#039;.&lt;br /&gt;
Die Datei steht im fhem-root Verzeichnis. Hat man das Attribut configDir gesetzt und gibt kein Verzeichnis an, wird die Datei im spezifizierten Verzeichnis gesucht. &lt;br /&gt;
Das default-template ist der Name des Device. Ist im Device das &#039;&#039;&#039;Attribut tempListTmpl&#039;&#039;&#039; gesetzt, wird dies zum Vergleich oder Setzen genutzt. &lt;br /&gt;
&lt;br /&gt;
====Aufbau Tempfile====&lt;br /&gt;
Zum erstmaligen Erstellen einer Datei nutzt man am einfachsten das Kommando tempList save. &lt;br /&gt;
&lt;br /&gt;
  entities:HK1,HK2&lt;br /&gt;
  R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
  R_1_tempListSun&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
  R_2_tempListMon&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
  R_3_tempListTue&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0&lt;br /&gt;
  R_4_tempListWed&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
  R_5_tempListThu&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
  R_6_tempListFri&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
  entities:HK3&lt;br /&gt;
  R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
  R_1_tempListSun&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
  R_2_tempListMon&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
  R_3_tempListTue&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0&lt;br /&gt;
  R_4_tempListWed&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0  &lt;br /&gt;
  R_5_tempListThu&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
  R_6_tempListFri&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;&#039;entities&#039;&#039;&#039; legt fest, für welche Komponenten die nachfolgende Liste gültig sein soll. Die Erste ist also gültig für HK1 und HK2, die Zweite für HK3. &lt;br /&gt;
Will man identische Listen für mehrere Komponenten nutzen, schreibt man deren Namen einfach in die Liste der Entities. &lt;br /&gt;
Zu Beachten ist, dass nach Ändern der Liste ein erneutes templistSave auf den gleichen Dateinamen die Daten verändern kann. Es ist daher ratsam, den Dateinamen einer manuell bearbeiteten Konfiguration nicht beim Default zu belassen. &lt;br /&gt;
&lt;br /&gt;
====tempList Templates====&lt;br /&gt;
User möchten möglicherweise die Temperaturlisten einer Komponente über das Jahr verändern (Sommer- und Winterprofil). Dazu kann man Templates festlegen. Das ganze funktioniert wie das Kommando tempList mit dem Unterschied, dass der Namen des Templates angegeben werden kann. &lt;br /&gt;
&amp;lt;!-- Die zweite Hälfte des folgenden Satzes ergibt derzeit keinen Sinn. Was genau ist da gemeint? --&amp;gt;&lt;br /&gt;
In der Datei wird der Name des Templates in der Zeile Entities eingegeben, identisch wir(?) der Name einer Komponente. &lt;br /&gt;
:&amp;lt;code&amp;gt;set hm tempListTmpl -f hkWZ wzSommer restore tempListFile.cfg &amp;lt;/code&amp;gt;&lt;br /&gt;
Alle Thermostate mit hkWZ im Namen wird die Templiste, die im File tempListFile.cfg unter entity &amp;quot;wzSommer&amp;quot; abgelegt ist überschrieben. Wie bei tempList restore wird auch hier nur geschrieben, wenn ein Unterschied erkannt wird.&lt;br /&gt;
&lt;br /&gt;
=== Registersätze kopieren ===&lt;br /&gt;
HMInfo erlaubt das Kopieren von Register-Listen. Über Register wird ein HM-Gerät eingestellt und die Register sind in Listen gruppiert. Die Reaktion und das Verhalten eines Aktors auf einen Trigger eines Sensors wird in dem Registersatz zu diesem Peer komplett beschrieben. &lt;br /&gt;
Durch die Möglichkeit einen solchen Registersatz im Device zu kopieren kann man das Verhalten, das man für einen Knopf/Sensor festgelegt hat identisch in einen zweiten kopieren. &lt;br /&gt;
HMInfo geht davon aus, dass die vom Gerät gelesene Konfiguration vor dem Kommando aktuell und komplett ist. &lt;br /&gt;
 set hm cpRegs Licht1:FB3_Btn2 Licht3:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht2:FB3_Btn2 Licht2:FB1_Btn4&lt;br /&gt;
 set hm cpRegs Licht4:FB3_Btn2 Licht4:FB5_Btn2&lt;br /&gt;
Die obigen Beispiele bewirken der Reihe nach:&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht1 hervorruft auch nach Licht3 für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
Duplizieren das Verhalten, das Fernbedienungsknopf 2 der Fernbedienung 3 bei Aktor Licht2 hervorruft auch nach Licht2 (selber Aktor) für Fernbedienungsknopf4 der Fernbedienung 1.&lt;br /&gt;
&lt;br /&gt;
== Web Einträge und Readings ==&lt;br /&gt;
Readings und Internals von HMInfo bieten eine Zusammenfassung des Zustands aller HM Komponenten. Diese sind in Fehler &#039;&#039;&#039;ERR&#039; , Warnungen &#039;&#039;&#039;W_&#039;&#039;&#039; und Information &#039;&#039;&#039;I_&#039;&#039;&#039; untergliedert. Die Prüfung und Erneuerung der Zähler und Werte wird mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm update &amp;lt;/code&amp;gt;&lt;br /&gt;
erreicht. Mit dem Attribut autoUpdate kann man es automatisch regelmäßig starten.&lt;br /&gt;
&lt;br /&gt;
=== Fehlermeldungen ===&lt;br /&gt;
Als Fehler erkannte Zustände werden in Variablen beginnend mit &#039;&#039;&#039;ERR&#039;&#039;&#039; dargestellt. Erfasste Fehler sind kritische RSSI Werte und Protokoll-/Übertragungsfehler. Ausserdem kann man im Attribut sumERROR eintragen, welche Readings zu einer Fehlermeldung führen sollen. Eingetragen werden:&lt;br /&gt;
Reading:&amp;lt;gutwert&amp;gt;. Wenn ein Reading mit einen anderen als dem &amp;quot;gutwert&amp;quot; gefunden wird, wird dies alarmiert. &lt;br /&gt;
Beispiel: &lt;br /&gt;
:&amp;lt;code&amp;gt;battery:ok &amp;lt;/code&amp;gt;&lt;br /&gt;
hat eine HM Komponente ein Reading &amp;quot;battery&amp;quot; und dieses hat einen anderen Wert als &amp;quot;ok&amp;quot; wird dies alarmiert. &lt;br /&gt;
In den Readings von HMInfo würde im Feherfall&lt;br /&gt;
  internal:&lt;br /&gt;
    ERR_names &amp;lt;devicename1&amp;gt;,&amp;lt;devicename2&amp;gt;&lt;br /&gt;
  Readings:&lt;br /&gt;
    ERR_battery low:2&lt;br /&gt;
&lt;br /&gt;
Der default aller Error-meldungen ist&lt;br /&gt;
battery:ok,sabotageError:off,powerError:ok,overload:off,overheat:off,reduced:off,motorError:no,error:none,uncertain:yes,smoke_detect:none,cover:closed&lt;br /&gt;
&lt;br /&gt;
Diese Zusammenfassung der Fehlermeldungen könnte man nutzen, um über notify einen Alarm auszulösen oder eine E-Mail zu senden. &lt;br /&gt;
&lt;br /&gt;
=== Warnungen===&lt;br /&gt;
Hierzu gehören Wiederholungen von Nachrichten (nicht aber Abbrüche, das sind Fehler). Es wird auch ausstehendes Lesen der Konfiguration, das durch autoReadReg getriggert wird, hier angezeigt. &lt;br /&gt;
&lt;br /&gt;
=== Statusmeldungen ===&lt;br /&gt;
Analog zu den Fehlermeldungen kann man mit dem Attribut sumStatus gewisse Readings zählen lassen. Beipiel wäre &lt;br /&gt;
  attr HM sumStatus motor&lt;br /&gt;
HMInfo zeigt in dem Reading I_sum_motor dann an, welcher Inhalt des Readings &amp;quot;motor&amp;quot;  wie oft gefunden wurde. Es könnte so aussehen&lt;br /&gt;
  stop:on:4;stop:1;&lt;br /&gt;
Vier Komponenten stehen auf motor: stop:on und eine steht auf motor: stop&lt;br /&gt;
&lt;br /&gt;
Das Internal &#039;&#039;&#039;I_HM_IOdevices&#039;&#039;&#039; zeigt die von HM Komponenten genutzten IOs und deren State. &lt;br /&gt;
&lt;br /&gt;
== Infos ==&lt;br /&gt;
  get hm models [-f &amp;lt;regexp&amp;gt;]&lt;br /&gt;
  get hm models&lt;br /&gt;
  get hm models -f remote&lt;br /&gt;
  get hm models -f HM_RC&lt;br /&gt;
Zeigt alle in FHEM unterstützten Modelle und deren wesentliche Parameter. Man kann mittels regexp die Liste filtern.&lt;br /&gt;
&lt;br /&gt;
  get hm param [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;] parameter1 parameter2&lt;br /&gt;
  get hm param -d IODev DEF model&lt;br /&gt;
  get hm param -c -f Rollo peerList&lt;br /&gt;
man kann sich listen von Parametern anzeigen lassen  &lt;br /&gt;
&lt;br /&gt;
  get hm register [&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
zeigt Register in tabellarischer Form. &lt;br /&gt;
&lt;br /&gt;
  get hm peerXref[&amp;lt;typefilter&amp;gt;] [-f &amp;lt;nameFilter&amp;gt;]&lt;br /&gt;
gibt an, wer mit wem gepeert ist&lt;br /&gt;
&lt;br /&gt;
== Rücksetzen von Variablen und Zählern ==&lt;br /&gt;
 set HM clear [&amp;lt;typeFilter&amp;gt;] [Protocol|readings|msgStat|register|rssi]&lt;br /&gt;
*register löscht alle Register-readings&lt;br /&gt;
*readings löscht &#039;&#039;&#039;alle&#039;&#039;&#039; readings&lt;br /&gt;
*Protocol löscht alle Protokol-einträge, pending Kommandos und Protokoll-fehler. &lt;br /&gt;
*rssi löscht alle ermittelten RSSI Werte&lt;br /&gt;
*msgStat setzt die Message Statistik zurück&lt;br /&gt;
&lt;br /&gt;
== Filter ==&lt;br /&gt;
Kommandos in HMInfo wirken auf alle HM Komponenten. Man kann dies mit Hilfe der Filter einschränken. Zum einen gibt es &#039;&#039;&#039;modelsFilter&#039;&#039;&#039;, womit man nur devices, nur channels, nur virtuelle Entities bearbeiten kann&lt;br /&gt;
     set &amp;lt;name&amp;gt; &amp;lt;cmd&amp;gt; &#039;&#039;&#039;[-dcasevi]&#039;&#039;&#039;  [params]&lt;br /&gt;
        entities according to list will be processed&amp;quot;&lt;br /&gt;
          d - device   :include devices&amp;quot;&lt;br /&gt;
          c - channels :include channels&amp;quot;&lt;br /&gt;
          i - ignore   :include devices marked as ignore&amp;quot;&lt;br /&gt;
          v - virtual  :supress fhem virtual&amp;quot;&lt;br /&gt;
          p - physical :supress physical&amp;quot;&lt;br /&gt;
          a - aktor    :supress actor&amp;quot;&lt;br /&gt;
          s - sensor   :supress sensor&amp;quot;&lt;br /&gt;
          e - empty    :include results even if requested fields are empty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ein auf &#039;&#039;&#039;-d&#039;&#039;&#039; gefiltertes Kommando wird nur auf devices, nicht aber auf channels angewendet. &lt;br /&gt;
&lt;br /&gt;
Dann gibt es noch den &#039;&#039;&#039;nameFilter&#039;&#039;&#039;, mit dem mittels regexp auf den Namen der Entity gefiltert werden kann&lt;br /&gt;
  -f Rollo # alle Entities mit Rollo im Namen&lt;br /&gt;
  -f ^Rollo$ # nur Entity mit Namen &amp;quot;Rollo&amp;quot;&lt;br /&gt;
  -f Rollo$ # nur Entity deren Name auf Rollo endet&lt;br /&gt;
&lt;br /&gt;
Die Filter kann man kombinieren mit &lt;br /&gt;
  -c -f Rollo # alle Kanäle mit Rollo im Namen&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
Zeige mir die Parameter IODev und room der Devices mit Rollo im Namen&lt;br /&gt;
  set hm param -d -f Rollo IODev room&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
* &#039;&#039;&#039;autoArchive &#039;&#039;&#039; automatisch archivieren von vollständigen Konfigurationen.&lt;br /&gt;
* &#039;&#039;&#039;autoUpdate&#039;&#039;&#039; startet regelmäßig das Komamndo &amp;quot;update&amp;quot;. Die Wiederholzeit wird eingestellt mit hh:mm. Sinnvoll erscheint z.B. alle 5 Minuten, also 00:05.&lt;br /&gt;
* &#039;&#039;&#039;configDir&#039;&#039;&#039; bietet die Möglichkeit, ein Verzeichnis zu definieren, in das HMInfo Dateien ablegen und von dem es die Dateien lesen wird. Default ist fhem_root.&lt;br /&gt;
* &#039;&#039;&#039;configFilename&#039;&#039;&#039; legt einen default Namen fest, der bei save und archive genutzt wird. Default ist regSave.cfg.&lt;br /&gt;
* &#039;&#039;&#039;hmAutoReadScan&#039;&#039;&#039; zeitinterval in Minuten, in denen CUL_HM prüft, ob offene autoRead bereitstehen und die IOs die Kapazität haben. Default ist 4 min.&lt;br /&gt;
&lt;br /&gt;
== Quellen == &lt;br /&gt;
* Thread [http://forum.fhem.de/index.php?topic=11035.0 HMinfo] im Fhem Forum&lt;br /&gt;
* Thread [http://forum.fhem.de/index.php/topic,20119.0.html HMINfo, Intention, Sinn und Zweck] im Fhem Forum&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:Fronthem&amp;diff=9125</id>
		<title>Diskussion:Fronthem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:Fronthem&amp;diff=9125"/>
		<updated>2014-12-30T20:57:17Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Die Seite wurde neu angelegt: „Evtl könnte noch erläutert werden was ein GAD ist? --~~~~“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Evtl könnte noch erläutert werden was ein GAD ist?&lt;br /&gt;
--[[Benutzer:SirUli|SirUli]] ([[Benutzer Diskussion:SirUli|Diskussion]]) 20:57, 30. Dez. 2014 (UTC)&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Kindle_Display&amp;diff=8090</id>
		<title>Kindle Display</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Kindle_Display&amp;diff=8090"/>
		<updated>2014-10-03T11:01:01Z</updated>

		<summary type="html">&lt;p&gt;SirUli: /* Cron setting (optional) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article shows how to configure a Amazon Kindle eBook-Reader as a information display for fhem. Use this manual at your own risk. Jailbreaking a Kindle is quite easy but there is no guarantee for breaking the system.&amp;lt;br&amp;gt;&lt;br /&gt;
I will show how to configure it with the FileReplacer.pm from Stefan. The &amp;quot;old&amp;quot; method with the special function in MyUtils is not part of this article.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: This Article is not yet finished! This note will be removed once i think it&#039;s okay ;)&amp;lt;br&amp;gt;&lt;br /&gt;
As long as I&#039;m working on it, this information will be shown.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
All of the information shown below is collected from the fhem-forum [http://forum.fhem.de/index.php/topic,21821.0.html fhem-Forum]. Many thanks to everybody who participated on the development of this information to get it done.Special thanks to &amp;quot;alex&amp;quot; and &amp;quot;stefan&amp;quot; from the board. Further information is from the [http://www.mobileread.com mobileread board].&lt;br /&gt;
&lt;br /&gt;
=Hardware requirements=&lt;br /&gt;
==Kindle Touch / Paperwhite / Paperwhite 2==&lt;br /&gt;
You can use Kindle Touch / Paperwhite / Paperwhite 2 without any limitations. &lt;br /&gt;
==Kindle 4==&lt;br /&gt;
For setting this up on the Kindle 4 (with the 5-way button) you need some more configuration work but it&#039;s also working. Addidional tasks for this version are shown down below.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
==fhem and server configuration==&lt;br /&gt;
===Server configuration===&lt;br /&gt;
Not sure if still needed, but just for in case it is, install imagemagick on your linux system.&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;apt-get install imagemagick&amp;lt;/code&amp;gt;&lt;br /&gt;
That&#039;s it :)&lt;br /&gt;
===fhem configuration===&lt;br /&gt;
First you need a svg-template. You can find one in the first posting on the [http://forum.fhem.de/index.php/topic,21821.0.html fhem-Forum] thread. In the template just replace the data with some placeholder you like. Later this placeholder is found via a regular expression and replaced by your data.&amp;lt;br&amp;gt;&lt;br /&gt;
For example, you can set XYZ at the place where the first temperature should be shown and ABC for the first humidity value.&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to edit the template you can use the free software [www.inkscape.org/de/ Inkscape]. For more information about generating SVGs for fhem please refer to this article [http://www.fhemwiki.de/wiki/Icons Icons]. Most important information is to save the SVG as a &amp;quot;normal SVG&amp;quot; and not as an inkscape SVG.&amp;lt;br&amp;gt;&lt;br /&gt;
For the Kindle Paperwhite the resolution of the SVG must be 758 x 1024 for the Kindle 4 version use 600x800. This is mandatory. Wrong scaled images won&#039;t be displayed on the Kindle.&amp;lt;br&amp;gt; Copy the Kindle_Template.svg to &amp;lt;nowiki&amp;gt;/opt/fhem/www/images/&amp;lt;/nowiki&amp;gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Download and install the [http://forum.fhem.de/index.php/topic,21821.msg200310.html#msg200310 FileReplacer.pm from fhem Forums], save it to /opt/fhem/FHEM and load the module. You can also restart fhem instead.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
All we&#039;re doing now is to using the FileReplacer module to read the SVG template, replace a search pattern with our data and saving it.&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define kindledisplay FileReplacer /opt/fhem/www/images/template1.svg /opt/fhem/www/images/status1.svg 60&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay DoPNG 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay UTF8-Encode 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay room Display&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DoPNG enabled the generation from SVG to PNG. UTF8-Encode is needed to support special characters.&amp;lt;br&amp;gt;&lt;br /&gt;
Now just create your mappings:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay Regex1 XYZ &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay Expr1 sprintf(&amp;quot;%.1f&amp;quot;, ReadingsVal(&amp;quot;Sensor1&amp;quot;, &amp;quot;Temp1&amp;quot;, 0)) &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay Regex2 ABC &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay Expr2 sprintf(&amp;quot;%.1f&amp;quot;, ReadingsVal(&amp;quot;Sensor1&amp;quot;, &amp;quot;Hum1&amp;quot;, 0)) &amp;lt;/code&amp;gt;&lt;br /&gt;
And so on... :) The FileReplacer will replace the pattern XYZ with the ReadingsVal from Sensor1.&amp;lt;br&amp;gt;&lt;br /&gt;
Now check if the PNG is created [http://your-fhem-ip:8083/fhem/www/images/status1.png http://your-fhem-ip:8083/fhem/www/images/KindleDisplay.png]. If so, be happy, the first part is done!&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to change readingVals to something in your language you can try using it like this:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr kindledisplay Expr11 (ReadingsVal(&amp;quot;XY&amp;quot;, &amp;quot;Reading&amp;quot;, &amp;quot;off&amp;quot;) eq &amp;quot;on&amp;quot; ? &amp;quot;An&amp;quot; : &amp;quot;Aus&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
=== Templates ===&lt;br /&gt;
You can find my templates here: [http://forum.fhem.de/index.php?topic=21821.msg202396#msg202396 fhem Forum]. Feel free to use and modify.&lt;br /&gt;
&lt;br /&gt;
=Modifying the Kindle=&lt;br /&gt;
To prevent from error messages like &amp;quot;your Kindle is no longer registered as a test Kindle...&amp;quot; please make sure your Kindle is connected to a valid Amazon Account. &amp;lt;br&amp;gt;&lt;br /&gt;
We need to download some software to install it on the Kindle.&amp;lt;br&amp;gt;&lt;br /&gt;
Please download it from [http://www.mobileread.com/forums/showthread.php?t=88004 Mobileread Forums]&amp;lt;br&amp;gt;&lt;br /&gt;
* Kindle Jailbreak [http://www.mobileread.com/forums/showthread.php?t=88004 Mobileread Forums]&lt;br /&gt;
* MKK Mobileread Kindlet Kit [http://www.mobileread.com/forums/showthread.php?t=233932 Mobileread Forums]&lt;br /&gt;
* KUAL [http://www.mobileread.com/forums/showthread.php?t=203326 Mobileread Forums]&lt;br /&gt;
* Screensavers Hack [http://www.mobileread.com/forums/showthread.php?t=88004 Mobileread Forums]&lt;br /&gt;
* OnlineScreenSaver [http://www.mobileread.com/forums/showthread.php?t=236104 Mobileread Forums]&lt;br /&gt;
&lt;br /&gt;
* for Kindle 4 only: USBNETWORK [http://www.mobileread.com/forums/showthread.php?t=88004 also Mobileread Forums]&lt;br /&gt;
&amp;lt;br&amp;gt; Always use the newest version and look for one who fits to your Kindle (e.G. K4).&lt;br /&gt;
&lt;br /&gt;
==Jailbreaking the Kindle==&lt;br /&gt;
Don&#039;t worry. This sounds more hard and dangerous than it is in fact. It&#039;s just a few steps to have full access to your Kindle.&lt;br /&gt;
=== Kindle Touch/Paperwhite ===&lt;br /&gt;
* Download the kindle-jailbreak-0.12.N.zip file, and unpack it. In there, you&#039;ll find some .bin files, and a src directory.Leave the directory alone, and upload the correct Update_*_install.bin file for your kindle &amp;amp; FW version to the root directory of your Kindle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* Now, eject &amp;amp; unplug your Kindle, and go to [HOME] -&amp;gt; [MENU] &amp;gt; Settings -&amp;gt; [MENU] &amp;gt; Update Your Kindle. It should be quick.&amp;lt;br&amp;gt; (And, on FW 2.x only, it should FAIL (With a U006 error, in the bottom left corner of the screen). It&#039;s completely normal, intended, and harmless).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
And that&#039;s it, your Kindle is now ready to install custom hacks!&amp;lt;br&amp;gt;&lt;br /&gt;
(Quoted from http://www.mobileread.com/forums/showthread.php?t=88004)&lt;br /&gt;
&lt;br /&gt;
=== Kindle 4 / Universal method ===&lt;br /&gt;
&lt;br /&gt;
* Download and unzip the jailbreak. &lt;br /&gt;
* Plug in the Kindle and copy the data.tar.gz &amp;amp; ENABLE_DIAGS files plus the diagnostic_logs folder to the Kindle&#039;s USB drive&#039;s root&lt;br /&gt;
* Safely remove the USB cable and restart the Kindle (Menu -&amp;gt; Settings -&amp;gt; Menu -&amp;gt; Restart)&lt;br /&gt;
* Once the device restarts into diagnostics mode, select &amp;quot;D) Exit, Reboot or Disable Diags&amp;quot; (using the 5-way keypad)&lt;br /&gt;
* Select &amp;quot;R) Reboot System&amp;quot; and &amp;quot;Q) To continue&amp;quot; (following on-screen instructions, when it tells you to use &#039;FW Left&#039; to select an option, it means left on the 5-way keypad)&lt;br /&gt;
* Wait about 20 seconds: you should see the Jailbreak screen for a while, and the device should then restart normally&lt;br /&gt;
* After the Kindle restarts, you should see a new book titled &amp;quot;You are Jailbroken&amp;quot;, if you see this, the jailbreak has been successful.&lt;br /&gt;
&lt;br /&gt;
==Installing additional software==&lt;br /&gt;
&lt;br /&gt;
=== MKK ===&lt;br /&gt;
The Mobileread Kindlet Kit (MKK) is used to execute custom Kindlets (programs) on the Kindle.&amp;lt;br&amp;gt;&lt;br /&gt;
Download the software from here: [http://www.mobileread.com/forums/showthread.php?t=233932 MKK]&amp;lt;br&amp;gt;&lt;br /&gt;
Unzip the folder and copy the .bin file to the root directory of your kindle. Please note that you need to install the Kindle matching version (e.g. K4 = Kindle 4 with 5-way-button).&amp;lt;br&amp;gt;&lt;br /&gt;
On the Kindle goto Menu -&amp;gt; Settings -&amp;gt; Menu -&amp;gt; Update your Kindle.&amp;lt;br&amp;gt;&lt;br /&gt;
After the update it is installed.&lt;br /&gt;
&lt;br /&gt;
=== KUAL ===&lt;br /&gt;
The Kindle Unified Application Launcher (KUAL) running applications on the Kindle.&amp;lt;br&amp;gt;&lt;br /&gt;
Download it from here: [http://www.mobileread.com/forums/showthread.php?t=203326 KUAL]&amp;lt;br&amp;gt;&lt;br /&gt;
Unzip the folder and copy the matching .azw2 file to the documents directory of your kindle.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
(K2, DX, K3, K4)&amp;lt;br&amp;gt;&lt;br /&gt;
Put KUAL-KDK-1.0.azw2 in documents folder.&amp;lt;br&amp;gt;&lt;br /&gt;
Run it by clicking new kindlet (book) document in your list.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
(Touch, PaperWhite)&amp;lt;br&amp;gt;&lt;br /&gt;
Put KUAL-KDK-2.0.azw2 in documents folder.&amp;lt;br&amp;gt;&lt;br /&gt;
Run it by clicking icon.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Backdoorlock ===&lt;br /&gt;
This is used to prevent from getting automated updates which could remove the JailBreak.&amp;lt;br&amp;gt;&lt;br /&gt;
Download from here: [http://www.mobileread.com/forums/showthread.php?t=205666 Backdoorlock]&amp;lt;br&amp;gt;&lt;br /&gt;
Unzip the folder and copy the .bin file to the root directory of your kindle. Please note that you need to install the Kindle matching version (e.g. K4 = Kindle 4 with 5-way-button).&lt;br /&gt;
On the Kindle goto Menu -&amp;gt; Settings -&amp;gt; Menu -&amp;gt; Update your Kindle.&lt;br /&gt;
After the update it is installed.&lt;br /&gt;
&lt;br /&gt;
=== ScreenSavers Hack ===&lt;br /&gt;
The ScreenSavers Hack let you show custom screen savers on the kindle.&amp;lt;br&amp;gt;&lt;br /&gt;
Download the file: [http://www.mobileread.com/forums/showthread.php?t=88004 ScreenSaver Hack]&amp;lt;br&amp;gt;&lt;br /&gt;
Install the corresponding .bin file as the others before and use the &amp;quot;update your kindle&amp;quot; function to install it.&amp;lt;br&amp;gt;&lt;br /&gt;
After the installation you will find a directory called &amp;quot;linkss&amp;quot; in the Kindle root. Here open the screensavers dir and delete all images.&lt;br /&gt;
&lt;br /&gt;
=== Online ScreeSaver ===&lt;br /&gt;
This application copies the fhem-PNG from your fhem-server to the ScreenSavers hack.&lt;br /&gt;
Just download the application from [http://www.mobileread.com/forums/showthread.php?t=236104 here], extract the file and copy the folder into the extensions directory. &amp;lt;br&amp;gt;&lt;br /&gt;
Now you have to edit the config.sh file up to your need.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039; Use a linux/unix compatible editor (like notepad++) only!&amp;lt;br&amp;gt;&lt;br /&gt;
You need to enter the image URL, the update interval and the schedule for the updates. That&#039;s all.&lt;br /&gt;
&lt;br /&gt;
==== Online Screen Saver - Kindle 4 Special Tasks ====&lt;br /&gt;
To get it running on a Kindle 4 you need to change some lines in the OnlineScreenSaver files.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find a .diff file for the changes here: [http://forum.fhem.de/index.php/topic,21821.msg190911.html#msg190911 fhem forum]&amp;lt;br&amp;gt;&lt;br /&gt;
No idea what to do with this file? It just shows you in which lines changes were made and what was changed. I recommend to edit all the files shown in the diff-file locally and then copy the whole package to the kindle first.&lt;br /&gt;
&lt;br /&gt;
==Kindle 4 additional tasks==&lt;br /&gt;
As your Kindle 4 needs some more attention to get it done, please find the steps here:&lt;br /&gt;
&lt;br /&gt;
=== USB Network Hack ===&lt;br /&gt;
This hack is used to get SSH/Telnet Access to your Kindle. We need this on Kindle 4 to change some settings on the system.&amp;lt;br&amp;gt;&lt;br /&gt;
Download and install the kindle-usbnetwork file from here: [http://www.mobileread.com/forums/showthread.php?t=88004 USBNETWORK]&amp;lt;br&amp;gt;&lt;br /&gt;
I&#039;m sure you know what to do in the meantime ;-)&amp;lt;br&amp;gt;&lt;br /&gt;
After that, activate the USBNetwork via KUAL and connect the Kindle via USB.&lt;br /&gt;
&lt;br /&gt;
=== Connecting to the Kindle ===&lt;br /&gt;
Before you can connect you need to install the RNDIS driver. [https://github.com/ev3dev/ev3dev/wiki/Setting-Up-Windows-USB-Ethernet-Networking Here you can find] a very good &amp;quot;HowTo&amp;quot; to do this. Note that the IP-Addresses you need to configure are different then addresses used in the example. Your RNDIS Interface needs to have 192.168.15.201 configured, the Kindle uses 192.168.15.244 on this interface.&amp;lt;br&amp;gt;&lt;br /&gt;
Don&#039;t wonder you cannot ping the Kindle!&amp;lt;br&amp;gt;&lt;br /&gt;
Now you can use a ssh-client like putty to connect to the Kindle. Telnet is also an option but only when WiFI mode is disabled. So better forget about it. Success? Great job!&lt;br /&gt;
=== Changing the &amp;quot;sleep settings&amp;quot; ===&lt;br /&gt;
After you connected to the Kindle you will be asked for a password. Login with root and blank password. Should work.&amp;lt;br&amp;gt;&lt;br /&gt;
Now we need to make the filesystem writeable:&lt;br /&gt;
:&amp;lt;code&amp;gt;mntroot rw&amp;lt;/code&amp;gt;&lt;br /&gt;
Changing the root password:&lt;br /&gt;
:&amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt;&lt;br /&gt;
Changing the timeouts:&lt;br /&gt;
:&amp;lt;code&amp;gt;cd /etc/kdb.src/yoshi/system/daemon/powerd/&amp;lt;/code&amp;gt;&lt;br /&gt;
Edit the t1_timeout with the editor &amp;quot;vi&amp;quot; and change the last line to 200.&amp;lt;br&amp;gt;&lt;br /&gt;
Same for the t2_timeout but here we enter 200000 in the last line. &amp;lt;br&amp;gt;&lt;br /&gt;
These values are setting the &amp;quot;sleep&amp;quot; counters on the Kindle. Unfortunately this will lower the battery faster then normal so I recommend to have the display in a docking station.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cron setting (optional) ===&lt;br /&gt;
In my case that all didn&#039;t really work for me so i decided to run the onlinescreensaver update script via cron:&lt;br /&gt;
:&amp;lt;code&amp;gt;vi /etc/crontab/root&amp;lt;/code&amp;gt;&lt;br /&gt;
Add the following line at the bottom. */5 means every 5 minutes.&lt;br /&gt;
:&amp;lt;code&amp;gt;*/5 * * * * /mnt/us/extensions/onlinescreensaver/bin/update.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;/etc/init.d/cron restart&amp;lt;/code&amp;gt;&lt;br /&gt;
Setting back filesystem in read-only mode&lt;br /&gt;
:&amp;lt;code&amp;gt;mntroot ro&amp;lt;/code&amp;gt;&lt;br /&gt;
That&#039;s it for me. Not working? Ask and look here for help: [http://forum.fhem.de/index.php/topic,21821.0.html FHEM Forum]&lt;br /&gt;
&lt;br /&gt;
=Examples and Pictures=&lt;br /&gt;
[[Datei:KindleDisplay.jpg|200px]] Kindle Display Example on Kindle 4&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Squeezebox&amp;diff=7158</id>
		<title>Squeezebox</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Squeezebox&amp;diff=7158"/>
		<updated>2014-08-07T12:12:35Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Added Link to Forum&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um eine Logitech Squeezebox (ein Netzwerk-Musikplayer) fernzusteuern muss diese mit einem Logitech Media Server verbunden sein. (Weitere Informationen wie man die Squeezebox mit einem Server verbindet findet man auf [http://www.mysqueezebox.com/download MySqueezeBox.de].)&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Seit 12/2013 gibt es ein Modul zur Steuerung von Squeezeboxes (98_SB_PLAYER). Bitte im [http://forum.fhem.de/index.php/topic,17667 Forum] den aktuellen Stand prüfen.&amp;lt;br&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Getestet wurde das folgende auf einer FB7390 mit FHEM [[AVM Fritz!Box]].&lt;br /&gt;
&lt;br /&gt;
Einfach in ein Utils Skript ([[99 myUtils anlegen]]) folgende Funktion einfügen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sub squeezebox($) {&lt;br /&gt;
 my ($state) = @_;&lt;br /&gt;
 if ($state eq &amp;amp;quot;on&amp;amp;quot;)&lt;br /&gt;
 {&lt;br /&gt;
  system(&amp;amp;quot;wget -O /dev/null -q http://[SqueezeboxServerIP]:[SqueezeboxServerPort]/status.html?p0=play&amp;amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
  system(&amp;amp;quot;wget -O /dev/null -q http://[SqueezeboxServerIP]:[SqueezeboxServerPort]/status.html?p0=power&amp;amp;amp;p1=0&amp;amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ein Aufruf erfolgt mit &amp;lt;code&amp;gt;{ squeezebox(&amp;quot;on&amp;quot;) }&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;{ squeezebox(&amp;quot;off&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Hinweise =&lt;br /&gt;
* In dem Skript muss die IP sowie der Port ersetzt werden. Der Standardport ist 9000.&lt;br /&gt;
* Es gibt noch weitere Befehle um die Squeezebox zu steuern (Lautstärke erhöhen, Pause, Stop,...)&lt;br /&gt;
** Lautstärke setzen: &amp;lt;code&amp;gt;http://[SqueezeboxServerIP]:[SqueezeboxServerPort]/status.html?p0=mixer&amp;amp;amp;p1=volume&amp;amp;amp;p2=YY&amp;lt;/code&amp;gt;, wobei YY die Lautstärke auf einer Skala von 0-100 ist.&lt;br /&gt;
* Falls mehrere Squeezeboxen mit dem Server verbunden sind, kann mittels Parameter &amp;lt;code&amp;gt;&amp;amp;amp;player=XX%3AXX%3AXX%3AXX%3AXX%3AXX&amp;lt;/code&amp;gt; eine spezielle verwendet werden. XX= MAC-Adresse der Squeezebox. &lt;br /&gt;
* Mehr Befehle können aus den Links der Statusseite ausgelesen werden: &amp;lt;code&amp;gt;http://[SqueezeboxServerIP]:[SqueezeboxServerPort]/status.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Quelle =&lt;br /&gt;
Grundlagen in folgendem Beitrag entdeckt: [http://www.squeezebox-forum.de/viewtopic.php?f=13&amp;amp;amp;t=1521#p12286 [1]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Apache_Authentication_Proxy&amp;diff=6664</id>
		<title>Apache Authentication Proxy</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Apache_Authentication_Proxy&amp;diff=6664"/>
		<updated>2014-06-26T23:35:52Z</updated>

		<summary type="html">&lt;p&gt;SirUli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um den Zugriff auf FHEMWEB etwas sicherer zu machen, kann man den Webzugriff über einen Apachen laufen lassen. Dies ist ein kurzes Rezept, um Zugriffe auf FHEMWEB über einen Apachen authentifizieren zu lassen. Erstellt wurde es auf Debian Squeeze, sollte aber auch mit Ubuntu funktionieren.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install apache2 libapache2-mod-proxy-html&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Step 1) FHEMWEB sollte nur noch auf dem Loopback lauschen, also kein &#039;global&#039; Attribut in der Definition in fhem.cfg&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define WEBS FHEMWEB 8084&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Step 2) die folgenden Apache2 Module müssen aktiviert sein: mod_proxy + mod_proxy_http&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Step 3) neue Datei /etc/apache2/conf.d/fhem:&lt;br /&gt;
&lt;br /&gt;
Diese Konfiguration sorgt dafür, dass alle Anfragen unter /fhem weiter nach [http://localhost/fhem http://localhost/fhem] geleitet werden. Zusätzlich wird eine Basic-Authentifizierung eingeschaltet. Die Benutzerdatenbank ist dann in /etc/fhem-htpasswd zu finden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;amp;lt;Location /fhem&amp;amp;gt;&lt;br /&gt;
  # ProxyPass/ProxyPassReverse leitet HTTP requests auf eine andere URL um&lt;br /&gt;
  ProxyPass http://localhost:8084/fhem&lt;br /&gt;
  ProxyPassReverse http://localhost:8084/fhem&lt;br /&gt;
  # ProxyHTMLURLMap passt Links im HTML/JavaScript Source an&lt;br /&gt;
  ProxyHTMLURLMap /        /fhem/&lt;br /&gt;
  ProxyHTMLURLMap /fhem/     /fhem/&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthName &amp;amp;quot;Password Required&amp;amp;quot;&lt;br /&gt;
  AuthUserFile /etc/fhem-htpasswd&lt;br /&gt;
  Require valid-user&lt;br /&gt;
  Order deny,allow&lt;br /&gt;
  Allow from all&lt;br /&gt;
&amp;amp;lt;/Location&amp;amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Step 4) Benutzer-Datenbank in /etc/fhem-htpasswd anlegen&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# -c -&amp;amp;gt; create file&lt;br /&gt;
# -s SHA encryption&lt;br /&gt;
htpasswd -c -s /etc/fhem-htpasswd &amp;amp;lt;username&amp;amp;gt;&lt;br /&gt;
# add more users with&lt;br /&gt;
htpasswd -s /etc/fhem-htpasswd &amp;amp;lt;username&amp;amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Step 5) Apache neu starten&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;invoke-rc.d apache2 reload&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fertig. FHEM ist jetzt über [http://server/fhem http://server/fhem] erreichbar. Alle Zugriffe müssen aber erst mit Benutzername + Passwort freigeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Falls nach dem Neustart des Apache folgende Fehlermeldung kommt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Invalid command &#039;ProxyHTMLURLMap&#039;, perhaps misspelled or defined by a module not included in the server configuration&lt;br /&gt;
Action &#039;configtest&#039; failed.&lt;br /&gt;
The Apache error log may have more information.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fehlt das Paket libapache2-mod-proxy-html. Einfach mit &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install libapache2-mod-proxy-html&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
&lt;br /&gt;
nachinstallieren.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MAX!CubeMigrationToFHEM&amp;diff=6572</id>
		<title>MAX!CubeMigrationToFHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MAX!CubeMigrationToFHEM&amp;diff=6572"/>
		<updated>2014-06-15T16:57:37Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Executed the tutorial and found a few smaller mistakes until now.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== WORK IN PROGRESS / NOT FINISHED: HowTo Migrate from MAX!Cube to fhem ==&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; This pages describes the steps required to migrate a house installation from MAX!Cube solution (using a Cube and MAX! Software from ELV/EQ-3) to fhem on a Raspberry Pi combined with a CUL. The benefit of such a migration is to gain better logfiles, to get graphs (Desired vs. Actual temperature and Valve position) and more reliable software.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Initial situation ===&lt;br /&gt;
The appartment has 125 sqm and five rooms (child 1, child 2, livingroom, bedroom, working room), one bathroom, a kitchen and a toilette. Each room has one heater below the window, the living room has two heaters. Two rooms require multiple window shutter contacts: bedroom and living room due to the amount of windows. MAX!Cube software is running since a year controlling all heaters, all windows and in combination with one wall thermostat in the living room and one ECO-switch at the main door to bring the full house to ECO mode when leaving.&lt;br /&gt;
&lt;br /&gt;
=== Desired situation ===&lt;br /&gt;
MAX!Cube software was unstable and the update to v1.3.10 triggered the decision to move to a new setup: keep the MAX system, but control it via fhem. Have the ability to add more sensors, more actors from other brands than MAX (looking for Homematic due to the amount of different sensors and 1-Wire to avoid the unreliable radio transmission). Have the ability to better see what the system is doing (logfiles) and graph it out (diagrams for each room). Get some more flexibility for home-cinema setup, for light controls, etc. Increase the &#039;&#039;WAF&#039;&#039; (Women&#039;s Acceptance Factor) for the wife who was complaining about the MAX!Cube solution.&lt;br /&gt;
&lt;br /&gt;
=== Procurement list ===&lt;br /&gt;
While it is possible to use the existing MAX Cube with fhem certain features would not be available. Therefore I decided to go with a Rasperry Pi and a CUL. Here is the shopping list:&lt;br /&gt;
&lt;br /&gt;
# Rasperry Pi from G3 with cooling kit for enhanced reliability ([http://www.amazon.de/pi3g-Raspberry-Betriebssystem-Coolkit-installiert/dp/B00CB1C96E])&lt;br /&gt;
# 32 GB SDHX Card Class 10 from SANDisk&lt;br /&gt;
# CC1101-USB-Lite 868MHz ([http://shop.busware.de/product_info.php/cPath/1/products_id/29]) with 36cm antenna (+8dBi) for MAX protocol&lt;br /&gt;
# 8 Channel 1-Wire Daughterboard without RTC with some sensors for testing ([http://www.sheepwalkelectronics.co.uk/product_info.php?cPath=22&amp;amp;products_id=33])&lt;br /&gt;
&lt;br /&gt;
(Note: The 1-Wire board has not yet arrived and may not fit into the supplied case - but I am too lazy to attach the cooling modules myself).&lt;br /&gt;
&lt;br /&gt;
=== Installation of Raspberry Pi ===&lt;br /&gt;
Please follow one of the many documentations how to install Linux on your Raspberry Pi - a good starting point would be [http://www.raspberrypi.org/downloads]. I tried to install Raspbian using the advanced method of copying the image directly to the SD-card but it did not worked out well as many perl/python-modules were missing, had to be identified and installed to use fhem.&lt;br /&gt;
&lt;br /&gt;
For my second approach I used the provided image from busware.de, which also includes drivers for their COC daughter board. Available for download here [http://files.busware.de/RPi/README.kernel]. Unfortunately this has a slightly outdated fhem installation, but works for all other parts. Please note that there is no HDMI output enabled during the first boot. Just use &amp;lt;code&amp;gt;ssh pi@fhem&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ssh pi@&amp;lt;IP-address&amp;gt;&amp;lt;/code&amp;gt; to login and use raspi-config for initial setup of passwords, timezone and disk size. Do not forget to install an ntp-client using &amp;lt;code&amp;gt;apt-get install ntp-client&amp;lt;/code&amp;gt;, an editor of your choice (I selected vim &amp;lt;code&amp;gt;apt-get install vim&amp;lt;/code&amp;gt;) and edit &amp;lt;code&amp;gt;/etc/ntp.conf&amp;lt;/code&amp;gt; to adjust ntpservers and select a country-pool (see [http://www.pool.ntp.org/zone/europe]).&lt;br /&gt;
&lt;br /&gt;
==== Upgrade of fhem ====&lt;br /&gt;
Once the initial setup is completed reboot your Raspberry and login into fhem using your web browser at &amp;lt;code&amp;gt;&amp;lt;IP-address&amp;gt;:8083&amp;lt;/code&amp;gt;. Enter the &amp;lt;code&amp;gt;upgrade&amp;lt;/code&amp;gt; command to upgrade your fhem-installation to the latest revision. Use &amp;lt;code&amp;gt;shutdown restart&amp;lt;/code&amp;gt; to start the new code version.&lt;br /&gt;
&lt;br /&gt;
==== CUL firmware flashing ====&lt;br /&gt;
Login using ssh and become root using &amp;lt;code&amp;gt;su -&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sudo -i&amp;lt;/code&amp;gt; to flash the empty CUL. This only works as root from the directory &amp;lt;code&amp;gt;/opt/fhem&amp;lt;/code&amp;gt; using the command string&lt;br /&gt;
&lt;br /&gt;
 dfu-programmer atmega32u4 erase &amp;amp;&amp;amp; dfu-programmer atmega32u4 flash ./FHEM/CUL_V3.hex &amp;amp;&amp;amp; dfu-programmer atmega32u4 start&lt;br /&gt;
&lt;br /&gt;
If the application dfu-programmer is not installed, install using &amp;lt;code&amp;gt;apt-get install dfu-programmer&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Migration Preparation ===&lt;br /&gt;
ADD ME&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
If you have not done it before now it&#039;s a good start to document your existing MAX!Cube solution. Room for room write each device, the MAX address, location and intended profile into an Excel file. It could look like&lt;br /&gt;
&lt;br /&gt;
 Roomname DeviceName DeviceAddress Location WeekDayProfile WeekendProfile Dependencies&lt;br /&gt;
&lt;br /&gt;
where WeekDayProfile and WeekendProfile only make sense for actors like Heaters within the MAX-solution. Dependencies can indicate Window Contacts to Heater actors or Wall Thermostat to Heater actors. Document as well your current heating profile configuration with MAX!Cube.&lt;br /&gt;
&lt;br /&gt;
Make a backup.&lt;br /&gt;
&lt;br /&gt;
==== Selecting the right time of the year ====&lt;br /&gt;
ADD ME&lt;br /&gt;
==== What do you want to archive ====&lt;br /&gt;
ADD ME&lt;br /&gt;
=== Migration Execution ===&lt;br /&gt;
ADD ME&lt;br /&gt;
==== MAX!Cube Configuration ====&lt;br /&gt;
ADD ME&lt;br /&gt;
==== fhem Configuration ====&lt;br /&gt;
===== CUL Setup =====&lt;br /&gt;
First step to setup fhem is to define the protocol and adaptor fhem should use. You need one CUL for each protocol (e.g. FS20, Homematic and MAX) as the CUL can listen to the same frequency, but does not understand multiple protocols. The &amp;lt;fhem.cfg&amp;gt; comes pre-installed with some default configuration. At the end add&lt;br /&gt;
&lt;br /&gt;
 #### CUL Definition, MAX!Cube&lt;br /&gt;
 define CUL0 CUL /dev/ttyACM0@9600 1234&lt;br /&gt;
 attr CUL0 rfmode MAX&lt;br /&gt;
 define cm CUL_MAX 123456&lt;br /&gt;
&lt;br /&gt;
and save fhem.cfg. After a reload fhem will start to &#039;&#039;listen&#039;&#039; to MAX-commands sent by your still active MAX-Cube.&lt;br /&gt;
&lt;br /&gt;
===== Find MAX devices =====&lt;br /&gt;
As each MAX device communicates with the MAX!Cube over the time of two-three days, fhem will detect in use MAX-devices like Heaters, Thermostats and WindowsContacts (but not the ECO wall switch) and create alias definitions within the fhem.cfg file. To get all devices including addresses in use let fhem listen for a two-three days while the MAX!Cube is still in use and working.&lt;br /&gt;
&lt;br /&gt;
===== Identify MAX devices =====&lt;br /&gt;
Login into MAX!Cube using one browser window (or tab) and into fhem using a second browser window (or tab). For each room change the temperature within the MAX!Software to an unsual value (like 27.5), change to the fhem window and identify the change in fhem. This allows you to detect one heater actor by the other.&lt;br /&gt;
&lt;br /&gt;
To identify the Window Contacts just open one window, swap to fhem and see which contact reports an &#039;&#039;Open&#039;&#039; status.&lt;br /&gt;
&lt;br /&gt;
===== Define alias names =====&lt;br /&gt;
Open a third browser window (or tab), login to fhem webpage and select Edit Files, fhem.cfg. You can now add the alias by adding lines like&lt;br /&gt;
&lt;br /&gt;
 define MAX_Bathroom_Heating MAX HeatingThermostat 05615b&lt;br /&gt;
 define MAX_Bathroom_WindowSensor MAX ShutterContact 053767&lt;br /&gt;
&lt;br /&gt;
room by room, one by one. Just identify the fhem-name in the &amp;quot;MAX&amp;quot;-room in fhem and adjust the address (last hex-number in the line).&lt;br /&gt;
&lt;br /&gt;
If you already have meaningfull names in the MAX-Software you can try to use the code from this [http://forum.fhem.de/index.php/topic,19473.msg131095.html#msg131095 forum post] to automaticaly use these as the alias names for all MAX devices.&lt;br /&gt;
&lt;br /&gt;
===== Assigning a room name =====&lt;br /&gt;
For better structure create and assign devices of one physical room into one room within fhem. Rooms are managed by the &#039;&#039;attribute&#039;&#039; room for a specific device. Each defined devices require one or more room attributes:&lt;br /&gt;
&lt;br /&gt;
 attr MAX_Bedroom_Heating room Bedroom&lt;br /&gt;
&lt;br /&gt;
===== Understanding the setup =====&lt;br /&gt;
The rooms are still controlled from the MAX!Cube and MAX-software. fhem only listens and has useable names. fhem does not communicate with the devices and it cannot configure devices. However you have useable and human-understandable names instead of hex-codes.&lt;br /&gt;
&lt;br /&gt;
===== Migration =====&lt;br /&gt;
As MAX!Cube will interfere with CUL (both sending the same protocol on the same frequency) and due to the sending restrictions (1%-rule) we need to&lt;br /&gt;
&lt;br /&gt;
# Remove all rooms in MAX!Cube (which deletes the devices in MAX!Cube)&lt;br /&gt;
# Reset all heaters and window contacts to factory settings&lt;br /&gt;
# Pair the device to fhem&lt;br /&gt;
# Define the week heating program&lt;br /&gt;
# Define the connectivity between heater and window sensors&lt;br /&gt;
&lt;br /&gt;
Make a backup of your MAX!Cube configuration in case something goes seriously wrong. Have the family out of the house for 1-2 days while you run around to re-pair devices. While resetting the devices the PI-learned heating curves will be lost and the heaters need to adopt again to your house-specific heating curves.&lt;br /&gt;
&lt;br /&gt;
===== Re-setting devices =====&lt;br /&gt;
Remove batteries and wait 45 seconds. For&lt;br /&gt;
&lt;br /&gt;
# Heater actors: Press all three buttons at the same time, insert battery until &amp;lt;code&amp;gt;reS&amp;lt;/code&amp;gt; is displayed. Press Boost for installation menu&lt;br /&gt;
# Window contacts: Press button while inserting battery and keep pressed until LED is flashing again&lt;br /&gt;
# ECO-Wallcontact: Press Eco or AUTO button while inserting battery and keep pressed until LED is flashing again&lt;br /&gt;
# Wallthermostats: Press &amp;quot;Moon&amp;quot;, &amp;quot;OK&amp;quot; and &amp;quot;-&amp;quot; at the same time, then insert the battery [http://www.elv.de/controller.aspx?cid=824&amp;amp;detail=10&amp;amp;detail2=3537]&lt;br /&gt;
&lt;br /&gt;
===== Pairing devices with fhem =====&lt;br /&gt;
Enter&lt;br /&gt;
&lt;br /&gt;
 set cm pairmode 45&lt;br /&gt;
&lt;br /&gt;
into the command field on top of the fhem page to configure the CUL into pairing mode for 45 seconds. Initiate the pair sequence on the device by:&lt;br /&gt;
&lt;br /&gt;
# Heater actors: Pressing Boost for about 3 seconds until &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; is displayed. The pairing succeeded when the timer is gone.&lt;br /&gt;
# Window contacts: Press button, LED starts flashing. Success is reported by one last long LED signal.&lt;br /&gt;
# ECO-Wallcontact: Press one button three seconds, LED starts flashing. Success is reported by one last long LED signal&lt;br /&gt;
# Wallthermostat: First click several times &amp;quot;OK&amp;quot; to set a random date and time until you see the temperature again. Then press OK button three seconds until &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; is displayed. The pairing succeeded when the timer is gone.&lt;br /&gt;
&lt;br /&gt;
==== fhem One-Time Device-specific configuration ====&lt;br /&gt;
Certain information about fhem are stored in the fhem.cfg which you can edit using a text editor and ssh or using the webfront. A big other, device-specific part is entered as part of commands into the webfrontend, but not documented and not stored within fhem.cfg. You will end up in a documented, structure information stored in fhem.cfg (like any other UNIX related configuration file in /etc) and a un-documented part which is stored within the devices of your appartment only.&lt;br /&gt;
&lt;br /&gt;
My solution for this was to add the relevant commands into fhem.cfg as &#039;&#039;comments&#039;&#039;, so after a multiple month pause on playing with fhem I do still see which commands belonged into which room and what I have done. However if you follow this route is important to understand that changes to these &#039;&#039;comments&#039;&#039; will never take place and change your configuration unless you copy and paste them into the command-field and execute your change.&lt;br /&gt;
&lt;br /&gt;
The information stored in devices and not in fhem.cfg are&lt;br /&gt;
&lt;br /&gt;
# Heating weekProfiles - which temperature you want when&lt;br /&gt;
# Associations between WindowContacts and Heaters to detect open windows.&lt;br /&gt;
&lt;br /&gt;
Within the fhem forums you find a longer discussion if windows sensors really make sense. The statement there is as the heaters have a decreasing temperature sensor they are not. It is hard for me to follow this argumentation as:&lt;br /&gt;
&lt;br /&gt;
# The heating water temperature will be impacted when it keep running while windows is open&lt;br /&gt;
# The WAF (Women&#039;s Acceptance Factor) is lowered as the house should be smart&lt;br /&gt;
# You may wish to have open windows longer than 10-15 minutes&lt;br /&gt;
# I can document the time of getting fresh air into the rooms (for any discussions with the landlord in a rented appartment)&lt;br /&gt;
&lt;br /&gt;
===== Window Contacts and Heaters =====&lt;br /&gt;
To connect a window contact with a heater to decrease the temperature they need to be &#039;&#039;associated&#039;&#039; to each other:&lt;br /&gt;
&lt;br /&gt;
 set MAX_Bedroom_WindowSensor1 associate MAX_Bedroom_Heating&lt;br /&gt;
 set MAX_Bedroom_Heating associate MAX_Bedroom_WindowSensor1&lt;br /&gt;
&lt;br /&gt;
As you can see the associations is called twice for both directions and you need to call both commands for each Window Contact in the room. fhem will ask you in the logfile for each command to press the MAX Window Contact button when you open the Window Contact. If you have (against advice) already configured the graphing you need to disable the graphing to get the command being transmitted.&lt;br /&gt;
&lt;br /&gt;
===== Open Window Temperature =====&lt;br /&gt;
Configure the desired Open Window temperature for that room using&lt;br /&gt;
&lt;br /&gt;
 set MAX_Bedroom_Heating windowOpenTemperature 5.5&lt;br /&gt;
&lt;br /&gt;
You may have to wait a couple of minutes until the command has been transmitted.&lt;br /&gt;
&lt;br /&gt;
Test your room by opening each Window with a Window Contact, the heater should immediately change temperature in both directions.&lt;br /&gt;
&lt;br /&gt;
===== The Heating Profile =====&lt;br /&gt;
Device-specific configuration also includes the weekProfile, e.g. the desired temperature for each day and each hour. The format is quite simple and starts with an implicit 00:00 (midnight) and ends with an implicit 24:00 (midnight next day). In between desired temperatures are specificed interleaving with hours, seperated by &#039;&#039;&#039;,&#039;&#039;&#039;s. Temperature is specific in degrees celsius. Example:&lt;br /&gt;
&lt;br /&gt;
 17,06:00,21,20:00,17&lt;br /&gt;
&lt;br /&gt;
will set 17 degrees from midnight to 06:00am, 21 degrees 06:00am to 20:00 (8:00pm) and then again 17 degrees until midnight. Such profiles are defined for each day (Mon, Tue, Wed, Thu, Fri, Sat, Sun) and set with the weekProfile command:&lt;br /&gt;
&lt;br /&gt;
 set MAX_Child1_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Wed 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Sat 17,06:00,21,20:00,17 Sun 17,06:00,21,20:00,17&lt;br /&gt;
&lt;br /&gt;
Do not attempt to break this line into multiple lines for better reading. Just one single long line. Transmission may take a couple of minutes.&lt;br /&gt;
&lt;br /&gt;
==== Testing and Verifying ====&lt;br /&gt;
ADD ME&lt;br /&gt;
&lt;br /&gt;
=== Add-Ons ===&lt;br /&gt;
ADD ME&lt;br /&gt;
==== Graphs using 99_UtilsMaxScan.pm ====&lt;br /&gt;
There is a Wiki-articel how to use the [http://www.fhemwiki.de/wiki/MAX!_Temperatur-Scanner] MAX-Temperature-Scanner with fhem. At the time of writing this article v1.05a has been published.&lt;br /&gt;
&lt;br /&gt;
Few people have published changes to this version within the forum, which enables the use of ECO wall button and multiple WindowShutter contacts.&lt;br /&gt;
&lt;br /&gt;
If you consider to create graphs for your installation your migration (as outlined above) should &#039;&#039;&#039;work stable&#039;&#039;, e.g.&lt;br /&gt;
&lt;br /&gt;
# week programs for all rooms are active and working&lt;br /&gt;
# open windows are detected and the desired temperature is decreased&lt;br /&gt;
# you do not face any logfile entries like: &amp;lt;code&amp;gt;CUL_MAX_SendQueueHandler: Not enough credit! credit10ms is 101, but we need 110. Waiting 9 seconds.&amp;lt;/code&amp;gt;&lt;br /&gt;
# you do not face any logfile entries like: &amp;lt;code&amp;gt;CUL_MAX_SendQueueHandler: Missing ack from 020341 for 0f010403123456020341000e18003655&amp;lt;/code&amp;gt;&lt;br /&gt;
# you do not plan any changes to week programs any time soon.&lt;br /&gt;
&lt;br /&gt;
Do not &#039;&#039;&#039;even think&#039;&#039;&#039; about starting to graph out heaters and rooms while migration is still in progress.&lt;br /&gt;
&lt;br /&gt;
Do download the Scanner Module you need to register and login into the forum. The Scanner Module is attached to the post linked at [http://www.fhemwiki.de/wiki/MAX!_Temperatur-Scanner]. Copy this file to &amp;lt;code&amp;gt;/opt/fhem/FHEM&amp;lt;/code&amp;gt; and change ownership to fhem.&lt;br /&gt;
&lt;br /&gt;
(Original Articles: [http://forum.fhem.de/index.php/topic,11624.msg114140.html#msg114140] und [http://forum.fhem.de/index.php/topic,11624.msg119519.html#msg119519])&lt;br /&gt;
&lt;br /&gt;
==== ECO-Wallswitch ====&lt;br /&gt;
According to an extensive Google search it is currently not possible to group all Heater actors and send a single command to the group to save communication credits.&lt;br /&gt;
&lt;br /&gt;
A workaround is to define a fhem &#039;&#039;structure&#039;&#039; which includes all Heaters, assign it to a new room labelled &amp;quot;House&amp;quot; and add a web control button to fhem:&lt;br /&gt;
&lt;br /&gt;
 # Define House to control all Heaters at once&lt;br /&gt;
 define AllHeaters structure MAX_Child2_Heating MAX_Workingroom_Heating MAX_Child1_Heating MAX_Livingroom_THSensor MAX_Bedroom_Heating MAX_Toilette_Heating MAX_Kitchen_Heating MAX_Bathroom_Heating&lt;br /&gt;
 attr AllHeaters room House&lt;br /&gt;
 attr AllHeaters webCmd desiredTemperature&lt;br /&gt;
&lt;br /&gt;
The ECO Wall button has a type PushButton and is easily defined using (you have to update the address of course):&lt;br /&gt;
&lt;br /&gt;
 ### 9.1 ECO-Wallbutton&lt;br /&gt;
 define MAX_WallButton MAX PushButton 0521c4&lt;br /&gt;
&lt;br /&gt;
To set all heaters into ECO mode until the AUTO mode is pressed on the button or the AUTO mode is called from the webpage use:&lt;br /&gt;
&lt;br /&gt;
  define MAX_HouseECOHeating notify MAX_WallButton:(onoff).* { if (&amp;quot;%EVTPART1&amp;quot; eq &amp;quot;0&amp;quot;) { Log(3,&amp;quot;Setting ECO-Mode&amp;quot;) &amp;amp;&amp;amp; fhem(&amp;quot;set AllHeaters desiredTemperature eco&amp;quot;);;} else { Log(3,&amp;quot;Setting AUTO-Mode&amp;quot;) &amp;amp;&amp;amp; fhem(&amp;quot;set AllHeaters desiredTemperature auto&amp;quot;);;}} &lt;br /&gt;
&lt;br /&gt;
(Original discussion: [http://forum.fhem.de/index.php/topic,17128.msg112191.html#msg112191])&lt;br /&gt;
&lt;br /&gt;
=== Full fhem.cfg file (all rooms) ===&lt;br /&gt;
This is the full example of all discussed settings for the specific outlined room. If you want to adopt this setup you need to replace all MAX addresses with the addresses of your devices.&lt;br /&gt;
&lt;br /&gt;
 attr global autoload_undefined_devices 1&lt;br /&gt;
 attr global logfile ./log/fhem-%Y-%m.log&lt;br /&gt;
 attr global modpath .&lt;br /&gt;
 attr global motd Remember to set passwords&lt;br /&gt;
 attr global statefile ./log/fhem.save&lt;br /&gt;
 attr global userattr MAX_Child2_Heating MAX_Child2_Heating_map devStateIcon devStateStyle icon sortby webCmd&lt;br /&gt;
 attr global verbose 3&lt;br /&gt;
 &lt;br /&gt;
 #### Telnet&lt;br /&gt;
 define telnetPort telnet 7072 global&lt;br /&gt;
 &lt;br /&gt;
 #### Screen setup&lt;br /&gt;
 define WEB FHEMWEB 8083 global&lt;br /&gt;
 attr WEB stylesheetPrefix dark&lt;br /&gt;
 &lt;br /&gt;
 define WEBphone FHEMWEB 8084 global&lt;br /&gt;
 attr WEBphone stylesheetPrefix smallscreen &lt;br /&gt;
 &lt;br /&gt;
 define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
 attr WEBtablet stylesheetPrefix touchpad &lt;br /&gt;
 &lt;br /&gt;
 #### Logfile&lt;br /&gt;
 # Fake FileLog entry, to access the fhem log from FHEMWEB &lt;br /&gt;
 define Logfile FileLog ./log/fhem-%Y-%m.log fakelog &lt;br /&gt;
 &lt;br /&gt;
 #### Autocreate&lt;br /&gt;
 define autocreate autocreate&lt;br /&gt;
 attr autocreate autosave 1&lt;br /&gt;
 attr autocreate device_room %TYPE&lt;br /&gt;
 attr autocreate filelog ./log/%NAME-%Y.log&lt;br /&gt;
 attr autocreate weblink 1&lt;br /&gt;
 attr autocreate weblink_room Plots &lt;br /&gt;
 &lt;br /&gt;
 # Disable this to avoid looking for new USB devices on startup&lt;br /&gt;
 define initialUsbCheck notify global:INITIALIZED usb create &lt;br /&gt;
 &lt;br /&gt;
 #### CUL Definition, MAX!Cube&lt;br /&gt;
 define CUL0 CUL /dev/ttyACM0@9600 1234&lt;br /&gt;
 attr CUL0 rfmode MAX&lt;br /&gt;
 define cm CUL_MAX 123456 &lt;br /&gt;
 &lt;br /&gt;
 ####&lt;br /&gt;
 #### Room Definitions&lt;br /&gt;
 #### Heating Control = MAX&lt;br /&gt;
 ####&lt;br /&gt;
 &lt;br /&gt;
 ## 1.1 Bathroom (Heating Thermostat)&lt;br /&gt;
 define MAX_Bathroom_Heating MAX HeatingThermostat 05615b&lt;br /&gt;
 attr MAX_Bathroom_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Bathroom_Heating room Bathroom&lt;br /&gt;
 attr MAX_Bathroom_Heating scanTemp 1&lt;br /&gt;
 define FileLog_MAX_Bathroom_Heating FileLog ./log/MAX_Bathroom_Heating-%Y.log MAX_Bathroom_Heating&lt;br /&gt;
 attr FileLog_MAX_Bathroom_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Bathroom_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Bathroom_Heating room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 1.2 Bathroom (Window Sensor)&lt;br /&gt;
 define MAX_Bathroom_WindowSensor MAX ShutterContact 053767&lt;br /&gt;
 attr MAX_Bathroom_WindowSensor room Bathroom&lt;br /&gt;
 define FileLog_MAX_Bathroom_WindowSensor FileLog ./log/MAX_Bathroom_WindowSensor-%Y.log MAX_Bathroom_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Bathroom_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Bathroom_WindowSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 1.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Bathroom_WindowSensor associate MAX_Bathroom_Heating&lt;br /&gt;
 # set MAX_Bathroom_Heating associate MAX_Bathroom_WindowSensor&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Bathroom_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Tue 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Wed  17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Thu 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Fri 17,05:00,19,06:00,22,07:15,21,08:30,17,19:00,21,20:45,17 Sat  17,06:00,21,10:00,19,19:00,21,20:45,17 Sun 17,06:00,21,10:00,19,19:00,21,20:45,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Bathroom_Heating scanTemp 1&lt;br /&gt;
 # attr MAX_Bathroom_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Bathroom_Heating userReadings watchShutter { return &amp;quot;MAX_Bathroom_WindowSensor&amp;quot;;;}&lt;br /&gt;
 #&lt;br /&gt;
 # WindowOpenTemperature (4.5 = OFF, No Window Detection)&lt;br /&gt;
 # set MAX_Bathroom_Heating windowOpenTemperature 5.5&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 ### 2.1 Bedroom (Heating Thermostat)&lt;br /&gt;
 define MAX_Bedroom_Heating MAX HeatingThermostat 020341&lt;br /&gt;
 attr MAX_Bedroom_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Bedroom_Heating room Bedroom&lt;br /&gt;
 attr MAX_Bedroom_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Bedroom_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Bedroom_Heating FileLog ./log/MAX_Bedroom_Heating-%Y.log MAX_Bedroom_Heating&lt;br /&gt;
 attr FileLog_MAX_Bedroom_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Bedroom_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Bedroom_Heating room MAX &lt;br /&gt;
 &lt;br /&gt;
 ### 2.2 Bedroom (Window Sensor)&lt;br /&gt;
 define MAX_Bedroom_WindowSensor1 MAX ShutterContact 053fdd&lt;br /&gt;
 attr MAX_Bedroom_WindowSensor1 room Bedroom&lt;br /&gt;
 define FileLog_MAX_Bedroom_WindowSensor1 FileLog ./log/MAX_Bedroom_WindowSensor1-%Y.log MAX_Bedroom_WindowSensor1&lt;br /&gt;
 attr FileLog_MAX_Bedroom_WindowSensor1 logtype text&lt;br /&gt;
 attr FileLog_MAX_Bedroom_WindowSensor1 room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 2.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Bedroom_WindowSensor1 associate MAX_Bedroom_Heating&lt;br /&gt;
 # set MAX_Bedroom_Heating associate MAX_Bedroom_WindowSensor1&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Bedroom_Heating weekProfile Mon 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Tue 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Wed 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Thu 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Fri 17,05:00,19,06:00,21,07:15,17,19:00,19,21:00,17 Sat 17,07:00,19,09:00,21,10:00,17 Sun 17,07:00,19,09:00,21,10:00,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Bedroom_Heating scanTemp 1&lt;br /&gt;
 # attr MAX_Bedroom_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Bedroom_Heating userReadings watchShutter { return &amp;quot;MAX_Bedroom_WindowSensor1&amp;quot;;;}&lt;br /&gt;
 #&lt;br /&gt;
 # WindowOpenTemperature (4.5 = OFF, No Window Detection)&lt;br /&gt;
 # set MAX_Bedroom_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ### 3.1 Child 1 (Heating Thermostat)&lt;br /&gt;
 define MAX_Child1_Heating MAX HeatingThermostat 05034f&lt;br /&gt;
 attr MAX_Child1_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Child1_Heating room Child1&lt;br /&gt;
 attr MAX_Child1_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Child1_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Child1_Heating FileLog ./log/MAX_Child1_Heating-%Y.log MAX_Child1_Heating&lt;br /&gt;
 attr FileLog_MAX_Child1_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Child1_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Child1_Heating room MAX &lt;br /&gt;
 &lt;br /&gt;
 ### 3.2 Child 1 (Window Sensor)&lt;br /&gt;
 define MAX_Child1_WindowSensor MAX ShutterContact 053f76&lt;br /&gt;
 attr MAX_Child1_WindowSensor room Child1&lt;br /&gt;
 define FileLog_MAX_Child1_WindowSensor FileLog ./log/MAX_Child1_WindowSensor-%Y.log MAX_Child1_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Child1_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Child1_WindowSensor room MAX &lt;br /&gt;
 &lt;br /&gt;
 ### 3.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Child1_WindowSensor associate MAX_Child1_Heating&lt;br /&gt;
 # set MAX_Child1_Heating associate MAX_Child1_WindowSensor&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Child1_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Wed  17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Sat 17,06:00,21,20:00,17 Sun 17,06:00,21,20:00,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Child1_Heating scanTemp 1&lt;br /&gt;
 # attr MAX_Child1_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Child1_Heating userReadings watchShutter { return &amp;quot;MAX_Child1_WindowSensor&amp;quot;;;}&lt;br /&gt;
 #&lt;br /&gt;
 # set MAX_Child1_Heating windowOpenTemperature 5.5 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ### 4.1 Child 2 (Heating Thermostat)&lt;br /&gt;
 define MAX_Child2_Heating MAX HeatingThermostat 050352&lt;br /&gt;
 attr MAX_Child2_Heating room Child2&lt;br /&gt;
 attr MAX_Child2_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Child2_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Child2_Heating FileLog ./log/MAX_Child2_Heating-%Y.log MAX_Child2_Heating&lt;br /&gt;
 attr FileLog_MAX_Child2_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Child2_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Child2_Heating room MAX&lt;br /&gt;
 define SVG_FileLog_MAX_Child2_Heating_1 SVG FileLog_MAX_Child2_Heating:SVG_FileLog_MAX_Child2_Heating_1:CURRENT&lt;br /&gt;
 attr SVG_FileLog_MAX_Child2_Heating_1 room Child2&lt;br /&gt;
 &lt;br /&gt;
 ### 4.2 Child 2 (Window Sensor)&lt;br /&gt;
 define MAX_Child2_WindowSensor MAX ShutterContact 053fce&lt;br /&gt;
 attr MAX_Child2_WindowSensor room Child2&lt;br /&gt;
 define FileLog_MAX_Child2_WindowSensor FileLog ./log/MAX_Child2_WindowSensor-%Y.log MAX_Child2_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Child2_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Child2_WindowSensor room MAX &lt;br /&gt;
 &lt;br /&gt;
 ### 4.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Child2_WindowSensor associate MAX_Child2_Heating&lt;br /&gt;
 # set MAX_Child2_Heating associate MAX_Child2_WindowSensor&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Child2_Heating weekProfile Mon 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Wed 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,22,07:15,19,15:30,21,19:00,19,21:00,17  Sat 17,06:00,21,20:00,17 Sun 17,06:00,21,20:00,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Child2_Heating scanTemp 1&lt;br /&gt;
 # attr MAX_Child2_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Child2_Heating userReadings watchShutter { return &amp;quot;MAX_Child2_WindowSensor&amp;quot;;;}&lt;br /&gt;
 #&lt;br /&gt;
 # set MAX_Child2_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ### 5.1 Kitchen (Heating Thermostat)&lt;br /&gt;
 define MAX_Kitchen_Heating MAX HeatingThermostat 06546c&lt;br /&gt;
 attr MAX_Kitchen_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Kitchen_Heating room Kitchen&lt;br /&gt;
 attr MAX_Kitchen_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Kitchen_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Kitchen_Heating FileLog ./log/MAX_Kitchen_Heating-%Y.log MAX_Kitchen_Heating&lt;br /&gt;
 attr FileLog_MAX_Kitchen_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Kitchen_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Kitchen_Heating room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 5.2 Kitchen (Window Sensor)&lt;br /&gt;
 define MAX_Kitchen_WindowSensor MAX ShutterContact 0612ce&lt;br /&gt;
 attr MAX_Kitchen_WindowSensor room Kitchen&lt;br /&gt;
 define FileLog_MAX_Kitchen_WindowSensor FileLog ./log/MAX_Kitchen_WindowSensor-%Y.log MAX_Kitchen_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Kitchen_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Kitchen_WindowSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 5.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Kitchen_WindowSensor associate MAX_Kitchen_Heating&lt;br /&gt;
 # set MAX_Kitchen_Heating associate MAX_Kitchen_WindowSensor&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Kitchen_Heating weekProfile Mon 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Tue 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Wed 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Thu 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Fri 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Sat 17,07:00,21,20:00,17 Sun 17,07:00,21,20:00,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Kitchen_Heating scanTemp 1&lt;br /&gt;
 # attr MAX_Kitchen_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Kitchen_Heating userReadings watchShutter { return &amp;quot;MAX_Kitchen_WindowSensor&amp;quot;;;}&lt;br /&gt;
 #&lt;br /&gt;
 # set MAX_Kitchen_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ### 6.1 Livingroom (Heating Thermostats - Two)&lt;br /&gt;
 define MAX_Livingroom_Heating1 MAX HeatingThermostat 065531&lt;br /&gt;
 attr MAX_Livingroom_Heating1 room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_Heating1 FileLog ./log/MAX_Livingroom_Heating1-%Y.log MAX_Livingroom_Heating1&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating1 icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating1 logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating1 room MAX &lt;br /&gt;
 &lt;br /&gt;
 define MAX_Livingroom_Heating2 MAX HeatingThermostat 06563a&lt;br /&gt;
 attr MAX_Livingroom_Heating2 room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_Heating2 FileLog ./log/MAX_Livingroom_Heating2-%Y.log MAX_Livingroom_Heating2&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating2 icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating2 logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_Heating2 room MAX &lt;br /&gt;
 &lt;br /&gt;
 ### 6.2 Livingroom (Window Sensors - Two)&lt;br /&gt;
 define MAX_Livingroom_WindowSensor_Balcony MAX ShutterContact 0618ce&lt;br /&gt;
 attr MAX_Livingroom_WindowSensor_Balcony room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_WindowSensor_Balcony FileLog ./log/MAX_Livingroom_WindowSensor_Balcony-%Y.log MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 attr FileLog_MAX_Livingroom_WindowSensor_Balcony logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_WindowSensor_Balcony room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 6.3 Livingroom (Wall Thermostat)&lt;br /&gt;
 define MAX_Livingroom_THSensor MAX WallMountedThermostat 01c93f&lt;br /&gt;
 attr MAX_Livingroom_THSensor MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Livingroom_THSensor room Livingroom&lt;br /&gt;
 define FileLog_MAX_Livingroom_THSensor FileLog ./log/MAX_Livingroom_THSensor-%Y.log MAX_Livingroom_THSensor&lt;br /&gt;
 attr FileLog_MAX_Livingroom_THSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Livingroom_THSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 6.4 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Livingroom_WindowSensor_Balcony associate MAX_Livingroom_Heating1&lt;br /&gt;
 # set MAX_Livingroom_Heating1 associate MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 # set MAX_Livingroom_WindowSensor_Balcony associate MAX_Livingroom_Heating2&lt;br /&gt;
 # set MAX_Livingroom_Heating2 associate MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 # set MAX_Livingroom_WindowSensor_Balcony associate MAX_Livingroom_THSensor&lt;br /&gt;
 # set MAX_Livingroom_THSensor associate MAX_Livingroom_WindowSensor_Balcony&lt;br /&gt;
 # set MAX_Livingroom_THSensor associate MAX_Livingroom_Heating1&lt;br /&gt;
 # set MAX_Livingroom_Heating1 associate MAX_Livingroom_THSensor&lt;br /&gt;
 # set MAX_Livingroom_THSensor associate MAX_Livingroom_Heating2&lt;br /&gt;
 # set MAX_Livingroom_Heating2 associate MAX_Livingroom_THSensor&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Livingroom_THSensor weekProfile Mon 17,05:00,19,06:00,22,07:15,21,22:30,17 Tue 17,05:00,19,06:00,22,07:15,21,22:30,17 Wed 17,05:00,19,06:00,22,07:15,21,22:30,17 Thu 17,05:00,19,06:00,22,07:15,21,22:30,17 Fri 17,05:00,19,06:00,22,07:15,21,22:30,17 Sat 17,06:00,21,22:30,17 Sun 17,06:00,21,22:30,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Livingroom_Heating1 scanTemp 1&lt;br /&gt;
 # attr MAX_Livingroom_Heating2 scanTemp 1&lt;br /&gt;
 # attr MAX_Livingroom_Heating1 userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Livingroom_Heating1 userReadings watchShutter { return &amp;quot;MAX_Livingroom_WindowSensor_Balcony&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Livingroom_Heating2 userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Livingroom_Heating2 userReadings watchShutter { return &amp;quot;MAX_Livingroom_WindowSensor_Balcony&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Livingroom_THSensor userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Livingroom_THSensor scanTemp 1&lt;br /&gt;
 #&lt;br /&gt;
 # set MAX_Livingroom_Heating1 windowOpenTemperature 5.5&lt;br /&gt;
 # set MAX_Livingroom_Heating2 windowOpenTemperature 5.5&lt;br /&gt;
 # set MAX_Livingroom_THSensor windowOpenTemperature 5.5 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ### 7.1 Toilette (Heating Thermostat)&lt;br /&gt;
 define MAX_Toilette_Heating MAX HeatingThermostat 06b990&lt;br /&gt;
 attr MAX_Toilette_Heating MAX_Child2_Heating AllHeaters&lt;br /&gt;
 attr MAX_Toilette_Heating room Toilette&lt;br /&gt;
 attr MAX_Toilette_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Toilette_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Toilette_Heating FileLog ./log/MAX_Toilette_Heating-%Y.log MAX_Toilette_Heating&lt;br /&gt;
 attr FileLog_MAX_Toilette_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Toilette_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Toilette_Heating room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 7.2 Toilette (Window Sensor)&lt;br /&gt;
 define MAX_Toilette_WindowSensor MAX ShutterContact 053d50&lt;br /&gt;
 attr MAX_Toilette_WindowSensor room Toilette&lt;br /&gt;
 define FileLog_MAX_Toilette_WindowSensor FileLog ./log/MAX_Toilette_WindowSensor-%Y.log MAX_Toilette_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Toilette_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Toilette_WindowSensor room MAX&lt;br /&gt;
 &lt;br /&gt;
 ### 7.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Toilette_WindowSensor associate MAX_Toilette_Heating&lt;br /&gt;
 # set MAX_Toilette_Heating associate MAX_Toilette_WindowSensor&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Toilette_Heating weekProfile Mon 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Tue 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Wed 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Thu 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Fri 17,05:00,19,06:00,21,07:30,19,19:00,21,20:00,17 Sat 17,07:00,21,20:00,17 Sun 17,07:00,21,20:00,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Toilette_Heating scanTemp 1&lt;br /&gt;
 # attr MAX_Toilette_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Toilette_Heating userReadings watchShutter { return &amp;quot;MAX_Kitchen_WindowSensor&amp;quot;;;}&lt;br /&gt;
 #&lt;br /&gt;
 # set MAX_Toilette_Heating windowOpenTemperature 5.5&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ### 8.1 Working room (Heating Thermostat)&lt;br /&gt;
 define MAX_Working_Heating MAX HeatingThermostat 020551&lt;br /&gt;
 attr MAX_Working_Heating room Workingroom&lt;br /&gt;
 attr MAX_Working_Heating scanTemp 1&lt;br /&gt;
 attr MAX_Working_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 define FileLog_MAX_Working_Heating FileLog ./log/MAX_Working_Heating-%Y.log MAX_Working_Heating&lt;br /&gt;
 attr FileLog_MAX_Working_Heating icon heizung.0&lt;br /&gt;
 attr FileLog_MAX_Working_Heating logtype text&lt;br /&gt;
 attr FileLog_MAX_Working_Heating room MAX&lt;br /&gt;
 define SVG_FileLog_MAX_Working_Heating_1 SVG FileLog_MAX_Working_Heating:SVG_FileLog_MAX_Working_Heating_1:CURRENT&lt;br /&gt;
 attr SVG_FileLog_MAX_Working_Heating_1 room Workingroom&lt;br /&gt;
 &lt;br /&gt;
 ### 8.2 Working room (Window Sensor)&lt;br /&gt;
 define MAX_Working_WindowSensor MAX ShutterContact 06102b&lt;br /&gt;
 attr MAX_Working_WindowSensor room Workingroom&lt;br /&gt;
 define FileLog_MAX_Working_WindowSensor FileLog ./log/MAX_Working_WindowSensor-%Y.log MAX_Working_WindowSensor&lt;br /&gt;
 attr FileLog_MAX_Working_WindowSensor logtype text&lt;br /&gt;
 attr FileLog_MAX_Working_WindowSensor room MAX &lt;br /&gt;
 &lt;br /&gt;
 ### 8.3 One-Time Configuration (only stored in actors, not in fhem.cfg) - commented just to document&lt;br /&gt;
 # Activate Open Window detection&lt;br /&gt;
 # set MAX_Working_WindowSensor associate MAX_Working_Heating&lt;br /&gt;
 # set MAX_Working_Heating associate MAX_Working_WindowSensor&lt;br /&gt;
 #&lt;br /&gt;
 # Define Week Profile&lt;br /&gt;
 # set MAX_Working_Heating weekProfile Mon 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Tue 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Wed 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Thu 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17 Fri 17,05:00,19,06:00,21,07:15,19,15:30,21,19:00,19,21:00,17  Sat 17,06:00,21,09:00,19,16:00,21,20:00,17 Sun 17,06:00,21,09:00,19,16:00,21,20:00,17&lt;br /&gt;
 #&lt;br /&gt;
 # Temperatur Scanner (Graphical)&lt;br /&gt;
 # attr MAX_Working_Heating scanTemp 1&lt;br /&gt;
 # attr MAX_Working_Heating userReadings onlyAutoMode { return &amp;quot;1&amp;quot;;;}&lt;br /&gt;
 # attr MAX_Working_Heating userReadings watchShutter { return &amp;quot;MAX_Working_WindowSensor&amp;quot;;;}&lt;br /&gt;
 #&lt;br /&gt;
 # set MAX_Working_Heating windowOpenTemperature 5.5 &lt;br /&gt;
 &lt;br /&gt;
 define SVG_FileLog_MAX_Bedroom_Heating_1 SVG FileLog_MAX_Bedroom_Heating:SVG_FileLog_MAX_Bedroom_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Child1_Heating_1 SVG FileLog_MAX_Child1_Heating:SVG_FileLog_MAX_Child1_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Bedroom_Heating_2 SVG FileLog_MAX_Bedroom_Heating:SVG_FileLog_MAX_Bedroom_Heating_2:CURRENT &lt;br /&gt;
 &lt;br /&gt;
 ### 9.1 ECO-Wallbutton&lt;br /&gt;
 define MAX_WallButton MAX PushButton 0521c4&lt;br /&gt;
 #&lt;br /&gt;
 # Define House to control all Heaters at once&lt;br /&gt;
 define AllHeaters structure MAX_Child2_Heating MAX_Workingroom_Heating MAX_Child1_Heating MAX_Livingroom_THSensor MAX_Bedroom_Heating MAX_Toilette_Heating MAX_Kitchen_Heating  MAX_Bathroom_Heating&lt;br /&gt;
 attr AllHeaters room House&lt;br /&gt;
 attr AllHeaters webCmd desiredTemperature&lt;br /&gt;
 #&lt;br /&gt;
 define MAX_HouseECOHeating notify MAX_WallButton:(onoff).* { if (&amp;quot;%EVTPART1&amp;quot; eq &amp;quot;0&amp;quot;) { fhem(&amp;quot;set AllHeaters desiredTemperature eco&amp;quot;) &amp;amp;&amp;amp; Log(3,&amp;quot;===&amp;gt; ECO-Mode set&amp;quot;);;} else {  fhem(&amp;quot;set AllHeaters desiredTemperature auto&amp;quot;) &amp;amp;&amp;amp; Log(3,&amp;quot;===&amp;gt; AUTO-Mode set&amp;quot;);;}}&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 define SVG_FileLog_MAX_Bathroom_Heating_1 SVG FileLog_MAX_Bathroom_Heating:SVG_FileLog_MAX_Bathroom_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Bedroom_Heating_3 SVG FileLog_MAX_Bedroom_Heating:SVG_FileLog_MAX_Bedroom_Heating_3:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Child1_Heating_2 SVG FileLog_MAX_Child1_Heating:SVG_FileLog_MAX_Child1_Heating_2:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Child2_Heating_2 SVG FileLog_MAX_Child2_Heating:SVG_FileLog_MAX_Child2_Heating_2:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Kitchen_Heating_1 SVG FileLog_MAX_Kitchen_Heating:SVG_FileLog_MAX_Kitchen_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Livingroom_THSensor_1 SVG FileLog_MAX_Livingroom_THSensor:SVG_FileLog_MAX_Livingroom_THSensor_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Toilette_Heating_1 SVG FileLog_MAX_Toilette_Heating:SVG_FileLog_MAX_Toilette_Heating_1:CURRENT&lt;br /&gt;
 define SVG_FileLog_MAX_Working_Heating_2 SVG FileLog_MAX_Working_Heating:SVG_FileLog_MAX_Working_Heating_2:CURRENT&lt;br /&gt;
&lt;br /&gt;
=== Planned changes ===&lt;br /&gt;
ADD ME&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MAX]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=NetIO-230B&amp;diff=2932</id>
		<title>NetIO-230B</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=NetIO-230B&amp;diff=2932"/>
		<updated>2013-09-19T16:59:26Z</updated>

		<summary type="html">&lt;p&gt;SirUli: /* Hinweise zum Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= NetIO-230B =&lt;br /&gt;
IP-Spannungsverteiler (Mehrfachsteckdose), der über IP-Befehle und manuell gesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
* Eingebauter Webserver&lt;br /&gt;
* Vier geschaltete Spannungsausgänge&lt;br /&gt;
* Unterstützte Protokolle: HTTP, SMTP, SNTP, DHCP, DNS und Telnet&lt;br /&gt;
* CGI Befehle und Telnet-Steuerung&lt;br /&gt;
* Abgesichertes Login&lt;br /&gt;
* Benutzerrechtgruppen&lt;br /&gt;
* LED–Anzeigen für aktuellen Status jedes Ausgangs&lt;br /&gt;
* Sicheres Design schützt vor Stromschlag, feuersichere Materialien&lt;br /&gt;
* Timer&lt;br /&gt;
* Wählbare Start-Einstellungen für jeden Ausgang (An/Aus)&lt;br /&gt;
* Taster für Handbetrieb der Ausgänge&lt;br /&gt;
* Watchdog (automatischer Neustart von nicht antwortenden Netzwerkgeräten)&lt;br /&gt;
* E-Mail Benachrichtigung&lt;br /&gt;
== Spezifikationen ==&lt;br /&gt;
* Eingangsspannung: 230V AC&lt;br /&gt;
* Maximaler Schaltstrom: 6A per Steckdose, 10A gesamt&lt;br /&gt;
* Latenzzeit: max. 10 ms&lt;br /&gt;
* Maße: 300x60x90 mm (BxHxT)&lt;br /&gt;
* Netzwerk-Anschluss: 10/100 Mbit/s, RJ-45&lt;br /&gt;
== Allgemein ==&lt;br /&gt;
NetIO-230B lässt sich komplett per Web Browser bedienen/konfigurieren. Javascript wird benötigt.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Kopiert von [[http://forum.fhem.de/index.php?t=msg&amp;amp;th=13399&amp;amp;start=0&amp;amp;rid=0 hier]]&lt;br /&gt;
&lt;br /&gt;
===Definition===&lt;br /&gt;
Steuervariablen definieren, für die spätere Steuerung&lt;br /&gt;
&amp;lt;pre&amp;gt;define NET_IO_Switch1 dummy&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notify Script 1 für ON&lt;br /&gt;
&amp;lt;pre&amp;gt;define NETIO230_SwitchOn_Switch1 notify NET_IO_Switch1:on {GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?login=p:admin:&amp;lt;password&amp;gt;&amp;quot;);; \ GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?p=1uuu&amp;quot;);; \ GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?quit=quit&amp;quot;);; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notify Script 2 für OFF&lt;br /&gt;
&amp;lt;pre&amp;gt;define NETIO230_SwitchOn_Switch1 notify NET_IO_Switch1:on {GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?login=p:admin:&amp;lt;password&amp;gt;&amp;quot;);; \ GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?p=0uuu&amp;quot;);; \ GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?quit=quit&amp;quot;);; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erläuterung des Aufrufs===&lt;br /&gt;
Mit dieser Zeile wird eine Verbindung mit dem NET IO230 aufgebaut:&lt;br /&gt;
&amp;lt;pre&amp;gt;GetHttpFile(&amp;quot;192.X.X.X&amp;quot;, &amp;quot;/tgi/control.tgi?login=p:admin:&amp;lt;Password&amp;gt;&amp;quot;);;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ersetzungen:&lt;br /&gt;
* &#039;&#039;&amp;lt;Password&amp;gt;&#039;&#039; hier müßt Ihr eure Password im Klartext eintragen&lt;br /&gt;
* &#039;&#039;&amp;lt;NETIO IP&amp;gt;&#039;&#039; hier ist die IP Adresse, z.B. 192.168.1.3 des NET-IO einzutragen.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Zeile wird der Ausgangsstatus des NET-IO verändert:&lt;br /&gt;
&amp;lt;pre&amp;gt;GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?p=1uuu&amp;quot;);; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ersetzungen:&lt;br /&gt;
* u=nicht verändern&lt;br /&gt;
* 0=Ausschalten&lt;br /&gt;
* 1=Einschalten&lt;br /&gt;
&lt;br /&gt;
Hierbei müssen immer 4 Zeichen angegeben werden. Im obigen Beispiel schaltet &#039;&#039;&#039;1uuu&#039;&#039;&#039; den ersten Port ein und lässt alle anderen unverändert.&lt;br /&gt;
&lt;br /&gt;
Beenden der Verbindung:&lt;br /&gt;
&amp;lt;pre&amp;gt;GetHttpFile(&amp;quot;&amp;lt;NETIO IP&amp;gt;&amp;quot;, &amp;quot;/tgi/control.tgi?quit=quit&amp;quot;);;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Steuerung in FHEM===&lt;br /&gt;
Die Steuerung erfolgt wie folgt:&lt;br /&gt;
&lt;br /&gt;
* Einschalten&lt;br /&gt;
&amp;lt;pre&amp;gt;set NET_IO_Switch1 on&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ausschalten&lt;br /&gt;
&amp;lt;pre&amp;gt;set NET_IO_Switch1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
??&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Bedienungsanleitung (deutsch): [http://www.koukaam.se/koukaam/downloads/MAN_DE_NETIO-230B_3-00.pdf MAN_DE_NETIO-230B_3-00.pdf]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Schalter (Empfänger)]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Arduino&amp;diff=2930</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Arduino&amp;diff=2930"/>
		<updated>2013-09-18T18:38:43Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Link was 404, updated with new destination&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Arduino zur Anbindung eigener Sensoren und Aktoren an FHEM nutzen ==&lt;br /&gt;
Mit [http://www.arduino.cc/ Arduino]-Boards lassen sich einfach und recht preisgünstig (ab ca. 15€ Stand Juli 2012) eigene Sensoren/Aktoren an FHEM anbinden.&lt;br /&gt;
&lt;br /&gt;
Das Board lässt sich recht einfach programmieren um Sensorwerte zu verarbeiten und diese z.B. per Ethernet an FHEM zu senden oder abfragen zu lassen. Über zahlreiche Schnittstellen (Standard: RS232, TWI/1-Wire, SPI, PWM, analog/digital-I/O, I2C) mit den entsprechenden Software-Libraries kann auf viele gängige Sensoren zugegriffen werden. Über Erweiterungsboards (&amp;quot;Shields&amp;quot;) können die Anschlussmöglichkeiten ausgebaut werden. Zudem ist der Anschluss von Parallel-/Seriell-/I2C-LCD-Displays und SD-Karten möglich.&lt;br /&gt;
&lt;br /&gt;
Die Boards und eine Vielfalt an Sensoren/Aktoren sind über Online-Auktionen bzw. -Anbieter einfach zu bekommen. Kommunikation mit dem Arduino ist z.B. per Netzwerk/Ethernet, WLAN, 433/868MHz/2,4GHz-RF, Bluetooth, 1-Wire etc. möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arduino mit Ethernet&#039;&#039;&#039;&lt;br /&gt;
Eine einfache und sehr kompakte Lösung ist der Arduino Nano mit Ethernet-Shield. Der Nano hat je 8 nutzbare Analog- und Digital Ein-/Ausgänge über die sich beispielsweise Temperatursensoren, Relais etc. ansprechen lassen.&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte sind zur Vorbereitung zu tun:&lt;br /&gt;
&lt;br /&gt;
# Arduino (bzw. Klon) mit Ethernet-Shield (z.B. mit ENC28J60 Chip) und gewünschten Sensoren kaufen&lt;br /&gt;
# Arduino-IDE von der [http://arduino.cc/en/Main/Software Arduino-Homepage] (für Windows, Mac OS X und Linux vorhanden) herunterladen und installieren&lt;br /&gt;
# Falls ENC28J60-Ethernet-Shield verwendet wird: Ethernet-Library für ENC28J60 herunterladen und in Arduino-IDE-Installation hineinkopieren (z.B. von hier: [http://trollmaker.com/article11/arduino-1-0-with-enc28j60-ethernet-shield-v1-1/], alternativ nach arduino+ENC28J60+library googeln)&lt;br /&gt;
# Folgenden Beispiel-Sketch mit Arduino-IDE öffnen Arduino_FHEM.ino [https://sites.google.com/site/fhemarduino/file-cabinet/Arduino_FHEM.ino?attredirects=0&amp;amp;amp;d=1]&lt;br /&gt;
# IP Adresse im Sketch passend zum eigenen Netzwerk ändern (steht im Sketch auf 192.168.2.44)&lt;br /&gt;
# Sketch auf Arduino laden&lt;br /&gt;
# Arduino mit 5V-USB-Netzteil ans Netzwerk anschliessen&lt;br /&gt;
# Verbindung testen indem in einem Webbrowser &amp;amp;lt;arduino_ip_adresse&amp;amp;gt;/?cmd=set_D5_ON [http://192.168.2.44/?cmd=set_D5_ON] eingegeben wird (natürlich hier die im Sketch verwendete IP-Adresse angeben). Falls an Ausgang D5 eine Leuchtdiode o.ä. angeschlossen wurde sollte diese nun leuchten.&lt;br /&gt;
# Wenn das geklappt hat sollte sich der Ausgang auch aus der FHEM-Kommandozeile ausschalten lassen mit { GetHttpFile(&#039;192.168.2.44:80&#039;, &#039;/?cmd=set_D5_OFF&#039;);; } -&amp;amp;gt; natürlich wieder die im Sketch verwendete IP-Adresse verwenden.&lt;br /&gt;
# Letzter Schritt wäre eine Definition in die fhem.cfg einzutragen um auch entsprechende Buttons in der FHEM-Oberfläche zu haben, ggf. wieder die verwendete IP-Adresse statt arduino:80 verwenden (für die Buttons wurde das FS20-Modul verwendet):&lt;br /&gt;
&lt;br /&gt;
Auszug aus der &#039;&#039;fhem.cfg&#039;&#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define arduinobutton FS20 55d1 00&lt;br /&gt;
attr arduinobutton room Arduino&lt;br /&gt;
define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton&lt;br /&gt;
attr FileLog_arduinobutton room Arduino&lt;br /&gt;
define arduinoswitchon notify FS20_55d100:on { GetHttpFile(&amp;amp;quot;arduino:80&amp;amp;quot;,&amp;amp;quot;/?cmd=set_D5_ON&amp;amp;quot;)}&lt;br /&gt;
attr arduinoswitchon room Arduino&lt;br /&gt;
define arduinoswitchoff notify FS20_55d100:off { GetHttpFile(&amp;amp;quot;arduino:80&amp;amp;quot;,&amp;amp;quot;/?cmd=set_D5_OFF&amp;amp;quot;)}&lt;br /&gt;
attr arduinoswitchoff room Arduino&lt;br /&gt;
define weblink_arduinobutton weblink fileplot FileLog_arduinobutton:fs20:CURRENT&lt;br /&gt;
attr weblink_arduinobutton label &amp;amp;quot;arduinobutton Min $data{min1}, Max $data{max1}, Last $data{currval1}&amp;amp;quot;&lt;br /&gt;
attr weblink_arduinobutton room Arduino&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abfragen von Sensorwerten sind natürlich auch möglich, z.B. mit folgender Definition (Analog- und Digital-PINs werden alle fünf Minuten abgefragt und in Plots visualisiert):&lt;br /&gt;
&lt;br /&gt;
Auszug aus der &#039;&#039;fhem.cfg&#039;&#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define arduinogetsensorvalues at +*00:05:00 {\ &lt;br /&gt;
 my $val = GetHttpFile(&#039;arduino:80&#039;, &#039;/?cmd=get_analog_values&#039;);;\ &lt;br /&gt;
 fhem(&amp;amp;quot;trigger arduinogetsensorvalues $val&amp;amp;quot;);;\ &lt;br /&gt;
}&lt;br /&gt;
attr arduinogetsensorvalues room Arduino&lt;br /&gt;
define FileLog_arduinogetsensorvalues FileLog /opt/fhem/log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:.*&lt;br /&gt;
attr FileLog_arduinogetsensorvalues room Arduino&lt;br /&gt;
define weblink_getsensorvalues weblink fileplot FileLog_arduinogetsensorvalues:arduino:CURRENT&lt;br /&gt;
attr weblink_getsensorvalues label &amp;amp;quot;Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}&amp;amp;quot;&lt;br /&gt;
attr weblink_getsensorvalues room Arduino&lt;br /&gt;
define arduinogetsensorvaluesD at +*00:05:35 {\ &lt;br /&gt;
 my $val = GetHttpFile(&#039;arduino:80&#039;, &#039;/?cmd=get_digital_values&#039;);;\ &lt;br /&gt;
 fhem(&amp;amp;quot;trigger arduinogetsensorvaluesD $val&amp;amp;quot;);;\ &lt;br /&gt;
}&lt;br /&gt;
attr arduinogetsensorvaluesD room Arduino&lt;br /&gt;
define FileLog_arduinogetsensorvaluesD FileLog /opt/fhem/log/arduinogetsensorvaluesD-%Y.log arduinogetsensorvaluesD:.*&lt;br /&gt;
attr FileLog_arduinogetsensorvaluesD room Arduino&lt;br /&gt;
define weblink_getsensorvaluesD weblink fileplot FileLog_arduinogetsensorvaluesD:arduino:CURRENT&lt;br /&gt;
attr weblink_getsensorvaluesD label &amp;amp;quot;Arduino Digital Values Min $data{min1}, Max $data{max1}, Last $data{currval1}&amp;amp;quot;&lt;br /&gt;
attr weblink_getsensorvaluesD room Arduino&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: Kommunikation via RF + Bluetooth + WLAN&lt;br /&gt;
&lt;br /&gt;
Fragen zum Thema bitte in das FHEM-Forum [http://forum.fhem.de/] posten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neben der hier beschriebenen Methode Arduinos an FHEM anzubinden gibt es noch die möglichkeit [[PanStamp]]s über das SWAP Protokoll per RF an FHEM anzubinden. Eine Firmata über SWAP Implementierung ist gerade in Arbeit.&lt;br /&gt;
&lt;br /&gt;
== Arduino mit StandardFirmata ==&lt;br /&gt;
Für den Arduino gibt es ein StandardProtokoll Firmata[https://github.com/ntruchsess/perl-firmata [6]] ist das Protokoll in perl einfach nutzbar und mit dem Modul 10_FRM.pm an FHEM adaptiert. Damit ist es möglich mit nur geringen Arduino-kenntnissen (Bedienung der Arduino-IDE ist und elektronische Kenntnisse zum Anschluss von Sensoren sind natürlich erforderlich) Messwerte aus eigenen Schaltungen über einen Arduino in FHEM einzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
Zur Installation auf den Arduino wird natürlich erst mal die Arduino-IDE benötigt ([http://arduino.cc/en/Guide/HomePage http://arduino.cc/en/Guide/HomePage]). Die aktuelle Version der IDE enthält auch die StandardFirmata Firmware fertig zum Flashen auf den Arduino.&lt;br /&gt;
Diese findet man unter &#039;Datei&#039;-&amp;amp;gt;&#039;Beispiele&#039;-&amp;amp;gt;&#039;Firmata&#039;-&amp;amp;gt;&#039;StandardFirmata&#039;. Einfach öffnen, unter &#039;Tools&#039;-&amp;amp;gt;&#039;Board&#039; den eigenen Arduino auswählen und mit dem Upload-knopf (der Rechtspfeil im Kreis oben links) den geladenen Sketch compilieren und auf das Board hochladen. Falls man unter Windows Probleme hat, den Arduino über USB zu connecten, findet sich hier weitere Informatation: [http://arduino.cc/en/Guide/Windows#toc2 http://arduino.cc/en/Guide/Windows#toc2]&lt;br /&gt;
&lt;br /&gt;
=== FRM ===&lt;br /&gt;
Der Arduino wird in FHEM über das Modul 10_FRM.pm angesprochen (dazu bitte die aktuelle Development-version herunterladen ([http://www.dhs-computertechnik.de/downloads/fhem-cvs.tgz http://www.dhs-computertechnik.de/downloads/fhem-cvs.tgz]) aus dem SVN auschecken oder per updatefhem aktualisieren).&lt;br /&gt;
10_FRM ist sozusagen die Basis (das IODev) für die anderen Module. Es lassen sich jeweils so viele Ein/Ausgabe Devices pro Arduino konfigurieren, wie dieser physikalisch besitzt (natürlich muss man darauf achten, dass nicht alle Arduino-pins alle Ein-/ausgabemöglichkeiten besitzen). Konfiguriert man einen Pin für einen nicht unterstützen Modus so gibt es mit der aktuellen Firmata-version (2.3) direkt einen Fehler - ältere Versionen schlucken so eine Fehlkonfiguration einfach so, der betreffende Pin funktioniert dann einfach nicht.&lt;br /&gt;
&lt;br /&gt;
define &amp;amp;lt;devicename&amp;amp;gt; FRM &amp;amp;lt;port&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier mal ein kurzer Ausschnitt aus der fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# definiere FRM als IO-Device - Baudrate 57600 ist default in der Standardfirmata&lt;br /&gt;
define FIRMATA FRM /dev/ttyUSB0@57600&lt;br /&gt;
attr FIRMATA loglevel 6&lt;br /&gt;
attr FIRMATA sampling-interval 1000 # Wert ist in ms und 14Bit breit, also nur bis 16384 setzbar (Beschränkung des Firmata-protokolls) - gilt für alle Pins&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Seit Anfang März 2013 unterstützt FRM auch über Ethernet angebundene Arduinos:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define FIRMATA FRM &amp;amp;lt;port&amp;amp;gt; [global]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
FRM macht fhem-seitig einen Serverport auf (dieser wird in der define-zeile angegeben). &#039;global&#039; muss angegeben werden, damit der Serversocket an alle IP-addressen gebunden wird. (Sonst nur &#039;localhost&#039;, was hier wohl nicht funktionieren würde). Der Arduino verbindet aktiv zu diesem Port, sonst gilt im Prinzip alles was auch für den über USB angebunden Arduion gilt.&lt;br /&gt;
Die Firmware mit Ethernetunterstützung ist in diesem Branch zu finden:&lt;br /&gt;
[https://github.com/ntruchsess/arduino/archive/configurable_ethernet.zip https://github.com/ntruchsess/arduino/archive/configurable_ethernet.zip]&lt;br /&gt;
Darin den unter den examples zu findenen Sketch &#039;ConfigurableEthernetclient&#039; ([https://github.com/ntruchsess/arduino/blob/configurable_ethernet/examples/ConfigurableEthernetclient/ConfigurableEthernetclient.ino https://github.com/ntruchsess/arduino/blob/configurable_ethernet/examples/ConfigurableEthernetclient/ConfigurableEthernetclient.ino])&lt;br /&gt;
&lt;br /&gt;
Im Sketch muss man unbedingt die IP-konfiguration anpassen, d.h. die IP-addresse und Port des FHEM-servers eintragen (ggf. auch eine neue mac-addresse). Falls der Speicher des Arduinos nicht reicht einfach die includes der nicht benötigten Features im sketch auskommentieren. (Wenn man Servo oder I2C-unterstützung weglassen möchte bitte vorher einmalig den sketch mit allen Features compilieren, sonst treten Fehler beim compilieren der library-klassen wg. fehlendem Include von Servo.h oder Wire.h) auf. Das gleiche gilt, wenn man in der IDE irgendwas ändert, das einen kompletten Neubuild des sketches triggert (was z.B. beim Wechsel des gewählten Boards passiert).&lt;br /&gt;
&lt;br /&gt;
Getestet ist das ganze mit UNO R3 + EthernetShield. Andere Arduinos benötigen ggf. Anpassungen in der Setup/Reset Funktion. Ein MEGA256 z.B. benutzt einen anderen Pin als SS (Slave select) zur Kommunikation mit dem Ethernetmodul. Man muss der Firmata im Setup mitteilen, welche Pins zu ignorieren sind, damit es keine Wechselwirkungen zwischen Firmata und Ethernetlibrary gibt. Wenn man eine andere Hardware (z.B. mit ENC28J60 anstelle des WizNet W5100 des Ethernetshields) benutzen möchte, muss man die zugehörige Libraries in den Sketch einbinden.&lt;br /&gt;
&lt;br /&gt;
=== FRM-Devices ===&lt;br /&gt;
==== 20_FRM_IN.pm ====&lt;br /&gt;
Macht einen Arduino-pin als digitalen Eingang nutzbar.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define Firmata_IN FRM_IN 12 # definiert Arduino Pin 12 als digitalen Eingang&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==== 20_FRM_OUT.pm ====&lt;br /&gt;
Macht einen Arduino-pin als digitalen Ausgang nutzbar.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define Firmata_OUT FRM_OUT 11 # definiert Arduino Pin 11 als digitalen Ausgang&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==== 20_FRM_AD.pm ====&lt;br /&gt;
Macht einen Arduino-pin als analogen Eingang nutzbar.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define Firmata_ANALOG FRM_AD 17 # definiert Arduino Pin 17 als analogen Eingang&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==== 20_FRM_PWM.pm ====&lt;br /&gt;
Macht einen Arduino-pin als analogen Ausgang nutzbar. Es wird ein pulsweitenmoduliertes Signal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
==== 20_FRM_SERVO.pm ====&lt;br /&gt;
Erlaubt die Ansteuerung von analogen Modelbauservos (Ansteuerung über PWM) am Arduino.&lt;br /&gt;
&lt;br /&gt;
==== 20_FRM_I2C.pm ====&lt;br /&gt;
Erlaubt das Auslesen von über I2C angeschlossenen ICs&lt;br /&gt;
&lt;br /&gt;
=== Arduino mit OneWireFirmata ===&lt;br /&gt;
die Seite [[Arduino mit OneWireFirmata]] beschreibt, wie es möglich ist, mit einer um OneWire erweiterten Version der StandartFirmata an den Arduino angeschlossene 1-Wire Devices in FHEM einzubinden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Windows_-_CPU_Temperatur_und_Co_mit_FHEM&amp;diff=2559</id>
		<title>Windows - CPU Temperatur und Co mit FHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Windows_-_CPU_Temperatur_und_Co_mit_FHEM&amp;diff=2559"/>
		<updated>2013-07-15T20:27:33Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(von kleene 1503)&lt;br /&gt;
&lt;br /&gt;
Hier mal eine Möglichkeit, wie man auf Windows-Systemen die CPU-, HDD-, und andere Temperaturen / Systemdaten in FHEM anzeigen und grafisch darstellen kann.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen:&lt;br /&gt;
- Cygwin installiert&lt;br /&gt;
- SpeedFan installiert&lt;br /&gt;
- Einen WIRKLICH Unix fähigen Editor. Vergesst hierbei Wordpad und Notepad!!! Ich nutze Proton (ist kostenlos und frei verfügbar). Bei Proton müsst ihr UNBEDINGT darauf achten, dass ihr unter „Datei -&amp;amp;gt; Zeilenumbruchformat“ auf Unix umstellt. Sonst sucht ihr wie ich zwei Wochen nach einem Fehler wo eigentlich gar keiner ist. Das Umstellen unter Syntaxschema auf Unix Shell ist hilfreich aber kein muss.&lt;br /&gt;
&lt;br /&gt;
Laufen tut das ganze bei mir auf Windows 7 Home Premium 64bit.&lt;br /&gt;
== Installiert Cygwin ==&lt;br /&gt;
Auf die Installation von Cygwin werde ich hier nicht eingehen. Dazu gibt es genug im www.&lt;br /&gt;
&lt;br /&gt;
== Installiert SpeedFan ==&lt;br /&gt;
* Um später Leerzeichen in den Pfadangaben zu vermeiden, habe ich nach der Installation von SpeedFan einfach den kompletten Installationsordner direkt nach C: kopiert. Im Klartext heißt das, aus &amp;lt;code&amp;gt;C:\Programme (x86)\SpeedFan\&amp;lt;/code&amp;gt; wurde bei mir &amp;lt;code&amp;gt;C:\SpeedFan\&amp;lt;/code&amp;gt;.&lt;br /&gt;
* SpeedFan selbst habe ich so eingerichtet, dass er mir das Logfile MIT Header schreibt. Das Logfile von SpeedFan findet ihr direkt in dem Installationsordner von SpeedFan.&lt;br /&gt;
&lt;br /&gt;
== Script zum bearbeiten des SpeedFan Logfiles und speichern eines FHEM tauglichen Logfiles erstellen ==&lt;br /&gt;
- Die Logfiles von SpeedFan sind noch nicht FHEM tauglich. Also müssen wir uns die Files mit Hilfe eines kleinen Scriptes in ein FHEM taugliches Format umwandeln. Dieses Script sieht bei mir wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/bin/sh&lt;br /&gt;
date=`date +&amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;`&lt;br /&gt;
log=&amp;quot;/cygdrive/c/fhem/tmp/system.log&amp;quot;&lt;br /&gt;
cat /cygdrive/c/SpeedFan/SFLog*.csv \&lt;br /&gt;
    | grep &amp;quot;&amp;quot; \&lt;br /&gt;
    | sed &#039;/Seconds/d&#039; \&lt;br /&gt;
    | sed &#039;s/[\t]/ /g&#039; \&lt;br /&gt;
    | sed &#039;s/ \+/ /g&#039; \&lt;br /&gt;
    | sed &#039;$!d&#039; \&lt;br /&gt;
    | sed &amp;quot;s/^/$date /&amp;quot; &amp;amp;gt;&amp;amp;gt; $log&lt;br /&gt;
#&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;!/bin/sh&amp;lt;/code&amp;gt; &amp;amp;lt;- sollte klar sein&lt;br /&gt;
* &amp;lt;code&amp;gt;date=`date +&amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;`&amp;lt;/code&amp;gt; &amp;amp;lt;- sollte auch klar sein&lt;br /&gt;
* &amp;lt;code&amp;gt;log=&amp;quot;/cygdrive/c/fhem/tmp/system.log&amp;quot;&amp;lt;/code&amp;gt; &amp;amp;lt;- /cygdrive sagt unserem PC, dass wir Cygwin nutzen (um es mal grob auszudrücken); /c/fhem/tmp/system.log ist der Pfad wo unser fertiges und FHEM taugliches logfile später gespeichert werden soll.&lt;br /&gt;
* &amp;lt;code&amp;gt;cat /cygdrive/c/SpeedFan/SFLog*.csv \&amp;lt;/code&amp;gt; &amp;amp;lt;- sagt unserem script, wo das SpeedFan Logfile liegt welches wir bearbeiten wollen.&lt;br /&gt;
* &amp;lt;code&amp;gt;| grep &amp;quot;&amp;quot; \&amp;lt;/code&amp;gt; &amp;amp;lt;- liest das komplette SpeddFan Logfile ein.&lt;br /&gt;
* &amp;lt;code&amp;gt;| sed &#039;/Seconds/d&#039; \&amp;lt;/code&amp;gt; &amp;amp;lt;- Entfernt die komplette Zeile in der das Wort Seconds vorkommt was in unserem Fall der Header des SpeedFan Logfiles ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;| sed &#039;s/[\t]/ /g&#039; \&amp;lt;/code&amp;gt; &amp;amp;lt;- Entfernt alle Tabs aus dem Speedfan Logfile.&lt;br /&gt;
* &amp;lt;code&amp;gt;| sed &#039;s/ \+/ /g&#039; \&amp;lt;/code&amp;gt; &amp;amp;lt;- Entfernt alle Leerzeichen aus dem SpeedFan Logfile.&lt;br /&gt;
* &amp;lt;code&amp;gt;| sed &#039;$!d&#039; \&amp;lt;/code&amp;gt; &amp;amp;lt;- kopiert immer nur die letzte Zeile des SpeedFan Logfiles und kopiert uns diese samt Datum mit&lt;br /&gt;
* &amp;lt;code&amp;gt;| sed &amp;quot;s/^/$date /&amp;quot; &amp;amp;gt;&amp;amp;gt; $log&amp;lt;/code&amp;gt; in unser FHEM taugliches Logfile.&lt;br /&gt;
&lt;br /&gt;
Dieses Script speichert ihr nun als &amp;lt;code&amp;gt;system.sh&amp;lt;/code&amp;gt; in eurem Cygwin Home Ordner.&lt;br /&gt;
&lt;br /&gt;
Übrigens: Wenn man sich mit dem &amp;quot;sed&amp;quot; Kommando auseinandersetzt, kann man so auch Logfiles von anderen Windowsprogrammen zum Temperatur- und Systemdaten auslesen wunderbar in ein FHEM taugliches Format bringen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== .bat erstellen zum ausführen der .sh – Datei ==&lt;br /&gt;
- Erstellt euch eine .bat mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;@echo off&lt;br /&gt;
C:&lt;br /&gt;
chdir C:\cygwin\bin&lt;br /&gt;
bash --login -i ./system.sh&amp;lt;/pre&amp;gt;&lt;br /&gt;
und speichert diese als &amp;lt;code&amp;gt;system.bat&amp;lt;/code&amp;gt; in eurem fhem Ordner.&lt;br /&gt;
&lt;br /&gt;
== Aufrufen der system.bat durch FHEM ==&lt;br /&gt;
- Erstellt in eurer fhem.cfg folgenden Eintrag:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define SystemDaten at +*00:02:00 { fhem `system`}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dieser Eintrag startet alle 2 Minuten die Datei system.bat welche wiederum das Script system.sh ausführt.&lt;br /&gt;
&lt;br /&gt;
Wenn ihr es so wie ich gemacht habt, sollte nun innerhalb der nächsten 2 Minuten) in dem Ordner „C:\fhem\tmp\“ ein Logfile namens system.log auftauchen welches alle nötigen Daten enthält und FHEM tauglich ist.&lt;br /&gt;
&lt;br /&gt;
== Plot Datei erstellen ==&lt;br /&gt;
- Als Vorlage habe ich die Datei &amp;lt;code&amp;gt;cpulog.gplot&amp;lt;/code&amp;gt; aus dem FHEM Ordner genommen. Wichtig ist hier für uns der untere Teil ab set ylabel. Der obere Teil kann bleiben wie er ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen uns nun Überlegen, was wir uns anzeigen lassen wollen. In diesem Fall nehmen wir mal die Temperaturen von Core 0 und Core 1.&lt;br /&gt;
&lt;br /&gt;
Als erstes sehen wir uns noch einmal das SpeedFan Logfile an welches bei mir folgendermasen aussieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;code&amp;gt;Seconds    HD0    Core 0    Core 1&lt;br /&gt;
71180    34.0    36.0    34.0&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Core 0 und 1 ist also an 3. und 4. Stelle nach Seconds.&lt;br /&gt;
&lt;br /&gt;
Nun sehe ich mir unser erstelltes system.log Logfile an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;code&amp;gt;2012-03-19_22:33:15 71180 34.0 36.0 34.0&amp;lt;/code&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir haben also vor dem Wert für Seconds noch das Datum und die Uhrzeit und den Temperaturwert für Core 0 und 1 finden wir nun an der 4. und 5. Stelle. Wichtig ist, dass ihr Leerzeichen nicht mit zählt.&lt;br /&gt;
&lt;br /&gt;
Gehen wir nun zurück zur Datei cpulog.gplot und Tragen folgendes ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;set ylabel &amp;quot;Temperatur in C&amp;quot;&lt;br /&gt;
set y2label &amp;quot;Temperatur in C&amp;quot;&lt;br /&gt;
#FileLog 4::0:&lt;br /&gt;
#FileLog 5::0:&lt;br /&gt;
plot &amp;quot;&amp;amp;lt;IN&amp;amp;gt;&amp;quot; using 1:4 title &#039;Temperatur Core 0&#039; with lines,\&lt;br /&gt;
 &amp;quot;&amp;amp;lt;IN&amp;amp;gt;&amp;quot; using 1:5 title &#039;Temperatur Core 1&#039; with lines&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung:&lt;br /&gt;
* &amp;lt;code&amp;gt;set ylabel &amp;quot;Temperatur in C&amp;quot;&amp;lt;/code&amp;gt; &amp;amp;lt;- Ist die linke, senkrechte Bezeichnung des Plot-Fensters.&lt;br /&gt;
* &amp;lt;code&amp;gt;set y2label &amp;quot;Temperatur in C&amp;quot;&amp;lt;/code&amp;gt; &amp;amp;lt;- Ist die rechte, senkrechte Bezeichnung des Plot-Fensters.&lt;br /&gt;
* &amp;lt;code&amp;gt;FileLog 4::0:&amp;lt;/code&amp;gt; &amp;amp;lt;- liest die 4 Stelle unseres Logfiles aus.&lt;br /&gt;
* &amp;lt;code&amp;gt;FileLog 5::0:&amp;lt;/code&amp;gt; &amp;amp;lt;- liest die 5. Stelle unseres Logfiles aus.&lt;br /&gt;
* &amp;lt;code&amp;gt;plot &amp;quot;&amp;amp;lt;IN&amp;amp;gt;&amp;quot; using 1:4&amp;lt;/code&amp;gt; &amp;amp;lt;- zeigt die 4. Stelle unseres Logfiles im Plot-Fenster.&lt;br /&gt;
* &amp;lt;code&amp;gt;title &#039;Temperatur Core 0&#039; with lines&amp;lt;/code&amp;gt; &amp;amp;lt;- Zeigt im Plot-Fenster den Titel unserer Linie.&lt;br /&gt;
* &amp;lt;code&amp;gt;,\&amp;lt;/code&amp;gt; &amp;amp;lt;- Sagt FHEM das noch eine weitere Linie kommt.&lt;br /&gt;
&lt;br /&gt;
Speichert dies nun Beispielsweise als &amp;lt;code&amp;gt;core01.gplot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plot in FHEM anzeigen lassen ==&lt;br /&gt;
- Nun Tragen wir in unserer fhem.cfg folgendes ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define SystemLog FileLog C:/fhem/tmp/system.log SystemDaten&lt;br /&gt;
attr SystemLog logtype core01&lt;br /&gt;
define Sys weblink fileplot SystemLog:core01:CURRENT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn alles geklappt hat, solltet ihr nun die Temperaturen grafisch in FHEM dargestellt bekommen.&lt;br /&gt;
&lt;br /&gt;
Ich übernehme keine Garantie. Kann nur sagen, dass es bei mir so geklappt hat. Ich hoffe ich kann dem einen oder anderen damit helfen oder wenigstens einen Denkanstoß geben.&lt;br /&gt;
&lt;br /&gt;
Es gibt bestimmt noch elegantere Lösung allerdings habe ich für Windows bis jetzt noch nichts gefunden.&lt;br /&gt;
&lt;br /&gt;
(von kleene 1503)&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Google-Kalender_zur_Steuerung_von_Dummies&amp;diff=2556</id>
		<title>Google-Kalender zur Steuerung von Dummies</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Google-Kalender_zur_Steuerung_von_Dummies&amp;diff=2556"/>
		<updated>2013-07-15T17:17:42Z</updated>

		<summary type="html">&lt;p&gt;SirUli: Formatting of Code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit dem Kalendermodul [http://fhem.de/commandref.html Calendar] ist es möglich, Ereignisse aus Kalendern im&lt;br /&gt;
ICal-Format abzufragen.&lt;br /&gt;
Dies und der Wiki-Eintrag [[Wochenende, Feiertage und Schulferien]] hat mich dazu veranlasst, dass ich durch&lt;br /&gt;
Kalendereinträge im Google-Kalender den Status meiner beiden Dummies &amp;quot;Urlaub&amp;quot; und &amp;quot;Besuch&amp;quot; steuere. Durch diese&lt;br /&gt;
beiden Dummies werden zum Beispiel die Rolläden im Schlafzimmer oder Gästezimmer bei Besuch oder Urlaub anders&lt;br /&gt;
gesteuert als ohne Besuch oder unter der Woche. Auch meine Zirkulationspumpe soll so bedarfsgerecht gesteuert werden.&lt;br /&gt;
Dass am Wochenende anders gesteuert wird, ist ja mit $we kein Problem.&lt;br /&gt;
Zuerst wird dafür der Kalender definiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Kalender_Christian Calendar ical url &amp;lt;der richtige Kalenderlink&amp;gt; 14400&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Kalenderlink [https://support.google.com/calendar/answer/37103?hl=de] findet man wie beschrieben heraus.&lt;br /&gt;
Dann habe ich meine Dummies definiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;define Urlaub_dummy dummy&lt;br /&gt;
attr Urlaub_dummy room Kalender&lt;br /&gt;
attr Urlaub_dummy setList ja nein&lt;br /&gt;
attr Urlaub_dummy webCmd ja:nein&lt;br /&gt;
define Gast_dummy dummy&lt;br /&gt;
attr Gast_dummy room Kalender&lt;br /&gt;
attr Gast_dummy setList ja nein&lt;br /&gt;
attr Gast_dummy webCmd ja:nein&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und nun mussten die Notifys definiert werden, um bei entsprechenden Einträgen im Google-Kalender den Status der&lt;br /&gt;
Dummies zu setzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {\&lt;br /&gt;
Kalenderstart(&amp;quot;$EVENT&amp;quot;);;\&lt;br /&gt;
}&lt;br /&gt;
define Kalender_Christian_Ende notify Kalender_Christian:modeEnded.*googlecom.* {\&lt;br /&gt;
Kalenderende(&amp;quot;$EVENT&amp;quot;);;\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um nicht für verschiedene Dummies immer einzelne Notifys zu bauen, wird hier bei mir je eine Funktion aus meiner&lt;br /&gt;
99_MyUtils.pm [[99 myUtils anlegen]] aufgerufen und das Event als Parameter übergeben. Die beiden zugehörigen&lt;br /&gt;
Funktionen für den Start und das Ende des Kalenderevents schauen so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;sub&lt;br /&gt;
Kalenderstart ($)&lt;br /&gt;
{&lt;br /&gt;
	my ($Ereignis) = @_;&lt;br /&gt;
	my @Ereignisarray = split(/.*:\s/,$Ereignis);&lt;br /&gt;
	my $Ereignisteil1 = $Ereignisarray[1];&lt;br /&gt;
	my @uids=split(/;/,$Ereignisteil1);&lt;br /&gt;
	foreach my $uid (@uids) {&lt;br /&gt;
		my $Kalendertext = fhem(&amp;quot;get Kalender_Christian summary $uid&amp;quot;);&lt;br /&gt;
		if ($Kalendertext =~ /Urlaub/) {&lt;br /&gt;
			fhem(&amp;quot;set Urlaub_dummy ja&amp;quot;);&lt;br /&gt;
		};&lt;br /&gt;
		if ($Kalendertext =~ /Besuch/) {&lt;br /&gt;
			fhem(&amp;quot;set Gast_dummy ja&amp;quot;);&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
sub Kalenderende ($) {&lt;br /&gt;
	my ($Ereignis) = @_;&lt;br /&gt;
	my @Ereignisarray = split(/.*:\s/,$Ereignis);&lt;br /&gt;
	my $Ereignisteil1 = $Ereignisarray[1];&lt;br /&gt;
	my @uids=split(/;/,$Ereignisteil1);&lt;br /&gt;
	foreach my $uid (@uids) {&lt;br /&gt;
		my $Kalendertext = fhem(&amp;quot;get Kalender_Christian summary $uid&amp;quot;);&lt;br /&gt;
		if ($Kalendertext =~ /Urlaub/) {&lt;br /&gt;
			fhem(&amp;quot;set Urlaub_dummy nein&amp;quot;);&lt;br /&gt;
		};&lt;br /&gt;
		if ($Kalendertext =~ /Besuch/) {&lt;br /&gt;
			fhem(&amp;quot;set Gast_dummy nein&amp;quot;);&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Erläuterung: Als Ereignis wird z.B. &amp;quot;&#039;&#039;modeStarted: 9aas2amo7td47th4sf7mlocl48googlecom&#039;&#039;&amp;quot; oder bei 2 gleichzeitigen&lt;br /&gt;
Ereignissen: &amp;quot;&#039;&#039;modeStarted: arqpe2a2snu6qn64dt0men7nd0googlecom;j0pjiupfb1sk3m5s64hbeo6880googlecom&#039;&#039;&amp;quot;&lt;br /&gt;
übergeben. Da uns aber nur die eindeutige UID interessiert, wird das Ergeinis beim Vorkommen der Zeichen &amp;quot;: Leerzeichen&amp;quot;&lt;br /&gt;
also nach modeStarted: geteilt (&#039;&#039;split(/.*:\s/,$Ereignis&#039;&#039;)). Die beiden Teile werden in ein Array (@Ereignisarray) gespeichert.&lt;br /&gt;
Und als 2. Element in dem Array ist nun die uns interessierende UID ($Ereignisarray[1]) vorhanden, mit welcher wir weiter&lt;br /&gt;
arbeiten. Da auch mit dem Fall mehrerer gleichzeitiger Ereignisse umgegangen werden können soll, müssen wir bei mehreren&lt;br /&gt;
UID´s diese wieder splitten. Diesmal beim Vorkommen des Semikolons als Trennzeichen (&#039;&#039;split(/;/,$Ereignisteil1&#039;&#039;)). Auch die&lt;br /&gt;
UID´s werden wieder in einem Array gespeichert und dann mittels der foreach-Schleife nacheinander abgearbeitet. Und&lt;br /&gt;
hierbei wird abhängig von der mittels UID abgerufenen Kalenderbeschreibung (&#039;&#039;fhem(&amp;quot;get Kalender_Christian summary&lt;br /&gt;
$uid&#039;&#039;&amp;quot;)) ein Vergleich auf die Werte &amp;quot;Besuch&amp;quot; oder &amp;quot;Urlaub&amp;quot; durchgeführt (&#039;&#039;if ($Kalendertext =~ /Urlaub/&#039;&#039;)) und davon&lt;br /&gt;
abhängig der Dummy-Status gesetzt.&lt;br /&gt;
Abhängig von diesen Dummies reagiert dann meine Rollosteuerung.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>SirUli</name></author>
	</entry>
</feed>