<?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=Arne</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=Arne"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Arne"/>
	<updated>2026-04-13T17:07:57Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=30069</id>
		<title>Mi vacuum</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=30069"/>
		<updated>2019-04-03T13:00:11Z</updated>

		<summary type="html">&lt;p&gt;Arne: Alternative Installation von 72_XiaomiDevice.pm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
=Mi Vacuum=&lt;br /&gt;
Wie der preiswerte Staubsaugerroboter auch auf FHEM hört...&lt;br /&gt;
&lt;br /&gt;
==Für wen ist die Anleitung gedacht?==&lt;br /&gt;
Ich gehe davon aus, dass ihr ein funktionierendes FHEM auf einem Linux Rechner (Debian) betreibt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin denke ich, dass euer Hauptarbeitsrechner unter Windows läuft.&lt;br /&gt;
&lt;br /&gt;
Als Smartphone OS Android (wer Apple hat, kann gerne die Token-Auslese-Geschichte hier beschreiben).&lt;br /&gt;
&lt;br /&gt;
Um das Teil auch von Alexa aus ein und aus zu schalten, sollte auch die Installation von Alexa in FHEM fertig sein.&lt;br /&gt;
&lt;br /&gt;
==Die Einrichtung des Moduls==&lt;br /&gt;
Das ist insofern spannend, als das Modul nicht offiziell in FHEM eingecheckt ist. Man muss also das Modul runterladen, auf den FHEM Rechner bringen etc...&lt;br /&gt;
&lt;br /&gt;
===Vorarbeiten (Linux)===&lt;br /&gt;
Zunächst fangen wir mal auf unserem FHEM Rechner an. Mit Putty verbinden wir uns per SSH mit dem FHEM Computer.&lt;br /&gt;
&lt;br /&gt;
Folgende Befehle können benötigt werden (Debian):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libdigest-md5-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-cbc-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Rijndael_PP&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-ecb-perl&amp;lt;/code&amp;gt; (nur nötig, wenn ihr einen verschlüsselten Token mit 96 Zeichen habt)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Cipher::AES&amp;lt;/code&amp;gt; (nur nötig, wenn Crypt::Rijndael_PP aus irgendwelchen Gründen nicht funktioniert)&lt;br /&gt;
Wenn bei dem ein oder anderen Modul die Meldung kommt, dass es schon installiert ist, einfach mit dem nächsten Befehl weiter machen. Das CPAN Teil würde ich am Schluss machen, das braucht ziemlich lang zum installieren.&lt;br /&gt;
&lt;br /&gt;
===Vorarbeiten am Smartphone (Token)===&lt;br /&gt;
Das Problem ist folgendes:&lt;br /&gt;
&lt;br /&gt;
Wenn der Roboter mit dem WLAN verbunden wird, generiert er einen Token. Das ist ein Schlüssel, ohne den er sich nicht steuern lässt. Damit FHEM drauf zugreifen kann, benötigt man diesen Token.&lt;br /&gt;
&lt;br /&gt;
Mit den neueren Versionen der MiHome App klappt das Auslesen der Tokens leider nicht mehr.&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei Android Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Ich gehe davon aus, dass der Staubsauger mit der original MiHome App eingebunden ist und funktioniert. (Ich habe bei der Einrichtung des Servers =&amp;gt; &amp;quot;other&amp;quot; gewählt. Offenbar wollen neuere Staubsauger sich mit &amp;quot;China Mainland&amp;quot; nicht mehr verbinden. Tut hier an dieser Stelle zwar nichts zur Sache, aber vielleicht hilft es dem ein oder anderen. Wenn man die Region gewechselt hat, muss man auch den Staubsauger neu einbinden)&lt;br /&gt;
&lt;br /&gt;
* MiHome löschen&lt;br /&gt;
* alte MiHome suchen (APKMirror z.B., Version 5.0.19 hat bei mir funktioniert, unsichere Quellen müssen erlaubt sein)&lt;br /&gt;
* runtergeladene MiHome App öffnen und anmelden (sollte ganz normal den Sauger finden)&lt;br /&gt;
* USB-Debugging am Handy einschalten (Entwickleroptionen...)&lt;br /&gt;
* Handy mit USB Kabel und PC verbinden&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] 1.6 runterladen und öffnen&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] erzeugt nun am Handy ein Backup&lt;br /&gt;
* anschließend zeigt es den Token direkt am PC an&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei iOS Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen des Tokens mit iOS Endgeräten kann die Anleitung unter folgendem Link befolgt werden: [https://forum.smartapfel.de/forum/thread/370-xiaomi-token-auslesen/]&lt;br /&gt;
&lt;br /&gt;
===Installation des inoffiziellen Moduls===&lt;br /&gt;
Der folgende Teil ist für völlige Noobs. Wenn ihr einen eleganteren Weg kennt, her damit.&lt;br /&gt;
&lt;br /&gt;
:Alternativer Weg: (als User fhem angemeldet)&amp;lt;br /&amp;gt;&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;wget -O /opt/fhem/FHEM/72_XiaomiDevice.pm https://raw.githubusercontent.com/mhop/fhem-mirror/master/fhem/FHEM/72_XiaomiDevice.pm;&amp;lt;br /&amp;gt;chown fhem:dialout /opt/fhem/FHEM/72_XiaomiDevice.pm&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst bitte das Modul aus dem Forum herunterladen.&lt;br /&gt;
[https://forum.fhem.de/index.php/topic,73052.0.htmlm Hier] befindet sich der Thread. Markus M. hat sich die Mühe gemacht, ein Modul zu schreiben. Solange es nicht offiziell eingecheckt ist, muss man es händisch installieren. Das kann man wie folgt machen:&lt;br /&gt;
* das Modul zunächst auf seinem Windows PC speichern&lt;br /&gt;
&lt;br /&gt;
Wie kommt das Modul nun auf den eigenen RasPi?&lt;br /&gt;
&lt;br /&gt;
Ich nutze dafür einen kleinen HTTP Server auf meinem Windows Rechner: [http://miniweb.sourceforge.net/ MiniWeb]&lt;br /&gt;
&lt;br /&gt;
Dieses Tool runterladen und irgendwohin entpacken. Zum starten habe ich eine kleine Batchdatei geschrieben:&lt;br /&gt;
&amp;lt;pre&amp;gt;D:\Software\MiniWebServer\miniweb\miniweb.exe -p 80&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die sorgt nur dafür, dass der Server auf Port 80 läuft.&lt;br /&gt;
&lt;br /&gt;
Im entpackten Verzeichnis ist ein Unterverzeichnis mit dem Namen &amp;quot;htdocs&amp;quot;. Dahin kopieren wir das soeben runtergeladene Modul aus dem Forum-Thread.&lt;br /&gt;
&lt;br /&gt;
Langsam sollte das cpan Tool auf unserer SSH Verbindung durchgelaufen sein.&lt;br /&gt;
&lt;br /&gt;
Nun wechseln wir (auf dem Linux Rechner) in das FHEM Verzeichnis (cd /opt/fhem/FHEM).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://IP-Adresse_EUres_Windows_Rechners/72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bringt die Datei in euer FHEM Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Jetzt noch die Rechte anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown fhem:dialout /opt/fhem/FHEM/72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt können wir auf die FHEM Oberfläche wechseln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;reload 72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und unser runtergeladenes Modul steht in FHEM zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
==Einrichten des Moduls==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Mi_Vacuum XiaomiDevice 192.168.222.77 55387753545937326a33396943557999&lt;br /&gt;
&lt;br /&gt;
attr Mi_Vacuum subType VacuumCleaner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und schon (=etwa nach 10 Sekunden) sollte euer Roboter in FHEM mit ganz vielen Readings auftauchen.&lt;br /&gt;
&lt;br /&gt;
==Anwendung: Sprachsteuerung mit Alexa (einfach, ein und aus)==&lt;br /&gt;
Wie bindet man das jetzt schnell in Alexa ein?&lt;br /&gt;
&lt;br /&gt;
Wir legen uns in FHEM einen Dummy an. Dieser wird ein Switch (on off). Dazu noch ein DOIF oder ein notify, welches diesen Switch überwacht. Je nach Status des Dummys schalten wir den Roboter.&lt;br /&gt;
&lt;br /&gt;
Ein List meines Dummys:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Internals: &lt;br /&gt;
   CFGFN &lt;br /&gt;
   NAME       Mi_Vacuum_Staubsauger &lt;br /&gt;
   NR         719473 &lt;br /&gt;
   STATE      on &lt;br /&gt;
   TYPE       dummy &lt;br /&gt;
   Readings: &lt;br /&gt;
     2017-09-18 21:10:12   state           on &lt;br /&gt;
 Attributes: &lt;br /&gt;
   alexaName  Mi_Vacuum_Staubsauger &lt;br /&gt;
   genericDeviceType switch &lt;br /&gt;
   room       alexa &lt;br /&gt;
   setList    on off &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mein DOIF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Mi_Vacuum DOIF ([Mi_Vacuum_Staubsauger:&amp;quot;on&amp;quot;]) (set Mi_Vacuum start) DOELSE (set Mi_Vacuum charge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut do always nicht vergessen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den Dummy setzen wir in den Raum, der unsere Alexa Geräte beinhaltet. Nun den Alexa FHEM Service neu starten. Anschließend sollte eine Suche nach neuen Geräten in Alexa unseren Dummy finden. Für diesen legen wir in Alexa einen neuen Raum an, z.B. Staubsauger.&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;Alexa schaltet den Staubsauger ein&amp;quot; lässt unseren Mi-Vacuum loslegen. &amp;quot;Alexa schalte den Staubsauger aus&amp;quot; schickt ihn wieder zurück zu seiner Station.&lt;br /&gt;
&lt;br /&gt;
==Zonenreinigung==&lt;br /&gt;
Um nur Teilbereiche einer Wohnung zu reinigen, ist es möglich über das Modul Zonen zu definieren. Hierzu ist es notwendig, die Koordinaten der gewünschten Zone zu ermitteln. Hierzu eignet sich die [https://xiaomi.flole.de/ FloleVac App] die entweder auf einem Android Device oder auf einem Android Emulator (z.B. [https://www.bluestacks.com/download.html BlueStacks]) verwendet werden kann. In der App kann man in der Karte eine Zone für die Reinigung markieren und durch langes Gedrückthalten des &amp;quot;Reinigen-Buttons&amp;quot; in der FloleVac App die Koordinaten dieser Zone in die Zwischenablage kopieren. &lt;br /&gt;
&lt;br /&gt;
Mit diesen Koordindaten im Format [16200,27250,31650,27650,1] kann man dann loslegen die Zonen in FHEM zu definieren:&lt;br /&gt;
&lt;br /&gt;
Entweder direkt über die Werte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set vacuum zone 16200,27250,31650,27650,1 23700,23050,25200,24200,2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder über die passenden Attribute erst ein Alias anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr vacuum zone_names home:[16200,27250,31650,27650,1],[23700,23050,25200,24200,2] livingroom:[16200,26250,23000,30150,1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Alias kann dann wie folgt genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set vacuum zone home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
* {{Link2Forum|Topic=73052|LinkText=Forums-Thread}}&lt;br /&gt;
* {{Link2Forum|Topic=76940|LinkText=Diskussionsthread}}&lt;br /&gt;
* [http://miniweb.sourceforge.net/ MiniWeb], kleiner WebServer für Windows&lt;br /&gt;
* [https://xiaomi.flole.de/ Flole], alternative App für Android, die das Token nach GoogleDrive exportiert&lt;br /&gt;
* [http://www.roboter-forum.com/forumdisplay.php?130-Xiaomi Roboter-Forum] deutschsprachiges Forum, welches sich mit dem Mi Vacuum beschäftigt (auch vor dem Kauf des Roboters lohnt sich ein Besuch dort)&lt;br /&gt;
* [https://paypal.me/mm0 PayPal]-Link, um Markus M. Dankeschön zu sagen&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=27449</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=27449"/>
		<updated>2018-07-14T22:09:52Z</updated>

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

		<summary type="html">&lt;p&gt;Arne: Weiteren Link hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Antworten auf häufig gestellte Fragen im Bereich [[:Kategorie:EIB/KNX|EIB (/KNX)]]&lt;br /&gt;
&lt;br /&gt;
;Alle Lampen wurden automatisch erkannt und können nun geschaltet werden. Wie erkenne ich aber nun die Schalter?&lt;br /&gt;
:Im EIB sind alle Geräte intelligent und kommunizieren im Normalfall dezentral. Das heisst, ein Taster steuert direkt eine Lampe an, indem er den entsprechenden Befehl auf den Bus sendet. Somit kann FHEM nur erkennen, dass ein entsprechender Schaltbefehl für eine Lampe von einem anderen Gerät gesendet wurde, aber nicht von welchem.&lt;br /&gt;
:Diese Kommunikation lässt sich aber auch zentralisieren. Ein Taster sendet dann einen Befehl an eine Adresse, die keiner Lampe zugeordnet ist. Diesen Befehl kann dann eine zentrale Steuerung (wie FHEM) aufgreifen und in Befehle für die Lampen umwandeln. Nachteil: fällt die zentrale Steuerung aus, fällt das ganze System aus. &lt;br /&gt;
:Oftmals ist der Mittelweg der richtige: alle Lampen werden direkt von Tastern gesteuert, man benutzt aber zusätzliche Taster um spezielle Funktionalitäten (z.B. Lichtzenen) zu realiseren. Ein Ausfall der zentralen Steuerung legt somit nicht das komplette System lahm.&lt;br /&gt;
:Um das Verhalten der Taster zu ändern, müssen jedoch die Taster direkt umprogrammiert werden. Dies ist nicht mit FHEM möglich, sondern nur mit der Zusatzsoftware [https://redaktion.knx-user-forum.de/lexikon/ets/ ETS]. Siehe auch [https://de.wikipedia.org/wiki/KNX-Standard#Steuerung_und_Programmierung KNX Programmierung (Wikipedia)]&lt;br /&gt;
&lt;br /&gt;
;Ist es möglich den Status von EIB-Sensoren direkt abzufragen anstatt warten zu müssen, bis ein neuer Wert auf dem Bus auftaucht?&lt;br /&gt;
:Der EIB und entsprechende Geräte verfügen über dieses Feature, allerdings habe ich noch nicht herausgefunden, wie man mit FHEM den Status abfragt. Einige EIB-Sensoren erlauben jedoch auch eine Programmierung über die ETS, so dass sie in regelmässigen Abständen ihren aktuellen Status an den Bus senden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FAQ]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EIB_FAQ&amp;diff=20005</id>
		<title>EIB FAQ</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EIB_FAQ&amp;diff=20005"/>
		<updated>2017-02-15T19:59:11Z</updated>

		<summary type="html">&lt;p&gt;Arne: Link aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Antworten auf häufig gestellte Fragen im Bereich [[:Kategorie:EIB/KNX|EIB (/KNX)]]&lt;br /&gt;
&lt;br /&gt;
;Alle Lampen wurden automatisch erkannt und können nun geschaltet werden. Wie erkenne ich aber nun die Schalter?&lt;br /&gt;
:Im EIB sind alle Geräte intelligent und kommunizieren im Normalfall dezentral. Das heisst, ein Taster steuert direkt eine Lampe an, indem er den entsprechenden Befehl auf den Bus sendet. Somit kann FHEM nur erkennen, dass ein entsprechender Schaltbefehl für eine Lampe von einem anderen Gerät gesendet wurde, aber nicht von welchem.&lt;br /&gt;
:Diese Kommunikation lässt sich aber auch zentralisieren. Ein Taster sendet dann einen Befehl an eine Adresse, die keiner Lampe zugeordnet ist. Diesen Befehl kann dann eine zentrale Steuerung (wie FHEM) aufgreifen und in Befehle für die Lampen umwandeln. Nachteil: fällt die zentrale Steuerung aus, fällt das ganze System aus. &lt;br /&gt;
:Oftmals ist der Mittelweg der richtige: alle Lampen werden direkt von Tastern gesteuert, man benutzt aber zusätzliche Taster um spezielle Funktionalitäten (z.B. Lichtzenen) zu realiseren. Ein Ausfall der zentralen Steuerung legt somit nicht das komplette System lahm.&lt;br /&gt;
:Um das Verhalten der Taster zu ändern, müssen jedoch die Taster direkt umprogrammiert werden. Dies ist nicht mit FHEM möglich, sondern nur mit der Zusatzsoftware [https://redaktion.knx-user-forum.de/lexikon/ets/ ETS].&lt;br /&gt;
&lt;br /&gt;
;Ist es möglich den Status von EIB-Sensoren direkt abzufragen anstatt warten zu müssen, bis ein neuer Wert auf dem Bus auftaucht?&lt;br /&gt;
:Der EIB und entsprechende Geräte verfügen über dieses Feature, allerdings habe ich noch nicht herausgefunden, wie man mit FHEM den Status abfragt. Einige EIB-Sensoren erlauben jedoch auch eine Programmierung über die ETS, so dass sie in regelmässigen Abständen ihren aktuellen Status an den Bus senden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FAQ]]&lt;br /&gt;
[[Kategorie:EIB/KNX]]&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=15296</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=15296"/>
		<updated>2016-05-05T21:30:40Z</updated>

		<summary type="html">&lt;p&gt;Arne: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das perl JSON modul installiert sein. &lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr teleBot pollingTimeout 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Registrierung eines neuen Bot ==&lt;br /&gt;
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.&lt;br /&gt;
Hier ein Beispiel, wie so ein Chat aussehen könnte:&lt;br /&gt;
&amp;lt;pre&amp;gt;Client: &lt;br /&gt;
/newbot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Alright, a new bot. How are we going to call it? Please choose a name for your bot. &lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
Mein Name &lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Good. Now let&#039;s choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Sorry, this username is already taken. Think of something different.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Done! Congratulations on your new bot.&lt;br /&gt;
You will find it at telegram.me/fhem1234_bot.&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.&lt;br /&gt;
----------------&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz &lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&amp;lt;br&amp;gt;Beispielchat:&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/setprivacy&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Choose a bot to change group messages settings.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
@fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
&#039;Enable&#039; - your bot will only receive messages that either start with the &#039;/&#039; symbol or mention the bot by username.&lt;br /&gt;
&#039;Disable&#039; - your bot will receive all messages that people send to groups.&lt;br /&gt;
Current status is: ENABLED&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Disable&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Success! The new status is: DISABLED. /help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Wenn die Privacy-Einstellungen nicht auf &#039;Disabled&#039; gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.&lt;br /&gt;
&lt;br /&gt;
==== Supergroups / Supergruppen ====&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.&lt;br /&gt;
&lt;br /&gt;
=== Versand von SVG-Plots ===&lt;br /&gt;
&lt;br /&gt;
Der Versand ist nicht direkt über das Device möglich, jedoch über den Perl-Befehl &#039;TelegramBot_ExecuteCommand&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei ist die Ziel-ID ohne das @-Zeichen, Anführungszeichen o.ä. anzugeben. Das Ziel kann auch eine Gruppen-ID (beginnend mit dem Minus-Zeichen) sein. Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{fhem &amp;quot;set mein_telegramBot message \@meine_ZielID Mein Text&amp;quot; ;; TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voraussetzungen für den Versand von SVG-Plots ====&lt;br /&gt;
Es muss das Modul libimage-librsvg-perl installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libimage-librsvg-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. sind weitere Module erforderlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libgd-graph-perl&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libgd-text-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Favoriten für Kommandos anlegen ====&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = set TYPE=ROLLADEN pos 100&lt;br /&gt;
&lt;br /&gt;
/short2 = set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.&lt;br /&gt;
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[Rollaeden zu ]=set TYPE=ROLLADEN pos 100;[Rollaeden auf]=set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = Rollaeden zu&lt;br /&gt;
&lt;br /&gt;
/short2 = Rollaeden auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=8522</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=8522"/>
		<updated>2014-11-18T22:26:50Z</updated>

		<summary type="html">&lt;p&gt;Arne: /* Zweistufiges Modell für Module */&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_DevIni&amp;lt;/code&amp;gt;t 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;loglevel:1,2,3,4,5&lt;br /&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;
=== 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;
  my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
&lt;br /&gt;
  return &amp;quot;&amp;quot; if(AttrVal($ownName, &amp;quot;disable&amp;quot;, undef)); # Abbruch wenn das Attribut disable gesetzt ist&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;
&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;
== Noch zu beschreiben ==&lt;br /&gt;
* Zweistufiges Modell für Module&lt;br /&gt;
* Funktion X_Ready ...&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>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=YAF&amp;diff=3248</id>
		<title>YAF</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=YAF&amp;diff=3248"/>
		<updated>2013-10-28T02:07:27Z</updated>

		<summary type="html">&lt;p&gt;Arne: Installationsbefehl für openSUSE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;YAF&#039;&#039;&#039; ist ein Floorplan, der es erlaubt, Geräte per Drag&amp;amp;Drop zu platzieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:YAF_Beispielansicht.png|600px|thumb|right|YAF mit mehreren Widgets]]&lt;br /&gt;
&lt;br /&gt;
== Projekt YAF ==&lt;br /&gt;
&lt;br /&gt;
YAF entstand als Projektarbeit von Daniel Weisensee und Markus Mangei an der Hochschule Karlsruhe Technik und Wirtschaft. &lt;br /&gt;
&lt;br /&gt;
Es steht für “Yet Another Floorplan” und soll eine Alternative zum bisher vorhandenen Floorplan bieten. YAF basiert auf ClientSeite&lt;br /&gt;
aus den JavaScript Frameworks JQuery und JQuery UI, serverseitig werden die CPAN Module &amp;lt;strike&amp;gt;XML::LibXML (bindet libxml2 an Perl an) und&amp;lt;/strike&amp;gt; JSON::XS verwendet, um die Konfiguration zu persisitieren und um Daten zwischen der Oberfläche und dem Server austauschen zu können.&lt;br /&gt;
&lt;br /&gt;
Durch die Erweiterbarkeit von Widgets soll YAF flexibel gehalten werden. Mit Hilfe dieser Schnittstelle können problemlos Widgets von verschiedenen Entwicklern veröffentlicht werden, ohne dass sich diese über gewünschte Änderungen am YAF Code mit der Community&lt;br /&gt;
abstimmen müssen. Es soll ähnlich dem Prinzip der Widgets unter Android oder Windows funktionieren. Widgets sollen speziell für FHEM Plugins geschrieben werden, um somit möglichst komfortable Oberflächen bieten zu können.&lt;br /&gt;
&lt;br /&gt;
* Das Projekt ist freie Software unter der GNU General Public License und befindet sich auf dem offiziellen FHEM SourceForge.net Repository: https://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/contrib/YAF/&lt;br /&gt;
&lt;br /&gt;
* Im FHEM Forum gibt es einen Thread mit dem Titel [http://forum.fhem.de/index.php/topic,12629.0.html Yet Another Floorplan YAF]&lt;br /&gt;
&lt;br /&gt;
== Installation==&lt;br /&gt;
=== Installation mit FHEM Update ===&lt;br /&gt;
&amp;lt;pre&amp;gt;update thirdparty http://svn.code.sf.net/p/fhem/code/trunk/fhem/contrib/YAF/ yaf&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
Das PERL Modul JSON::XS [http://search.cpan.org/~mlehmann/JSON-XS-2.34/XS.pm] ist notwendig.&lt;br /&gt;
&lt;br /&gt;
Installation z.B. über den Befehl &lt;br /&gt;
 /opt/bin/cpanm JSON::XS&lt;br /&gt;
oder&lt;br /&gt;
 sudo apt-get install libjson-xs-perl&lt;br /&gt;
oder&lt;br /&gt;
 zypper in perl-JSON-XS   (für PCs mit openSUSE)&lt;br /&gt;
&lt;br /&gt;
(Der korrekte Befehl ist von der verwendeten Hardware abhängig)&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
YAF wird durch die folgende Definition aktivert:&lt;br /&gt;
&lt;br /&gt;
 define yaf YAF&lt;br /&gt;
&lt;br /&gt;
Die weitere Konfiguration kann komplett über das YAF Interface erfolgen.&lt;br /&gt;
&lt;br /&gt;
Gespeichert wird die Konfiguration in den Attributen des YAF Device:&lt;br /&gt;
 attr yaf backgrounds 1,1,1,/path/to/local/image;;2,1,1,http://path.to/remote/image.png&lt;br /&gt;
 attr yaf refresh_interval 10&lt;br /&gt;
 attr yaf views 1,Haus;;2,Test&lt;br /&gt;
&lt;br /&gt;
== Widgets ==&lt;br /&gt;
&lt;br /&gt;
Ein Widget ist die Darstellung eines Gerätes (Device) auf dem Floorplan. Die Konfiguration des Widget wird im Device unter der Eigenschaft &amp;lt;code&amp;gt;yaf_#&amp;lt;/code&amp;gt; gespeichert, wobei &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; die Nummer des YAF-View ist, in der das Widget angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 attr somedevice yaf_1 id=3,fhemname=somedevice,x_pos=432,y_pos=205,name=fhttk,&lt;br /&gt;
&lt;br /&gt;
=== fhttk ===&lt;br /&gt;
&lt;br /&gt;
Zur Anzeige von [[FHT80TF|FHTTK  Fenstersensoren]].&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
&lt;br /&gt;
 define CUL_FHTTK_xxxxxx CUL_FHTTK xxxxxx&lt;br /&gt;
 attr CUL_FHTTK_xxxxxx devStateIcon Closed:signal_Fenster_Offen.off Open:signal_Fenster_Offen.on&lt;br /&gt;
 attr CUL_FHTTK_xxxxxx yaf_2 id=10,showlabel=0,fhemname=CUL_FHTTK_xxxxxx,y_pos=410,x_pos=379,name=fhttk,showicon=1,&lt;br /&gt;
&lt;br /&gt;
=== fs20st ===&lt;br /&gt;
&lt;br /&gt;
=== fs20easylamp ===&lt;br /&gt;
&lt;br /&gt;
=== generic ===&lt;br /&gt;
Erlaubt das Einfügen beliebiger Geräte im Plan.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
Die Widgets im Beispielplan auf dieser Seite sind &amp;quot;generic&amp;quot;-Widgets (Bis auf die FHT80-Heizungsanzeigen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anzeige eines [[FS20_ST_Steckdosenfunkschalter|FS20 Steckdosenschalters]] mit Schaltfunktion im Plan&#039;&#039;&#039;&lt;br /&gt;
 define FS20_xxxxyy FS20 xxxx yy&lt;br /&gt;
 attr FS20_xxxxyy alias Testlampe&lt;br /&gt;
 attr FS20_xxxxyy devStateIcon on:FS20.on off:FS20.off toggle:toggle&lt;br /&gt;
 attr FS20_xxxxyy yaf_2 id=12,name=generic,showicon=1,fhemname=FS20_xxxxyy,showlabel=1,y_pos=209,x_pos=403,labeltype=alias,_on=off,_off=on&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anzeige der Ist-Temperatur einer [[FHT80b|FHT80 Heizungssteuerung]] mit dem Inhalt des &amp;quot;comment&amp;quot; Felds als Label&#039;&#039;&#039;&lt;br /&gt;
 define FHT_xxxx FHT xxxx&lt;br /&gt;
 attr FHT_xxxx comment Eltern&lt;br /&gt;
 attr FHT_xxxx yaf_2 id=14,name=generic,fhemname=FHT_xxxx,showlabel=1,x_pos=415,y_pos=431,labeltype=comment,statetype=measured-temp,&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anzeige eines [[FHT80TF|FHTTK  Fenstersensors]]&#039;&#039;&#039;&lt;br /&gt;
 define CUL_FHTTK_xyz CUL_FHTTK xyz&lt;br /&gt;
 attr CUL_FHTTK_xyz devStateIcon Closed:signal_Fenster_Offen.off Open:signal_Fenster_Offen.on&lt;br /&gt;
 attr CUL_FHTTK_xyz yaf_2 id=4,fhemname=CUL_FHTTK_xyz,x_pos=27,y_pos=261,name=generic,showlabel=0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Präsenzanzeige eines Handies im WLAN mit [[PRESENCE]]&#039;&#039;&#039;&lt;br /&gt;
 define presence_android PRESENCE lan-ping 10.1.2.3&lt;br /&gt;
 attr presence_android devStateIcon present:WLAN_Status.1 absent:WLAN_Status.0&lt;br /&gt;
 attr presence_android yaf_2 id=1,fhemname=presence_android,showlabel=0,y_pos=266,x_pos=46,name=generic,showicon=1,labeltype=alias,&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anzeige eines Homematic [[HM-Sec-WDS Funk-Wassermelder]]&#039;&#039;&#039;&lt;br /&gt;
 define CUL_HM_HM_SEC_WDS_xyz CUL_HM xyz&lt;br /&gt;
 attr CUL_HM_HM_SEC_WDS_xyz alias WassermelderHeizung&lt;br /&gt;
 attr CUL_HM_HM_SEC_WDS_xyz devStateIcon dry:wasseralarm wet:wasseralarm_rot damp:wasseralarm_rot&lt;br /&gt;
 attr CUL_HM_HM_SEC_WDS_xyz yaf_2 id=5,fhemname=CUL_HM_HM_SEC_WDS_xyz,x_pos=324,y_pos=139,name=generic,labeltype=alias,&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|interne ID des Widgets, immer der erste Parameter&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;fhemname&amp;lt;/code&amp;gt;&lt;br /&gt;
|interner Name des Geräte im FHEM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;x_pos&amp;lt;/code&amp;gt;&lt;br /&gt;
|X-Koordinate des Widget&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;y_pos&amp;lt;/code&amp;gt;&lt;br /&gt;
|Y-Koordinate des Widget&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Typ des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;labeltype&amp;lt;/code&amp;gt;&lt;br /&gt;
|Welcher Eigenschaftswert soll als Label angezeigt werden?&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;statetype&amp;lt;/code&amp;gt;&lt;br /&gt;
|Welches Reading soll als Wert angezeigt werden?&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;showlabel&amp;lt;/code&amp;gt;&lt;br /&gt;
|Soll das Label angezeigt werden? (1/0)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;showicon&amp;lt;/code&amp;gt;&lt;br /&gt;
|Soll das devStateIcon angezeigt werden? (1/0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltfunktion ====&lt;br /&gt;
Mit zusätzlichen Parametern kann eine Schaltfunktion konfiguriert werden, womit im Plan durch Klicken auf das Widget eine Aktion des Gerätes durchgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 _on=off,_off=on&lt;br /&gt;
Im Beispiel wird nach dem Klick auf das Widget der aktuelle Status des Gerätes geprüft. Ist der Status &amp;quot;on&amp;quot;, wird der &amp;quot;off&amp;quot; Befehl gesendet. Ist der Status &amp;quot;off&amp;quot;, wird der &amp;quot;on&amp;quot; Befehl gesendet. Zwischen dem Unterstrich &amp;quot;_&amp;quot; und dem Gleichheitszeichen (=) können zur Definition des Status reguläre Ausdrücke verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== fht80 ===&lt;br /&gt;
Zeigt Informationen über eine [[FHT80b|FHT80]] Heizungssteuerung an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aussehen des Widgets ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div aria-disabled=&amp;quot;true&amp;quot; style=&amp;quot;text-align:center&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;widget_fht80_alias&amp;quot; style=&amp;quot;font-size: 1.2em;&amp;quot;&amp;gt;Heizung&amp;amp;nbsp;Kinderzimmer&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;span title=&amp;quot;2013-09-08 11:32:11&amp;quot;&amp;gt;22.9&amp;lt;/span&amp;gt; °C &amp;lt;span title=&amp;quot;auto&amp;quot;&amp;gt;⊗&amp;lt;/span&amp;gt; &amp;lt;span title=&amp;quot;Actuator: 0%&amp;quot;&amp;gt;16.0 °C&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 Links: Ist-Temperatur (Tooltip: Timestamp des Readings)&lt;br /&gt;
 Mitte: Automatischer Modus (⊗) oder manueller Modus (⊕)&lt;br /&gt;
 Rechts: Zieltemperatur (Tooltip: Öffnungsgrad des Stellmotors)&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration unterstützt nicht alle Parameter über das YAF Interface, einige müssen über FHEMWeb gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
 attr FHT_abcd yaf_1 id=14,fhemname=FHT_abcd,y_pos=235,x_pos=239,name=fht80,labeltype=Alias,&lt;br /&gt;
 attr FHT_wxyz yaf_1 id=4,fhemname=FHT_wxyz,y_pos=241,x_pos=434,name=fht80,labeltype=Alias,size=0.8,&lt;br /&gt;
 attr FHT_lmno yaf_1 id=10,fhemname=FHT_lmno,nomode=1,y_pos=183,x_pos=533,name=fht80,labeltype=Comment,size=0.7,&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|interne ID des Widgets, immer der erste Parameter&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;fhemname&amp;lt;/code&amp;gt;&lt;br /&gt;
|interner Name des Geräte im FHEM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;x_pos&amp;lt;/code&amp;gt;&lt;br /&gt;
|X-Koordinate des Widget&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;y_pos&amp;lt;/code&amp;gt;&lt;br /&gt;
|Y-Koordinate des Widget&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Typ des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;labeltype&amp;lt;/code&amp;gt;&lt;br /&gt;
|Welcher Eigenschaftswert soll als Label angezeigt werden?&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;nomode&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ausblenden der Modusanzeige&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt;&lt;br /&gt;
|Relative Textgröße&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== webcam ===&lt;br /&gt;
&lt;br /&gt;
Blendet ein Webcambild im Floorplan ein, basierend auf einem [[dummy]] oder [[PRESENCE]] Device.&lt;br /&gt;
&lt;br /&gt;
Das Widget kann aktuell nur über FHEMWeb konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
&#039;&#039;&#039;Anzeige des statischen Bildes einer Webcam, deren Status per PRESENCE ping überprüft wird&#039;&#039;&#039;&lt;br /&gt;
 define webcam PRESENCE lan-ping 10.x.y.z&lt;br /&gt;
 attr webcam yaf_2 id=15,fhemname=webcam,showmethod=img,x_pos=224,y_pos=88,name=webcam,path=/image.jpg,hover=0,user=username,pass=password&lt;br /&gt;
&lt;br /&gt;
Die Definition führt zur Anzeige des Bildes unter &amp;lt;nowiki&amp;gt;http://username:password@10.x.y.z/image.jpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Einsatz eines Dummy device muss im yaf-Attribut zusätzlich der Parameter &amp;quot;address&amp;quot; gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|interne ID des Widgets, immer der erste Parameter&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;fhemname&amp;lt;/code&amp;gt;&lt;br /&gt;
|interner Name des Geräte im FHEM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;x_pos&amp;lt;/code&amp;gt;&lt;br /&gt;
|X-Koordinate des Widget&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;y_pos&amp;lt;/code&amp;gt;&lt;br /&gt;
|Y-Koordinate des Widget&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Typ des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;showmethod&amp;lt;/code&amp;gt;&lt;br /&gt;
|Welche Anzeigemethode soll verwendet werden.&amp;lt;br /&amp;gt;Zur Zeit implementiert: &amp;lt;code&amp;gt;img&amp;lt;/code&amp;gt; (Anzeige mit dem HTML &amp;lt;code&amp;gt;img&amp;lt;/code&amp;gt; Tag)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;&lt;br /&gt;
|absoluter Pfad zur anzuzeigenden Ressource&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;hover&amp;lt;/code&amp;gt;&lt;br /&gt;
|&#039;&#039;reserviert&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;&lt;br /&gt;
|Benutzername&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pass&amp;lt;/code&amp;gt;&lt;br /&gt;
|Passwort&amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung! Passwort wird im Klartext gespeichert!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;&lt;br /&gt;
|Hostname (nur bei Dummy Device notwendig)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;proto&amp;lt;/code&amp;gt;&lt;br /&gt;
|Protokoll. Standard: &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=3241</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=3241"/>
		<updated>2013-10-27T17:32:28Z</updated>

		<summary type="html">&lt;p&gt;Arne: Problem: FHEM-Blockierung bei Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim &#039;&#039;&#039;Raspberry Pi&#039;&#039;&#039; handelt es sich um einen kreditkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 2835 SoC (System-on-Chip) von Broadcom, einem 700 MHz ARM-Prozessor der ARMv6-Architektur/ARM11-Familie. Derzeit verfügbar ist das Modell B mit u.a. 256 MB RAM (ab Auslieferung Oktober 512 MB), zwei USB&amp;amp;nbsp;2.0 Anschlüssen und 10/100 MBit Ethernet-Controller.&lt;br /&gt;
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (ca. 3,5 Watt) sowie der günstigen Anschaffungskosten (ca. 33€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian 7.0 Wheezy basierende Raspbian Distribution.&lt;br /&gt;
&lt;br /&gt;
==Installation / Setup ==&lt;br /&gt;
Das Betriebssystem sollte direkt bei Raspberry unter dem Link [http://www.raspberrypi.org/downloads http://www.raspberrypi.org/downloads] ([http://downloads.raspberrypi.org/raspbian_latest Raspbian], ca. 577 MB) geholt werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Herunterladen des entsprechenden Archivs muss das Image entpackt und auf die SD-Karte geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Unter Unix/Linux erfolgt dies via dd-Befehl. Zum Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo dd bs=1M if=2012-08-16-wheezy-raspbian.img of=/dev/sdz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Bei Angabe eines falschen Device hinter of= kann der Anfang der eigenen Festplatte überschrieben werden. (Datenverlust!)&lt;br /&gt;
&lt;br /&gt;
Je nach System/Distribution und vorhandenen Festplatten variiert das Device, z.B. /dev/mmcblk0 (Ubuntu), /dev/sdb, /dev/sdc oder /dev/rdisk1 (OSX). Folgende Möglichkeiten können helfen, das richtige Device zu ermitteln:&lt;br /&gt;
* Mit dem Befehl &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; erhält kann eine Übersicht aller angeschlossenen und gemounteten(!) Speichermedien. &lt;br /&gt;
* Beim Einstecken der Speicherkarte in den PC wird in die Log-Datei &amp;lt;code&amp;gt;/var/log/messages&amp;lt;/code&amp;gt; ein Eintrag gemacht. Beispiel: &amp;lt;code&amp;gt;kernel: [2077612.776470] sd 14:0:0:0: [&#039;&#039;&#039;sdb&#039;&#039;&#039;] 7954432 512-byte logical blocks: (&#039;&#039;&#039;4.07 GB&#039;&#039;&#039;/3.79 GiB)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Mit dem Befehl fdisk kann die Größe eines bestimmten Devices geprüft werden: &amp;lt;code&amp;gt;fdisk -l /dev/sdb&amp;lt;/code&amp;gt; Beispielausgabe: &amp;lt;code&amp;gt;Platte /dev/sdb: 4072 MByte, 4072669184 Byte&amp;lt;/code&amp;gt;&lt;br /&gt;
* Unter Windows kann das Tool [https://launchpad.net/win32-image-writer Win32DiskImager] genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Nach der Installation des Images sollte der Raspberry Pi von der SD Karte booten.&lt;br /&gt;
&lt;br /&gt;
Um eventuell eine größere SD-Karte komplett zu nutzen, kann dies per folgendem Menu erledigt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es kann erforderlich sein, einen KernelUpdate einzuspielen, um einen USB-Bug zu beheben. Dieses Update ist zu finden auf [https://github.com/Hexxeh/rpi-update github].&lt;br /&gt;
&lt;br /&gt;
Die Installation von fhem auf dem Raspberry Pi kann mit dem fertigen debian-package erledigt werden. Lediglich das Perl-Modul &amp;quot;Serialport&amp;quot; wird benötigt - Perl ist in der Regel bereits installiert, kann aber sicherheitshalber einfach mit dem apt-get-Befehl zugefügt werden:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install perl libdevice-serialport-perl&lt;br /&gt;
 sudo apt-get install libio-socket-ssl-perl&lt;br /&gt;
 # fhem-X.Y.deb bitte mit der [http://fhem.de/fhem.html#Download aktuellsten, stabilen Version] ersetzen&lt;br /&gt;
 wget  [http://fhem.de/fhem-X.Y.deb http://fhem.de/fhem-X.Y.deb]&lt;br /&gt;
 sudo dpkg -i fhem-X.Y.deb&lt;br /&gt;
&lt;br /&gt;
Möglicherweise ist es noch nötig, fehlende Abhängigkeiten aufzulösen. Das kann mit folgendem Befehl erledigt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install -f&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] umgangen.&lt;br /&gt;
&lt;br /&gt;
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die &amp;quot;alten&amp;quot; Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es einen &amp;quot;load&amp;quot; von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Web-Seiten in einem beliebigen Browser.&lt;br /&gt;
&lt;br /&gt;
Bei einen Update von FHEM durch den Befehl &amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; wird standardmäßig ein Backup durchgeführt. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit eine Raspberry Pi kann das Backup lange dauern. Durch ein &amp;quot;&amp;lt;tt&amp;gt;attr global updateInBackground&amp;lt;/tt&amp;gt;&amp;quot; wird ein Backup im Hintergrund ausgeführt. Diese Einstellung ist seit FHEM 5.5. Standard. &amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;Quelle: [http://forum.fhem.de/index.php/topic,15729.0.html FHEM-Forum]&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Alternative Möglichkeiten: Backup ausschalten und manuell durchführen; Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren; ...&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]&lt;br /&gt;
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]&lt;br /&gt;
* Blog mit dem Thema [http://www.meintechblog.de/2013/05/fhem-server-auf-dem-raspberry-pi-in-einer-stunde-einrichten/ Fhem auf RaspBerry Pi in einer Stunde]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=3206</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&amp;diff=3206"/>
		<updated>2013-10-21T13:36:27Z</updated>

		<summary type="html">&lt;p&gt;Arne: Möglichkeiten für Device-Ermittlung ergänzt + Warnhinweis&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim &#039;&#039;&#039;Raspberry Pi&#039;&#039;&#039; handelt es sich um einen kreditkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 2835 SoC (System-on-Chip) von Broadcom, einem 700 MHz ARM-Prozessor der ARMv6-Architektur/ARM11-Familie. Derzeit verfügbar ist das Modell B mit u.a. 256 MB RAM (ab Auslieferung Oktober 512 MB), zwei USB&amp;amp;nbsp;2.0 Anschlüssen und 10/100 MBit Ethernet-Controller.&lt;br /&gt;
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (ca. 3,5 Watt) sowie der günstigen Anschaffungskosten (ca. 33€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian 7.0 Wheezy basierende Raspbian Distribution.&lt;br /&gt;
&lt;br /&gt;
==Installation / Setup ==&lt;br /&gt;
Das Betriebssystem sollte direkt bei Raspberry unter dem Link [http://www.raspberrypi.org/downloads http://www.raspberrypi.org/downloads] ([http://downloads.raspberrypi.org/raspbian_latest Raspbian], ca. 577 MB) geholt werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Herunterladen des entsprechenden Archivs muss das Image entpackt und auf die SD-Karte geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Unter Unix/Linux erfolgt dies via dd-Befehl. Zum Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo dd bs=1M if=2012-08-16-wheezy-raspbian.img of=/dev/sdz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Bei Angabe eines falschen Device hinter of= kann der Anfang der eigenen Festplatte überschrieben werden. (Datenverlust!)&lt;br /&gt;
&lt;br /&gt;
Je nach System/Distribution und vorhandenen Festplatten variiert das Device, z.B. /dev/mmcblk0 (Ubuntu), /dev/sdb, /dev/sdc oder /dev/rdisk1 (OSX). Folgende Möglichkeiten können helfen, das richtige Device zu ermitteln:&lt;br /&gt;
* Mit dem Befehl &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; erhält kann eine Übersicht aller angeschlossenen und gemounteten(!) Speichermedien. &lt;br /&gt;
* Beim Einstecken der Speicherkarte in den PC wird in die Log-Datei &amp;lt;code&amp;gt;/var/log/messages&amp;lt;/code&amp;gt; ein Eintrag gemacht. Beispiel: &amp;lt;code&amp;gt;kernel: [2077612.776470] sd 14:0:0:0: [&#039;&#039;&#039;sdb&#039;&#039;&#039;] 7954432 512-byte logical blocks: (&#039;&#039;&#039;4.07 GB&#039;&#039;&#039;/3.79 GiB)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Mit dem Befehl fdisk kann die Größe eines bestimmten Devices geprüft werden: &amp;lt;code&amp;gt;fdisk -l /dev/sdb&amp;lt;/code&amp;gt; Beispielausgabe: &amp;lt;code&amp;gt;Platte /dev/sdb: 4072 MByte, 4072669184 Byte&amp;lt;/code&amp;gt;&lt;br /&gt;
* Unter Windows kann das Tool [https://launchpad.net/win32-image-writer Win32DiskImager] genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Nach der Installation des Images sollte der Raspberry Pi von der SD Karte booten.&lt;br /&gt;
&lt;br /&gt;
Um eventuell eine größere SD-Karte komplett zu nutzen, kann dies per folgendem Menu erledigt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es kann erforderlich sein, einen KernelUpdate einzuspielen, um einen USB-Bug zu beheben. Dieses Update ist zu finden auf [https://github.com/Hexxeh/rpi-update github].&lt;br /&gt;
&lt;br /&gt;
Die Installation von fhem auf dem Raspberry Pi kann mit dem fertigen debian-package erledigt werden. Lediglich das Perl-Modul &amp;quot;Serialport&amp;quot; wird benötigt - Perl ist in der Regel bereits installiert, kann aber sicherheitshalber einfach mit dem apt-get-Befehl zugefügt werden:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install perl libdevice-serialport-perl&lt;br /&gt;
 sudo apt-get install libio-socket-ssl-perl&lt;br /&gt;
 # fhem-X.Y.deb bitte mit der [http://fhem.de/fhem.html#Download aktuellsten, stabilen Version] ersetzen&lt;br /&gt;
 wget  [http://fhem.de/fhem-X.Y.deb http://fhem.de/fhem-X.Y.deb]&lt;br /&gt;
 sudo dpkg -i fhem-X.Y.deb&lt;br /&gt;
&lt;br /&gt;
Möglicherweise ist es noch nötig, fehlende Abhängigkeiten aufzulösen. Das kann mit folgendem Befehl erledigt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install -f&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] umgangen.&lt;br /&gt;
&lt;br /&gt;
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die &amp;quot;alten&amp;quot; Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es einen &amp;quot;load&amp;quot; von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Web-Seiten in einem beliebigen Browser.&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]&lt;br /&gt;
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]&lt;br /&gt;
* Blog mit dem Thema [http://www.meintechblog.de/2013/05/fhem-server-auf-dem-raspberry-pi-in-einer-stunde-einrichten/ Fhem auf RaspBerry Pi in einer Stunde]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Raspberry_Pi_als_Zahlenschloss&amp;diff=3200</id>
		<title>Raspberry Pi als Zahlenschloss</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Raspberry_Pi_als_Zahlenschloss&amp;diff=3200"/>
		<updated>2013-10-21T12:40:21Z</updated>

		<summary type="html">&lt;p&gt;Arne: Link eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;So ein [Raspberry Pi] (RPi) ist ein klasse Universalgerät. In Kombination mit diversen Dingen, wie hier einer Zahlentastatur, wird das ein fertiges FHEM-fähiges &#039;&#039;&#039;Zahlenschloss&#039;&#039;&#039;. Die Gesamtkosten sind sicherlich nicht höher als ein fertiges Gerät kosten würde -- wenn es denn zu kaufen wäre.&lt;br /&gt;
&lt;br /&gt;
Diese Zahlentastatur kann man nicht nur als Schloss, sondern auch zum beliebigen Schalten von Aufgaben verwenden.&lt;br /&gt;
&lt;br /&gt;
== Überblick über die Vorgehensweise ==&lt;br /&gt;
* Eine RPi unter Debian Wheezy wird ohne Monitor z.B. an der Haustüre montiert.&lt;br /&gt;
* Eine wetterfeste USB-Zahlen-Tastatur wird nach außen geführt.&lt;br /&gt;
* Die RPi ist so eingestellt, dass nach dem Booten keine Desktop-Umgebung (Grafik) gestartet wird, sie daher mit der Konsole (/dev/tty1) startet.&lt;br /&gt;
* tty1 wird so eingestellt, dass sich automatisch ein nicht privilegierter User einloggt.&lt;br /&gt;
* Mit dem Einloggen startet sich ein Shell-Skript, das in einer Endlosschleife Zahlencodes einliest und das Ergebnis an FHEM schickt (FHEM muss nicht auf dem selben Rechner laufen)&lt;br /&gt;
* FHEM schaltet mit dem als dummy-Device angelegten Zahlencode über notify beliebige Anwendungen/Logiken.&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
Für professionelle Aufgaben ist das nicht der Standard, den man erwarten würde.&lt;br /&gt;
&lt;br /&gt;
* eine RPi ist auch nur ein Rechner und kann abstürzen&lt;br /&gt;
* eine USB-Tastatur vor die Haustür zu verlegen ist auch nicht jedermanns Sache. Eine USB-Buchse sollte auf jeden Fall nicht erreichbar sein, ein USB-Keylogger wäre sonst schnell installiert.&lt;br /&gt;
* wenn man diese Lösung zum Schalten von sicherheitskritischen Dingen, wie der [[HM-SEC-KEY KeyMatic|Keymatic]] (Haustüre) oder der Alarmanlage verwendet, sollte man wissen, was man tut.&lt;br /&gt;
&lt;br /&gt;
== Benötigte Hardware ==&lt;br /&gt;
Analog zur NFC-Variante [[Raspberry Pi &amp;amp;amp; NFC]] benötigt man anstatt NFC nur eine 8-Euro USB-Zahlentastatur. Für diesen Einsatzzweck eignet sich die &#039;&#039;&#039;Keysonic ACK-118 BK Numpad&#039;&#039;&#039; ([http://keysonic.de/de/products/details.php?we_objectID=8300]). Sie ist komplett in Silikon eingearbeitet und somit für den Außenbereich geeignet. Bei der Bestellung darauf achten, dass es sie in grau und in schwarz gibt. &lt;br /&gt;
&lt;br /&gt;
Natürlich kann man auch edle wetterfeste Edelstahl-Tastaturen (möglichst mit Eingabe-Taste) verbauen - sie kosten aber auch gleich ein Vermögen.&lt;br /&gt;
&lt;br /&gt;
== Betriebssystem/Shell-Skript auf RPi ==&lt;br /&gt;
=== Zusätzliche Software ===&lt;br /&gt;
Aufbauend auf der oben genannten NFC-Variante (ohne NFC-Teil) wird nur das Paket mingetty benötigt&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install mingetty&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tastaturprellschutz (optional) ===&lt;br /&gt;
Bei der Zahleneingabe lösen Anfänger schnell ein Tastaturprellen aus. Wir setzen die Tastatur auf maximalen Delay-Wert. Da dies in der Praxis trotzdem evtl. nicht ausreicht, wird ein Tastaturprellen im Skript (s.u.) selbst abgefangen. Insofern ist diese Einstellung hier nur noch optional und für den Fall gedacht, dass man das Skript abändern möchte.&lt;br /&gt;
&lt;br /&gt;
Eingabe in &#039;&#039;/etc/rc.local&#039;&#039; in der vorletzten Zeile (vor exit 0)&lt;br /&gt;
:&amp;lt;code&amp;gt;kbdrate -d 1000 /dev/tty1&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;exit 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Neuer nicht privilegierter User ===&lt;br /&gt;
Es werden nicht viele Rechte benötigt. Ein einfacher User, der keinen besonderen Gruppen angehört, reicht aus.&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo useradd -m rpi&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatisches Login ===&lt;br /&gt;
Beim Standard-Loginprogramm kann man sich nicht automatisch einloggen. Daher wird in der /etc/inittab das Standard getty gegen mingetty für tty1 ausgetauscht.&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
:&amp;lt;code&amp;gt;1:2345:respawn:/sbin/getty --noclear 38400 tty1&amp;lt;/code&amp;gt;&lt;br /&gt;
neu&lt;br /&gt;
:&amp;lt;code&amp;gt;1:2345:respawn:/sbin/mingetty --autologin rpi --noclear tty1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starten des Einlese-Skriptes ===&lt;br /&gt;
Am einfachsten ändern wir die /home/rpi/.bashrc&lt;br /&gt;
&lt;br /&gt;
Einfach am Ende folgende Zeilen einfügen:&lt;br /&gt;
:&amp;lt;code&amp;gt;# Codeschloss fuer fhem&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;/usr/local/bin/kbd2fhem.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einleseskript kbd2fhem.sh ===&lt;br /&gt;
/usr/local/bin/kbd2fhem.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
# provided by Martin Haas 3/2013&lt;br /&gt;
# Skript, um Zahleneingaben von Tastatur an FHEM zu schicken&lt;br /&gt;
FhemIP=&amp;quot;192.168.0.x&amp;quot;&lt;br /&gt;
LogFile=&amp;quot;/home/rpi/kbd2fhem.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
while true&lt;br /&gt;
do&lt;br /&gt;
    # NumLock vorsorglich aktivieren&lt;br /&gt;
    /usr/bin/setleds -D +num &amp;amp;lt; /dev/tty1&lt;br /&gt;
    # Zahlencode einlesen&lt;br /&gt;
    printf &amp;quot;Zahlencode: &amp;quot;&lt;br /&gt;
    read code&lt;br /&gt;
    # Eingabe&lt;br /&gt;
    echo &#039;Eingabe: &#039;$code&lt;br /&gt;
    # nur Zahlen zulassen (nicht alles wird abgefangen)&lt;br /&gt;
    code=$(echo $code | tr -d &amp;quot;[:alpha:][:space:][:cntrl:][:punct:]äüöß&amp;quot;)&lt;br /&gt;
    echo &#039;Verwendeter Zahlencode: &#039;$code&lt;br /&gt;
  &lt;br /&gt;
    # Um prellende Tastaturen auszuschliessen, wird keine Doppelzahl &lt;br /&gt;
    # akzeptiert. Beispiel: aus 3333553311 wird 3531 &lt;br /&gt;
    finalcode=${code:0:1}&lt;br /&gt;
 &lt;br /&gt;
    while [[ ${#code} -gt &#039;&#039; ]]&lt;br /&gt;
    do&lt;br /&gt;
        last=${code:0:1}&lt;br /&gt;
        code=${code/${code:0:1}}&lt;br /&gt;
        next=${code:0:1}&lt;br /&gt;
        [[ $next != $last ]] &amp;amp;amp;&amp;amp;amp; finalcode=$finalcode${code:0:1}&lt;br /&gt;
    done&lt;br /&gt;
 &lt;br /&gt;
    # fuer FHEM vorbereiten&lt;br /&gt;
    code=&#039;kbd&#039;$finalcode&lt;br /&gt;
 &lt;br /&gt;
    # nur bei erkanntem Zahlencode verschicken&lt;br /&gt;
    [[ $finalcode != &#039;&#039; ]] &amp;amp;amp;&amp;amp;amp;&lt;br /&gt;
    echo &amp;amp;quot;set $code irgendwas&amp;amp;quot; | nc -w5 $FhemIP 7072&lt;br /&gt;
 &lt;br /&gt;
    # ...aber alles loggen&lt;br /&gt;
    echo &amp;amp;quot;`date`: $code detected&amp;amp;quot; &amp;amp;gt;&amp;amp;gt;$LogFile&lt;br /&gt;
 &lt;br /&gt;
    # optisches Feedback&lt;br /&gt;
    /usr/bin/setleds -D -num &amp;amp;lt; /dev/tty1 #NumLock-LED kurz ausschalten&lt;br /&gt;
    sleep 1&lt;br /&gt;
 done&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Das Skript muss ausführbar sein&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo chmod +x /usr/local/bin/kbd2fhem.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem nächsten Booten ist die RPi bereit Zahlencodes an FHEM zu schicken.&lt;br /&gt;
&lt;br /&gt;
== FHEM vorbereiten ==&lt;br /&gt;
=== Zahlencode einem Dummy zuordnen ===&lt;br /&gt;
Beispiel Eintrag in der fhem.cfg&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Keyboard. Eingegebener Zahlencode: 12345 (Beispiel)&lt;br /&gt;
define kbd12345 dummy&lt;br /&gt;
define kbdnot01 notify kbd12345 set lampe toggle&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Zugriff von extern ===&lt;br /&gt;
Sollte auf der RPi nicht auch FHEM laufen, so muss FHEM den Remote-Zugriff erlauben:&lt;br /&gt;
Eintrag in fhem.cfg&lt;br /&gt;
:&amp;lt;code&amp;gt;define telnetPort telnet 7072 &#039;&#039;&#039;global&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hilfe/Support ==&lt;br /&gt;
* Fragen werden gerne im FHEM-Forum auf [http://forum.fhem.de http://forum.fhem.de] beantwortet.&lt;br /&gt;
* Für Feedback ist [http://forum.fhem.de/index.php/topic,11521.msg67529.html#msg67529 dieser Beitrag] im Forum vorgesehen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MAX&amp;diff=3186</id>
		<title>MAX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MAX&amp;diff=3186"/>
		<updated>2013-10-20T17:12:53Z</updated>

		<summary type="html">&lt;p&gt;Arne: Einleitung, Autocreate+Definition für Fensterkontakt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MAX! ist eine Heizungssteuerung, die die Raumtemperatur durch funkvernetzte Heizkörperthermostate an den Heizkörpern regelt. MAX! stellt eine Alternative zur FHT und HomeMatic Heizungsteuerung dar.&lt;br /&gt;
== Features ==&lt;br /&gt;
* Bidirektionale Kommuniktion (jeder Befehl wird mit ACK quittiert)&lt;br /&gt;
* Heizkörperthermostate übertragen auch die gemessene Temperatur&lt;br /&gt;
== FHEM Module ==&lt;br /&gt;
Die MAX Komponenten können über den MAX!Cube per Modul 00_MAXLAN,&lt;br /&gt;
oder über einen [[CUL]] oder [[CUNO]] per 14_CUL_MAX gesteuert werden.&lt;br /&gt;
In beiden Fällen werden die einzelnen MAX! Geräte vom Modul 10_MAX&lt;br /&gt;
bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
Nachteil vom Cube ist, dass man ein Polling machen muss, um zu sehen ob sich der Status eines Gerätes geändert hat. Z.B.&lt;br /&gt;
checkt man das alle 30 Sekunden. Dann sieht man aber auch Änderungen möglicherweise erst nach 30 Sekunden.&lt;br /&gt;
Beim CUL sieht man die Funknachrichten direkt.&lt;br /&gt;
Es wird aber auch ein Kombimodus unterstützt, in welchem man alles über den MAXLAN steuert,&lt;br /&gt;
der CUL_MAX aber für zeitnahe Benachrichtigungen sorgt.&lt;br /&gt;
&lt;br /&gt;
== Komponenten ==&lt;br /&gt;
=== Limit ===&lt;br /&gt;
* Auf 8 Thermostate pro Raum beschränkt&lt;br /&gt;
* Limit mit Cube liegt bei ca. 140 Geräten. Durch die [[1% Regel]]ung dürften es aber in der Praxis weniger sein&lt;br /&gt;
&lt;br /&gt;
=== Heizkörperthermostate ===&lt;br /&gt;
Unterstützt wird das Einstellen von&lt;br /&gt;
&lt;br /&gt;
* desiredTemperature = auto (Wochenprogramm), manuell (4.5 - 30.5), eco, comfort, boost, until&lt;br /&gt;
** (Besonderheit der Werte: 4.5 = Off und 30.5 = On)&lt;br /&gt;
* ecoTemperature, comfortTemperature, measurementOffset, maximumTemperature, minimumTemperature, windowOpenTemperature, windowOpenDuration&lt;br /&gt;
&lt;br /&gt;
und das Auslesen&lt;br /&gt;
&lt;br /&gt;
* der gemessenen Temperatur. (Hinweis: Wird bei Verwendung des MAX CUBE nicht regelmäßig aktualisiert)&lt;br /&gt;
=== Fensterkontakte ===&lt;br /&gt;
Der aktuelle Status (offen/geschlossen) wird (praktisch ohne Verzögerung) angezeigt. &#039;&#039;&#039;[[Nur bei CUL, oder?]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Falls wir nicht mit Ack antworten, wird er mehrmals wiederholt.&lt;br /&gt;
&lt;br /&gt;
Die Fensterkontakte können zusätzlich direkt an mehrere Heizkörperthermostate angelernt werden,&lt;br /&gt;
und versetzen diese dann automatisch in windowOpenTemperature während sie geöffnet sind.&lt;br /&gt;
&lt;br /&gt;
Wenn der Fensterkontakt an mindestens ein Heizkörperthermostat angelernt ist, dann sendet er zusätzlich stündlich seinen aktuellen Zustand.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel Autocreate&#039;&#039;&#039;&lt;br /&gt;
 MAXLAN_Parse: Paired new device, type ShutterContact, addr 1a2b3c, serial JEQ0123456&lt;br /&gt;
 autocreate: define MAX_1a2b3c MAX ShutterContact 1a2b3c&lt;br /&gt;
 autocreate: define FileLog_MAX_1a2b3c FileLog /fhem/log/MAX_1a2b3c-%Y.log MAX_1a2b3c&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel Definition&#039;&#039;&#039;&lt;br /&gt;
 define MAX_1a2b3c MAX ShutterContact 1a2b3c&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel Log&#039;&#039;&#039;&lt;br /&gt;
 ==&amp;gt; MAX_1a2b3c-2013.log &amp;lt;==&lt;br /&gt;
 2013-10-20_18:52:08 MAX_1a2b3c battery: ok&lt;br /&gt;
 2013-10-20_18:52:08 MAX_1a2b3c onoff: 0&lt;br /&gt;
 2013-10-20_18:52:08 MAX_1a2b3c closed&lt;br /&gt;
&lt;br /&gt;
=== Wandthermostate ===&lt;br /&gt;
Unterstützt wird das Einstellen von&lt;br /&gt;
&lt;br /&gt;
* desiredTemperature (siehe Heizkörperthermostate), ecoTemperature, comfortTemperature&lt;br /&gt;
&lt;br /&gt;
und das Auslesen&lt;br /&gt;
&lt;br /&gt;
* der gemessenen Temperatur.&lt;br /&gt;
=== Eco-Taster ===&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Zumindest über MAXLAN lässt sich der Zustand weder auslesen, noch wird&lt;br /&gt;
man über Veränderungen informiert.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Per CUL_MAX funktioniert der Eco-Taster problemlos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispielhafte Definition ====&lt;br /&gt;
 define BUTTON.EG MAX PushButton 069d33&lt;br /&gt;
&lt;br /&gt;
==== Beispielhafte Event-Ausgabe ====&lt;br /&gt;
&lt;br /&gt;
 2013-07-02 21:06:14 MAX BUTTON.EG battery: ok&lt;br /&gt;
 2013-07-02 21:06:14 MAX BUTTON.EG onoff: 0&lt;br /&gt;
 2013-07-02 21:06:14 MAX BUTTON.EG closed&lt;br /&gt;
&lt;br /&gt;
Wobei gilt&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! onoff !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Eco&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anlernen per CUL ==&lt;br /&gt;
Das Anlernen funktioniert nur mit zurückgesetzen (Werksreset, also entweder alle 3 Tasten am Heizkörperthermostate betätigen, Batterien einlegen, Anzeige rES; oder in FHEM set factoryReset) Heizkörperthermostaten. Bereits an einen Cube angelernte Heizungsregler können NICHT an ein CUL angemeldet werden, hier ist dann nur das &amp;quot;mitlesen&amp;quot; der Funkbotschaften möglich.&lt;br /&gt;
Info: Durch den Reset geht auch ein evtl. per Cube eingestelltes Automatikprogramm verloren.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Siehe [http://fhem.de/commandref.html#CUL_MAX CUL_MAX].&lt;br /&gt;
&lt;br /&gt;
Die Module sind so konzipiert, dass man die offizielle Max! Software nicht benutzen muss. Man kann alles aus FHEM heraus machen.&lt;br /&gt;
Nachdem das MAXLAN oder CUL_MAX Modul konfiguriert wurden (siehe unten), werden bereits gepairte Geräte automatisch erkannt.&lt;br /&gt;
&lt;br /&gt;
=== MAXLAN ===&lt;br /&gt;
Minimale Konfiguration:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define ml MAXLAN 192.168.178.2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
wobei 192.168.178.2 die IP des MAX! Cube ist. Das MAXLAN-Modul findet selbstständig bereits gepairte Geräte und trägt diese in die Konfigurationsdatei fhem.cfg ein. Diese können dann im WEB-Interface mittels „alias“ einen eindeutigen Namen bekommen.&lt;br /&gt;
&lt;br /&gt;
=== CUL_MAX ===&lt;br /&gt;
Minimale Konfiguration:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define CUL0 CUL /dev/ttyACM0@9600 0000&lt;br /&gt;
 attr CUL0 rfmode MAX&lt;br /&gt;
 define cm CUL_MAX 123456&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=== Anlernen ===&lt;br /&gt;
Dazu muss der &amp;quot;pairmode&amp;quot; auf MAXLAN/CUL_MAX per &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set cm/ml pairmode&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
oder über das Web-Interface aktiviert werden. Falls kein Parameter angegeben wird, ist er&lt;br /&gt;
standardmäßig für 60 Sekunden aktiviert. In dieser Zeit können MAX! Geräte nach deren Anleitung&lt;br /&gt;
in den Anlernmodus versetzt werden, um sie mit FHEM zu pairen.&lt;br /&gt;
&lt;br /&gt;
=== Geräte untereinander anlernen ===&lt;br /&gt;
Es gibt einen anderen Befehl, um Devices untereinander anzulernen (in neueren Versionen des MAX Moduls enthalten, heißt &amp;quot;associate&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wenn ich z.B.&lt;br /&gt;
set MAXFensterKontakt0 associate MaxHeizkörperthermostat3&lt;br /&gt;
ausführe, dann&lt;br /&gt;
sendet der MAXFensterKontakt0 jede Änderung zusätzlich (direkt über Funk, ohne Cube oder FHEM)&lt;br /&gt;
an das MaxHeizkörperthermostat3.&lt;br /&gt;
&lt;br /&gt;
Damit MaxHeizkörperthermostat3 auch auf die Nachrichten vom MAXFensterKontakt0 hört, muss noch ein&lt;br /&gt;
set MaxHeizkörperthermostat3 associate MAXFensterKontakt0&lt;br /&gt;
erfolgen.&lt;br /&gt;
&lt;br /&gt;
Dann wechselt MaxHeizkörperthermostat3 immer dann auf die windowOpenTemperature, wenn der MAXFensterKontakt0 offen ist.&lt;br /&gt;
Dabei muss die groupId von beiden Geräte gar nicht gleich sein! (Die Semantik der groupId erschließt sich mir deshalb noch nicht ganz.&lt;br /&gt;
Ich glaube, man kann damit Befehle (ala set desiredTemperature) an mehrere Thermostate gleichzeitig richten. Im Moment sendet FHEM einfach an jedes Thermostat einen Befehl.)&lt;br /&gt;
&lt;br /&gt;
Wahrscheinlich funktioniert associate genauso zwischen Heizkörper/Wandthermostaten. Das müsste mal eine ausprobieren und dann hier berichten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Temperatursturzerkennung ===&lt;br /&gt;
Die Heizkörperthermostate verfügen über eine interne &amp;quot;Fenster-offen Erkennung&amp;quot; (Temperatursturzerkennung). Wird diese ausgelöst regeln sie für die Zeit die unter &amp;quot;windowOpenDuration&amp;quot; festgelegt wurde auf die als &amp;quot;windowOpenTemperature&amp;quot; festgelegt Temperatur herunter und danch wieder auf die zuvor eingestellte Temperatur zurück.&lt;br /&gt;
Nachteil: Die Erkennung benötigt etwas Zeit und reagiert nicht sofort wie es beim Fensterkontakt oben der Fall ist&lt;br /&gt;
Vorteil: Es ist kein Fensterkontakt erforderlich&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Setzt man die windowOpenTemperature auf &amp;quot;Off&amp;quot; (= 4.5 Grad), dann ist die Fenster-offen-Funktion abgeschaltet. Und auch wenn die desiredTemperature gerade auf &amp;quot;On&amp;quot; (= 30.5 Grad&amp;quot;) steht, geht der Heizkörper nicht in die Fenster-offen-Funktion.&lt;br /&gt;
&lt;br /&gt;
=== Externer Sensor für Fenster-offen-Erkennung ===&lt;br /&gt;
Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate in und aus dem Fenster-offen Modus zu holen.&lt;br /&gt;
Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define CUL0 CUL /dev/ttyACM0@9600 0000&lt;br /&gt;
 define cm CUL_MAX 123456&lt;br /&gt;
 define Heizung MAX HeatingThermostat abcdef&lt;br /&gt;
 attr Heizung IODev cm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Wir müssen einmalig den internen Fake-Fensterkontakt mit dem Heizkörper assozieren&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set Heizung associate fakeShutterContact&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
damit dieser die Nachrichten vom Fensterkontakt akzeptiert.&lt;br /&gt;
&lt;br /&gt;
Nun können wir per &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set cm fakeSC Heizung 1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
die Nachricht &amp;quot;Fenster offen&amp;quot; an die Heizung senden und per&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set cm fakeSC Heizung 0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
die Nachricht &amp;quot;Fenster zu&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Externer Temperatursensor für Heizkörperregelung ===&lt;br /&gt;
Ziel dieses Abschnittes ist es, einen externen Sensor (z.B. 1-Wire o.ä.) zu benutzen, um die MAX Heizkörperthermostate zu regeln.&lt;br /&gt;
Dazu sei bereits ein CUL, ein CUL_MAX und ein MAX Heizkörper definiert:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define CUL0 CUL /dev/ttyACM0@9600 0000&lt;br /&gt;
 define cm CUL_MAX 123456&lt;br /&gt;
 define Heizung MAX HeatingThermostat abcdef&lt;br /&gt;
 attr Heizung IODev cm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Wir müssen einmalig das interne Fake-Wandthermostat mit dem Heizkörper assozieren: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set Heizung associate fakeWallThermostat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
damit dieser die Nachrichten vom Wandthermostat akzeptiert. Achtung: Dies schaltet im&lt;br /&gt;
Heizkörperthermostat die Regelung mit dem internen Temperaturfühler aus. Ohne die gleich kommenden &amp;quot;fakeWT&amp;quot; Nachrichten wird das Heizkörperthermostat nicht mehr regeln.&lt;br /&gt;
&lt;br /&gt;
Nun können wir per &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set cm fakeWT Heizung 14.5 12.1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
die desiredTemperature 14.5 und gemessene Temperatur 12.1 an die Heizung senden.&lt;br /&gt;
Diese wird dann die Ventile öffnen, bis wir ein &amp;quot;fakeWT&amp;quot; absetzten, dessen gemessene Temperatur&lt;br /&gt;
höher als die desiredTemperature ist.&lt;br /&gt;
&lt;br /&gt;
Falls man zu lange Zeit (ca. 30 Minuten) kein neues &amp;quot;fakeWT&amp;quot; sendet, wird bei Heizung das Attribut rferror gleich 1. Es ist nicht klar, ob das neben diesem Attribute auch Auswirkung auf die Funktionalität hat. Es wurde beobachtet, das dann der interne Temperatursensor bis zum nächsten FakeWT aktiviert wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel eines automatischen Sendens einer externen Temperatur, der externe Temperatursensor heißt &amp;quot;WS300&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define SendExtTemp notify WS300:temperature.* {&lt;br /&gt;
 MaxFakeWallThermostat(&amp;quot;Heizung&amp;quot;,&amp;amp;#160;%EVTPART1);&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dazu die Funktion, bitte in 99_MyUtils.pm eintragen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sub MaxFakeWallThermostat($$)&lt;br /&gt;
{&lt;br /&gt;
 my ($heizung, $aktTemp)    = @_;&lt;br /&gt;
 my $CULMAX     = $defs{$heizung}{LASTInputDev};&lt;br /&gt;
 my $desiredTemp   = ReadingsVal($heizung, &amp;quot;desiredTemperature&amp;quot;, undef);&lt;br /&gt;
 my $windowOpenTemp = ReadingsVal($heizung, &amp;quot;windowOpenTemperature&amp;quot;, undef);&lt;br /&gt;
 my $lastTemp    = ReadingsVal($heizung, &amp;quot;LastExtTemperature&amp;quot;, 0);&lt;br /&gt;
 my $lastSet     = ReadingsTimestamp($heizung, &amp;quot;LastExtTemperature&amp;quot;, 0);&lt;br /&gt;
 if($desiredTemp &amp;amp;amp;&amp;amp;amp; $windowOpenTemp &amp;amp;amp;&amp;amp;amp;&lt;br /&gt;
 $desiredTemp&amp;amp;#160;!= $windowOpenTemp &amp;amp;amp;&amp;amp;amp; &lt;br /&gt;
 (time()-time_str2num($lastSet) &amp;amp;gt;= 600 || abs($aktTemp-$lastTemp)&amp;amp;gt;=0.2 )) {&lt;br /&gt;
  Log 3, &amp;quot;set $CULMAX fakeWT $heizung $desiredTemp $aktTemp&amp;quot;;&lt;br /&gt;
  readingsSingleUpdate($defs{$heizung}, &amp;quot;LastExtTemperature&amp;quot;, $aktTemp, 0);&lt;br /&gt;
  fhem(&amp;quot;set $CULMAX fakeWT $heizung $desiredTemp $aktTemp&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
In diesem Beispiel heißt das zu steuernde Thermostat &amp;quot;Heizung&amp;quot;. Die vom externen Sensor gemessene Temperatur wird nur unter den folgenden Voraussetzungen gesendet:&lt;br /&gt;
- Das Thermostat befindet sich nicht im &amp;quot;Fenster-offen&amp;quot; Modus, und&lt;br /&gt;
- das letzte Senden liegt mindestens 10min zurück&lt;br /&gt;
- oder die gemessene Temperatur weicht um mindestens 0.2°C von der letzten gesendeten Temperatur ab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wochenheizplan für Wandthermostat erstellen ===&lt;br /&gt;
Ein Heizplan, den der Wandthermostat versteht und speichern kann, sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set WZ_Wandthermostat weekProfile &lt;br /&gt;
 Mon 17,17:30,20,23:00,17 &lt;br /&gt;
 Tue 17,17:30,20,23:00,17&lt;br /&gt;
 Wed 17,17:30,20,23:00,17&lt;br /&gt;
 Thu 17,17:30,20,23:00,17&lt;br /&gt;
 Fri 17,15:00,20,23:00,17&lt;br /&gt;
 Sat 17,11:00,20,23:00,17&lt;br /&gt;
 Sun 17,11:00,20,23:00,17&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Genauer erläutert wird die Funktionsweise auch unter [http://fhem.de/commandref.html#MAX http://fhem.de/commandref.html#MAX]. &lt;br /&gt;
Der gesamte Block kann kopiert und als FHEM Befehl abgesetzt werden. Unter Umständen benötigt das Speichern, bzw Übertragen wegen der Größe etwas Zeit, bevor die aktuellen, neu gesetzten Werte wieder ausgelesen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Werte Plotten ===&lt;br /&gt;
[[File:Plot_MAX_Beispiel.png|thumb|right|Plot eines MAX Heizkörperthermostates]]&lt;br /&gt;
In den Log-Dateien wird regelmäßig der Batteriestatus, die Soll-Temperatur, die Ventilstellung und die Ist-Temperatur (Vorsicht wird nicht zuverlässig, möglicherweise nur bei einer Änderung der Ventilstellung übertragen.)&lt;br /&gt;
&lt;br /&gt;
Inhalt der LOG-Datei eines Heizkörperthermostates:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;2012-12-30_08:55:31 MAX_018d3f battery: ok&lt;br /&gt;
2012-12-30_08:55:31 MAX_018d3f desiredTemperature: 19.5&lt;br /&gt;
2012-12-30_08:55:31 MAX_018d3f valveposition: 83&lt;br /&gt;
2012-12-30_08:55:31 MAX_018d3f temperature: 16.4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit folgender Plot-Datei (max_temp.gplot) kann der Verlauf der Sensordaten gut angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set terminal png transparent size &amp;amp;lt;SIZE&amp;amp;gt; crop&lt;br /&gt;
set output &#039;&amp;amp;lt;OUT&amp;amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set y2tics&lt;br /&gt;
set title &#039;&amp;amp;lt;L1&amp;amp;gt;&#039;&lt;br /&gt;
set grid xtics y2tics&lt;br /&gt;
set y2label &amp;quot;Temperatur in Grad Celsius&amp;quot;&lt;br /&gt;
set ylabel &amp;quot;Signal in&amp;amp;#160;%&amp;quot;&lt;br /&gt;
#FileLog 4:desiredTemperature:0:&lt;br /&gt;
#FileLog 4:temperature:0:&lt;br /&gt;
#FileLog 4:valveposition:0:&lt;br /&gt;
plot \&lt;br /&gt;
&amp;quot;&amp;amp;lt; egrep &#039;desiredTemperature&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;\&lt;br /&gt;
  using 1:4 axes x1y2 title &#039;Soll-Temperatur (C)&#039; with lines lw 2 \&lt;br /&gt;
&amp;quot;&amp;amp;lt; egrep &#039;temperature&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;\&lt;br /&gt;
  using 1:4 axes x1y2 title &#039;Ist-Temperatur(ungenau)(C)&#039; with lines lw 2 \&lt;br /&gt;
&amp;quot;&amp;amp;lt; egrep &#039;valveposition&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;\&lt;br /&gt;
  using 1:4 axes x1y1 title &#039;Ventil (%)&#039; with lines lw 2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Einbinden eines Plots in der fhem.cgf&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#Werte plotten&lt;br /&gt;
define MAX_017840_weblink weblink fileplot FileLog_MAX_017840:max_temp:CURRENT&lt;br /&gt;
attr MAX_017840_weblink label &amp;quot;Kueche Soll-Temperatur Min $data{min1}, Max $data{max1}, Last $data{currval1}&amp;quot;&lt;br /&gt;
attr MAX_017840_weblink room MAX&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=== Nützliche kleine Erweiterungen ===&lt;br /&gt;
&#039;&#039;&#039;Einen Alias-Namen vergeben für eine bessere Lesbarkeit im Webinterface&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;attr MAX_018d3f alias Kueche&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Die Anzeigen für die einzelnen File-Logs füllen das Webinterface schnell und machen es unübersichtlich.&#039;&#039;&#039; Die File-Logs können einfach in einen separaten Raum verbannt werden.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;attr FileLog_MAX_018d3f room LOG&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Einstellmöglichkeit für die Soll-Temperatur direkt in der „Raum-Seite“ schaffen.&#039;&#039;&#039; Die Temperatur wird dauerhaft auf einen bestimmten Wert gestellt. Das Wochenprogramm in dem Thermostat wird deaktiviert.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;attr MAX_018d3f webCmd desiredTemperature&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Soll-Temperatur setzen, ohne das automatische Programm des Thermostates abzuschalten.&#039;&#039;&#039;&lt;br /&gt;
Es besteht die Möglichkeit eine Soll-Temperatur bis zum nächsten Schaltzeitpunkt zu setzen. Zum Beispiel kann das automatische Wochenprogramm in den Thermostaten dazu genutzt werden, nur abends die Soll-Temperatur zu senken. So läuft die Heizung nachts nicht voll durch. Wenn jedoch die Temperatur im Web-Interface von Fhem verändert wird, wird auch der Thermostat auf manuell gesetzt. So greift das Wochenprogramm nicht mehr. Abhilfe schafft der Befehl &amp;lt;code&amp;gt;set MAX_04711 desiredTemperature auto 20&amp;lt;/code&amp;gt;. Damit die Eingabe komfortabel aus Fhem möglich ist, kann ein Dummy-Device erstellt werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#Dummy für die Schnell-Einstellung der Temperatur bis zum nächsten automatischen Schaltzeitpunkt&lt;br /&gt;
 define HeizkoerperBad dummy&lt;br /&gt;
 attr HeizkoerperBad room MAX,Heizungen&lt;br /&gt;
 attr HeizkoerperBad setList state:eco,auto,14.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0&lt;br /&gt;
 attr HeizkoerperBad webCmd state&lt;br /&gt;
 define HeizkoerperBad.ntfy notify HeizkoerperBad.* {\&lt;br /&gt;
  my $valtemp = &amp;quot;%&amp;quot;;;\&lt;br /&gt;
  my $device = &amp;quot;MAX_04711&amp;quot;;;\&lt;br /&gt;
  my $cmd = &#039;set &#039;.$device.&#039; desiredTemperature auto &#039;.$valtemp;;\&lt;br /&gt;
  fhem($cmd);;\&lt;br /&gt;
 }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Diese Dummy-Device kann alternativ oder ergänzend zu &amp;lt;code&amp;gt;attr MAX_018d3f webCmd desiredTemperature&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
=== IST-Temperaturwerte ===&lt;br /&gt;
[[File:Plot_MAX_Beispiel.png|thumb|right|Plot eines MAX Heizkörperthermostates]]&lt;br /&gt;
Diese Abbildung zeigt, dass die IST-Temperatur nicht regelmäßig dem MAX CUBE mitgeteilt wird. Im Automatikbetrieb wird beim einer Änderung der Ventilstellung die neue Ventilstellung zusammen mit der aktuellen IST-Temperatur gesendet. Bei der Abbildung war die Therme in der Nacht ausgeschaltet. Daraufhin sinkte die Temperatur soweit ab, dass das Heizungsthermostat das Ventil in Maximalstellung geöffnet hat. Gegen 08:50 wurde die Therme eingeschaltet und die Soll-Temperatur an diesem Heizungsthermostat erhöht. Während dieser ganzen Zeit erfolgt keine Aktualisierung der Ist-Temperatur. So kommt es auch gegen 10:30 zu einem sprunghaften Temperaturanstieg von 13,5°C auf 19°C (siehe Markierung *A).&lt;br /&gt;
&lt;br /&gt;
Die IST-Temperatur wird anscheinend aktualisiert bei einer Änderung der:&lt;br /&gt;
&lt;br /&gt;
* Ventilstellung&lt;br /&gt;
* Soll-Temperatur&lt;br /&gt;
* des Betriebsmodis (Auto/Manuell)&lt;br /&gt;
&lt;br /&gt;
=== MAXLAN ===&lt;br /&gt;
=== CUL_MAX ===&lt;br /&gt;
The Max devices use a CC1100 chip. For parameters see rf_moritz.c in culfw.&lt;br /&gt;
The thermostats use a Wake-On-Radio, thus one has to send packets at the right time.&lt;br /&gt;
&lt;br /&gt;
CC1100 initialization sequence on one of the max devices (not Cube) (format: addr value, both in hex):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;00 08&lt;br /&gt;
 02 46&lt;br /&gt;
 04 C6&lt;br /&gt;
 05 26&lt;br /&gt;
 0B 06&lt;br /&gt;
 10 C8 //MDMCFG4 DRATE_E=8&lt;br /&gt;
 11 93 //MDMCFG3 DRATE_M=147, data rate = (256+DRATE_M)*2^DRATE_E/2^28*f_xosc = (9992.599) 1kbit/s (at f_xosc=26 Mhz)&lt;br /&gt;
 12 03&lt;br /&gt;
 15 34&lt;br /&gt;
 17 00&lt;br /&gt;
 18 18&lt;br /&gt;
 19 16&lt;br /&gt;
 1B 43&lt;br /&gt;
 21 56&lt;br /&gt;
 25 00&lt;br /&gt;
 26 11&lt;br /&gt;
 0D 21&lt;br /&gt;
 0E 65&lt;br /&gt;
 0F 6A&lt;br /&gt;
 07 4C //PKTCTRL1: ADR_CHK=0 APPEND_STATUS=1 CRC_AUTOFLUSH=1 PQT=2 (preamble must have 8 toggling bits before sync word detection)&lt;br /&gt;
 16 1C //RXTIME=4&lt;br /&gt;
     RX_TIME_QUAL=1 (when rx timeout expires, keep receiving if either sync word is found or PQI is set (see PQT))&lt;br /&gt;
     RX_TIME_RSSI=1 (terminate RX if there is no carrier sense within the first 8 symbol periods)&lt;br /&gt;
 20 78 //WORCTRL, WOR_RES=00 (1.8-1.9 sec), RC_CAL=1, EVENT1=7 (48 ticks), RC_PD=0&lt;br /&gt;
 1E 87 //WOREVT1&lt;br /&gt;
 1F 6B //WOREVT0, i.e. EVENT0 = 34667&lt;br /&gt;
 29 59&lt;br /&gt;
 2C 81&lt;br /&gt;
 2D 35&lt;br /&gt;
 3E C3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Not set, i.e. factory defaults:&lt;br /&gt;
 13 MDMCFG1 NUM_PREAMBLE=2 (4 preamble bytes)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
From the configuration, we see that the&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;RC Oscillator: f_xosc/750 = 34666.66 Hz&lt;br /&gt;
 Event1 = Event1(=48 ticks)/RC Oscillator = 1.385 ms&lt;br /&gt;
 t_Event0 = 750/26Mhz * EVENT0 * 2^(5*WOR_RES) = 1.00 second&lt;br /&gt;
 C(RX_TIME, WOR_RES)= 0.2254&lt;br /&gt;
 rx timeout = EVENT0·C(RX_TIME, WOR_RES) ·26/X(=26) = 34667*0.2254 us = 7.8139 ms&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ShutterContact seems to always sleep. Thus it is necessary to trigger it manually (by opening/closing the window) to make it receive messages. Pushing the button may work to. It is also awake just after&lt;br /&gt;
pairing, so one may send messages right then. One can use the WakeUp message to keep it from sleeping for some time. (This is also the reason why in the official MAX software, one must trigger the ShutterContact&lt;br /&gt;
after removing it from the house. The &amp;quot;factoryReset&amp;quot; packet is sent directly after the &amp;quot;ShutterContactState&amp;quot; packet has been acked.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme und Lösungen ==&lt;br /&gt;
=== Der Wandthermostat oder Heizthermostat reagieren nicht auf Änderungen über FHEM ===&lt;br /&gt;
Das Autocreate von FHEM erkennt, wenn aktiviert, die Geräte initial und legt auch Einträge an. Es fehlt aber noch das Pairing, da sonst keine Steuerung möglich ist!&lt;br /&gt;
Wenn im Log also Meldungen wie&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;2013.03.20 15:12:30 5: CUL_MAX_SendQueueHandler: 1 items in queue&lt;br /&gt;
 2013.03.20 15:12:30 5: CUL_MAX_SendQueueHandler: 1 items in queue&lt;br /&gt;
 2013.03.20 15:12:30 2: CUL_MAX_SendQueueHandler: Missing ack from 01c9bb for 0b05008212345601c9bb0000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auftauchen (im Verbose Modus 5), dann wurde vermutlich kein oder ein inkorrektes Paring durchgeführt.&lt;br /&gt;
Nach dem Pairing sollten diese Meldungen verschwinden und stattdessen etwas wie&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;2013.03.20 15:21:43 5: Got matching ack&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auftauchen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Kontaktsensor (magnetisch)]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:MAX]]&lt;/div&gt;</summary>
		<author><name>Arne</name></author>
	</entry>
</feed>