<?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=Kamischi</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=Kamischi"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Kamischi"/>
	<updated>2026-04-30T15:38:53Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:FHEM_on_OS_X_Lion_with_CUL_v1&amp;diff=10444</id>
		<title>Diskussion:FHEM on OS X Lion with CUL v1</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:FHEM_on_OS_X_Lion_with_CUL_v1&amp;diff=10444"/>
		<updated>2015-03-06T08:11:17Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: Installation nach /usr/sbin?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ist es nicht besser, statt nach /usr/sbin zu kopieren, /usr/local/sbin zu nehmen oder gibt das Probleme.&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=10443</id>
		<title>HM-CFG-USB USB Konfigurations-Adapter</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=10443"/>
		<updated>2015-03-06T08:09:52Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: /* Einrichtung unter Mac OS X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=platzHalter.png&lt;br /&gt;
|Bildbeschreibung=todo&lt;br /&gt;
|HWProtocol=HomeMatic &lt;br /&gt;
|HWType=Interface/Gateway&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868,3MHz&lt;br /&gt;
|HWChannels=&lt;br /&gt;
|HWVoltage=&lt;br /&gt;
|HWPowerConsumption=&lt;br /&gt;
|HWPoweredBy=USB-Bus&lt;br /&gt;
|HWSize=&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#CUL_HM CUL_HM]&lt;br /&gt;
&amp;lt;!-- |ModOwner=  --&amp;gt;&lt;br /&gt;
|HWManufacturer=HomeMatic &lt;br /&gt;
}}&lt;br /&gt;
Der [[HomeMatic]] &#039;&#039;&#039;USB Konfigurations-Adapter&#039;&#039;&#039; ist ein USB-Stick, der außer zur Konfiguration von HomeMatic Komponenten auch als [[Interface]] zwischen Fhem und HomeMatic Geräten benutzt werden kann. Er existiert in zwei Versionen: der älteren HM-CFG-USB und der neueren HM-CFG-USB2. Die folgenden Beschreibungen gelten für beide Versionen, es sei denn, es ist ausdrücklich eine spezifische Version genannt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
Im Fhem-Forum wird die Einbindung als Interface in diesem {{Link2Forum|Topic=13071}} beschrieben und diskutiert. Im {{Link2Forum|Topic=13071|Message=79872|LinkText=Eröffnungsbeitrag}} wird eine gut funktionierende HMLAN-Emulationssoftware [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb hmland] von ihrem Entwickler vorgestellt, um den HM-CFG-USB in Fhem zu integrieren. Die HMLAN-Emulationssoftware muss zunächst kompiliert und installiert werden. Anschließend wird der HM-CFG-USB (üblicherweise auf localhost) genau wie [[HM-CFG-LAN LAN Konfigurations-Adapter|HMLAN]] in Fhem eingebunden. &lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Linux ===&lt;br /&gt;
Die Schritte zur Kompilierung und Installation hat der hmland-Entwickler sowohl auf der [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb hmland-Internetseite] in Englisch (kurz) als auch im oben genannten {{Link2Forum|Topic=13071|Message=79872|LinkText=Eröffnungsbeitrag}} in Deutsch (ausführlich) dargestellt. Die dort gemachten Angaben werden auch bei Bedarf aktualisiert und sind deshalb der beste Anlaufpunkt für Kompilierung und Installation. &lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Angaben in diesem Abschnitt sind rein zu Informationszwecken (noch) enthalten: &lt;br /&gt;
&lt;br /&gt;
Zunächst muss die HMLAN-Emulationssoftware kompiliert werden. Analog zu [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb dieser Beschreibung] ist die Vorgehensweise die folgende (in Debian/Ubuntu/Raspbian):&lt;br /&gt;
 cd /opt/&lt;br /&gt;
 apt-get install build-essential libusb-1.0-0-dev make gcc git-core&lt;br /&gt;
 git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
 cd hmcfgusb&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
(Unter Debian ist &amp;quot;build-essentials&amp;quot; nicht als Paket vorhanden, dieser Schritt kann entfallen.)&lt;br /&gt;
&lt;br /&gt;
Danach kann der Dienst zu Testzwecken gestartet werden (in /opt/hmcfgusb):&lt;br /&gt;
:&amp;lt;code&amp;gt;./hmland -p 1234 -D&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start als Daemon ====&lt;br /&gt;
Um den hmland als Daemon mit dem Betriebsystem automatisiert zu starten, kann ein init-script genutzt werden. In diesem {{Link2Forum|Topic=13071|Message=190887}} ist ein Skript zur automatischen Einrichtung von hmland als Daemon über init mit Installationsanweisung enthalten. Dieses Skript enthält zudem auch die Befehle zum Download, Kompilierung und Installation von hmland, so dass fast keine manuellen Eingriffe notwendig sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ ist auch der (umständlichere) manuelle Weg möglich:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides: hmland&lt;br /&gt;
# Required-Start: $localfs $syslog $remote_fs&lt;br /&gt;
# Required-Stop:&lt;br /&gt;
# Default-Start: 2 3 4 5&lt;br /&gt;
# Default-Stop: 0 1 6&lt;br /&gt;
# Short-Description: hmland daemon&lt;br /&gt;
# Description: hmland daemon, Homematic USB Adapter on port 1234&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
 # simple init for hmland&lt;br /&gt;
 &lt;br /&gt;
 pidfile=/var/run/hmland.pid&lt;br /&gt;
 port=1234&lt;br /&gt;
 &lt;br /&gt;
 case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start|&amp;quot;&amp;quot;)&lt;br /&gt;
 	chrt 50 /opt/hmcfgusb/hmland -d -P -l 127.0.0.1 -p $port 2&amp;gt;&amp;amp;1 | perl -ne &#039;$|=1; print localtime . &amp;quot;: [hmland] $_&amp;quot;&#039; &amp;gt;&amp;gt; /var/log/hmland.log &amp;amp;&lt;br /&gt;
 	;;&lt;br /&gt;
  restart|reload|force-reload)&lt;br /&gt;
 	echo &amp;quot;Error: argument &#039;$1&#039; not supported&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
  stop)&lt;br /&gt;
 	killall hmland&lt;br /&gt;
 	;;&lt;br /&gt;
  status)&lt;br /&gt;
 	if [ ! -e $pidfile ]; then&lt;br /&gt;
 		echo &amp;quot;No pid&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 	pid=`cat $pidfile`&lt;br /&gt;
 	if kill -0 $pid &amp;amp;&amp;gt;1 &amp;gt; /dev/null; then&lt;br /&gt;
 		echo &amp;quot;Running&amp;quot;&lt;br /&gt;
 		exit 0&lt;br /&gt;
 	else&lt;br /&gt;
 		rm $pidfile&lt;br /&gt;
 		echo &amp;quot;Not running&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 &lt;br /&gt;
 	;;&lt;br /&gt;
  *)&lt;br /&gt;
 	echo &amp;quot;Usage: hmland [start|stop|status]&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
 esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Distributionen, die Upstart einsetzen (z.B. xbian) kann folgendes Konfigurationsfile verwendet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# HMLAND&lt;br /&gt;
&lt;br /&gt;
description     &amp;quot;hmland&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start on starting fhem&lt;br /&gt;
stop on stopped fhem&lt;br /&gt;
&lt;br /&gt;
respawn&lt;br /&gt;
expect fork&lt;br /&gt;
&lt;br /&gt;
chdir /opt/hmcfgusb&lt;br /&gt;
exec /opt/hmcfgusb/hmland -d -l 127.0.0.1 -p 1234&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte als &amp;quot;/etc/init/hmland.conf&amp;quot; angelegt werden. Mit dem Befehl &lt;br /&gt;
 initctl reload-configuration&lt;br /&gt;
wird Upstart angewiesen, seine Konfiguration erneut einzulesen. Danach kann der neue Dienst &lt;br /&gt;
mit &lt;br /&gt;
 service hmland start&lt;br /&gt;
gestartet werden. &amp;lt;code&amp;gt;hmland&amp;lt;/code&amp;gt; wird jetzt immer vor Fhem gestartet und nach Fhem beendet.&lt;br /&gt;
&lt;br /&gt;
==== Start über Fhem Startskript ====&lt;br /&gt;
&lt;br /&gt;
Ausprobiert auf einem BBB mit Debian, eigentlich ist das alles von Betateilchen:&lt;br /&gt;
&lt;br /&gt;
Zunächst hmland kompilieren wie oben beschrieben, bis zum make. Das muss erfolgreich durchgelaufen sein.&lt;br /&gt;
&lt;br /&gt;
Dann geht es weiter:&lt;br /&gt;
&lt;br /&gt;
 sudo cp hmcfgusb.rules /etc/udev/rules.d/&lt;br /&gt;
&lt;br /&gt;
Jetzt das Fhem Startskript anpassen (in den Blöcken &#039;start&#039; und &#039;stop&#039; muss quasi nur jeweils 1 Zeile eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
Damit editiert man das Fhem Startskript:&lt;br /&gt;
 sudo nano /etc/init.d/fhem&lt;br /&gt;
&lt;br /&gt;
Und so sollten die Blöcke anschließend aussehen (bitte nur jeweils die Zeile mit hmland einfügen)&lt;br /&gt;
&lt;br /&gt;
 &#039;start&#039;)&lt;br /&gt;
        echo &amp;quot;Starting fhem...&amp;quot;&lt;br /&gt;
        /opt/hmcfgusb/hmland -d -p 1234&lt;br /&gt;
        perl fhem.pl fhem.cfg&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        ;;&lt;br /&gt;
&lt;br /&gt;
 &#039;stop&#039;)&lt;br /&gt;
        echo &amp;quot;Stopping fhem...&amp;quot;&lt;br /&gt;
        perl fhem.pl $port &amp;quot;shutdown&amp;quot;&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        pkill hmland&lt;br /&gt;
&lt;br /&gt;
So wird hmland vor Fhem gestartet und nach Fhem beendet. Letztlich erspart es Probleme mit den diversen Startskripten und ihren Rechten.&lt;br /&gt;
&lt;br /&gt;
Es dauert nach dem Start von Fhem noch einige Sekunden, bis hmland fertig geladen ist. In dieser Zeit kann es zu fehlerhaften Einträgen im Logfile kommen.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Mac OS X ===&lt;br /&gt;
Wie unter Linux braucht man die HMLAN-Emulationssoftware hmland, die man aus Quelltexten erstellen muss. Dazu muss man die Bibliothek libusb installieren, entweder mit einem der Paketmanager wie Fink, MacPorts oder Homebrew oder direkt aus den Quellentexten (Beispiel: &amp;quot;fink install libusb1-shlibs libusb1&amp;quot;). Hat man wie bei Linux das Quelltextarchiv für hmland heruntergeladen und ausgepackt, müssen die Dateien Makefile und hmcfgusb.c angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Im Makefile muss man den Pfad zur libusb anpassen. Hat man libusb mit fink installiert, muss man, &amp;quot;/opt/local/&amp;quot; durch &amp;quot;/sw/&amp;quot; bei den CFLAGS und den LDFLAGS ersetzen und&lt;br /&gt;
das &amp;quot;-lrt&amp;quot; aus den LDLIBS entfernen. Die Library librt gibt es bei Mac OS X nicht und wird anscheinend auch nicht gebraucht. (Stimmt das eigentlich?)&lt;br /&gt;
&lt;br /&gt;
In der Datei hmcfgusb.c muss man die Zeilen 130-134 mit dem Aufruf libusb_detach_kernel_driver auskommentieren oder löschen. Der geht nicht auf Mac OS X.&lt;br /&gt;
&lt;br /&gt;
Nach den Änderungen in den zwei Dateien, kann man wie bei Linux den Dämon hmland mit dem Kommando &amp;quot;make&amp;quot; erzeugen und mit &amp;quot;./hmland&amp;quot; ausführen. Automatisches Starten beim Booten mit launchd ist noch nicht probiert.&lt;br /&gt;
&lt;br /&gt;
Beim Start von hmland sollte man folgende Fehlermeldung in einer Endlos-Schleife erhalten:&lt;br /&gt;
&lt;br /&gt;
Datum Zeit: Client 127.0.0.1 connected! &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t claim interface: Access denied (insufficient permissions) &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t find/open hmcfgusb! &amp;lt;br /&amp;gt;&lt;br /&gt;
Datum Zeit: Connection to 127.0.0.1 closed! &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ein Start von hmland mit Superuser-Rechten ändert daran nichts. Damit das claim interface klappt, muss man eine codeless kext in den Ordner /Library/Extensions legen. Ich habe dieses (http://mspdebug.sourceforge.net/misc/ex430rf2500-kext.zip) herunter geladen. Damit es funktioniert, muss man aber in der Datei Info.plist des Bundle die Properties idProduct und idVendor ändern, entweder mit dem Property List Editor oder einem anderen Texteditor. Die beiden Properties sind etwas versteckt bei Information Property List → IOKitPersonalities → ComIntf. Bei DebugIntf und DeviceDriver scheint man es nicht ändern zu müssen, aber schaden kann es nicht.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
idProduct: 49167&amp;lt;br /&amp;gt;&lt;br /&gt;
idVendor: 6943&lt;br /&gt;
&lt;br /&gt;
Die Rechte des kext-Bundles müssen auch noch gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
  chmod -R 755 ex430rf2500.kext&lt;br /&gt;
  chown -R root:wheel ex430rf2500.kext&lt;br /&gt;
&lt;br /&gt;
Danach die Datei ex430rf2500.kext in den Ordner /Library/Extensions legen und hmland sollte dann funktionieren.&lt;br /&gt;
&lt;br /&gt;
Es kann sein, dass ab Mac OS X 10.9 der Trick mit dem codeless kext nicht mehr funktioniert, aber noch ist das nicht getestet oder bestätigt. Langfristig kann man vielleicht auch eine kext mit einem Treiber für den HM-CFG-USB USB erstellen&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Windows ===&lt;br /&gt;
Bei der Einrichtung und vermutlich auch dem Betrieb unter Windows 8.1 sind wegen der erweiterten Energieverwaltungsfunktionen die von eQ-3 [http://www.eq-3.de/Downloads/eq3/pdf_FAQ/Funk-Konfigurationsdapter-USB_Windos_8.1.pdf zusammengestellten Tipps] zu befolgen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
=== Stick nicht (mehr) ansprechbar ===&lt;br /&gt;
Zitat aus dem {{Link2Forum|Topic=32502|Message=249122|LinkText=Fhem-Forum}}: &lt;br /&gt;
:&#039;&#039;... befürchte ich, dass dein Stick das Zeitliche gesegnet hat. Machen die Dinger leider sehr gerne... Ganz besonders beim Modus-Wechsel vom 10k- in den 100k-Modus, wenn man bei irgendeinem Device ein Firmwareupdate durchführt. &amp;lt;br /&amp;gt;Die gute Nachricht ist, dass der Fehler bei sämtlichen Händlern bekannt ist und anstandslos getauscht wird.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi ===&lt;br /&gt;
Der USB-Stack am Raspberry Pi ist für viele Probleme verantwortlich. Daher sieht man öfter Fehlermeldungen:&lt;br /&gt;
:&amp;lt;code&amp;gt;usb-transfer took more than 100ms (1039ms), this may lead to timing problems!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da das Timing bei Homematic wichtig ist führt das zu vielen Retransmits und zu unzuverlässigen Aktoren. Als Workaround kann man den USB-Stack auf die deutlich langsamere Version 1.1 stellen. Dazu fügt man folgenden Text am Anfang der Datei /boot/cmdline.txt ein:&lt;br /&gt;
:&amp;lt;code&amp;gt;dwc_otg.speed=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
Die erweiterte Energieverwaltung unter Windows 8.1 kann dazu führen, dass der Adapter unerwünschterweise in den Stand-by Modus versetzt wird (siehe [[HM-CFG-USB USB Konfigurations-Adapter#Einrichtung unter Windows|Einrichtung unter Windows]]).&lt;br /&gt;
&lt;br /&gt;
== Weitergehende Informationen ==&lt;br /&gt;
Es sind zwei Versionen des HM-CFG-USB im Umlauf:&lt;br /&gt;
* HM-CFG-USB-2: die aktuelle Version; Dokumentation derzeit (12/2013) nicht über die ELV-Artikelseite verfügbar, alternativ jedoch bei [http://files.voelkner.de/625000-649999/640558-an-01-ml-USB_FUNK_KONFIGURATIONSADAPTER_de_en.pdf Völkner]; Kennzeichen dieser Version: &lt;br /&gt;
** Größe: 28 x 84 x 11,5&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 18&amp;amp;nbsp;g&lt;br /&gt;
** Antenne innenliegend&lt;br /&gt;
* HM-CFG-USB: Vorgängerversion; Stand 12/2013 noch Restbestände im Handel verfügbar. Dokumentation ([http://files.voelkner.de/625000-649999/646462-an-01-ml-HM_Konfigurationsadapter_CFG_USB_de_en.pdf Völkner]); Kennzeichen:&lt;br /&gt;
** Anschluss per separatem USB-Kabel&lt;br /&gt;
** abstehende Stabantenne&lt;br /&gt;
** Größe: 40 x 90 x 25&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 45&amp;amp;nbsp;g&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Fhem-Forums {{Link2Forum|Topic=13071}}: HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen&lt;br /&gt;
* [http://www.elv.de/homematic-usb-konfigurations-adapter-1.html ELV Shopseite] zum HM-CFG-USB&lt;br /&gt;
* [http://www.eq-3.de/produkt-detail-zentralen-und-gateways/items/homematic-funk-konfigurationsadapter-usb.html eQ-3 Produktseite] zum &amp;quot;HomeMatic Funk-Konfigurationsadapter USB&amp;quot;; Downloads, technische Daten, etc.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:OSX]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Kamischi&amp;diff=10442</id>
		<title>Benutzer:Kamischi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Kamischi&amp;diff=10442"/>
		<updated>2015-03-06T08:07:06Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: Die Seite wurde neu angelegt: „Ich interessiere mich für FHEM auf dem Mac.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich interessiere mich für FHEM auf dem Mac.&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=LinuxDeviceNaming&amp;diff=7331</id>
		<title>LinuxDeviceNaming</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=LinuxDeviceNaming&amp;diff=7331"/>
		<updated>2014-08-14T13:59:14Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;USB-Geräte erhalten unter Linux standardmäßig generische Namen. CUL erscheint beispielsweise unter&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/dev/ttyACM0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
beim ersten Anstecken. Bei mehrmaligen Anstecken wird die Gerätenummer hochgezählt. Damit Geräte immer denselben Namen erhalten, kann man dem udev-Dateisystem dafür Regeln mitgeben. &lt;br /&gt;
&lt;br /&gt;
Unter openSUSE 11.x kann man dazu unter&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/etc/udev/rules.d&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
eine Datei&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;69-my.rules&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
anlegen mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;KERNEL==&amp;quot;ttyUSB*&amp;quot;, ATTRS{product}==&amp;quot;ELV EM 1010 PC&amp;quot;, SYMLINK+=&amp;quot;elv_em1010pc&amp;quot;&lt;br /&gt;
KERNEL==&amp;quot;ttyUSB*&amp;quot;, ATTRS{product}==&amp;quot;ELV FHZ 1300 PC&amp;quot;, SYMLINK+=&amp;quot;elv_fhz1300pc&amp;quot;&lt;br /&gt;
KERNEL==&amp;quot;tty*&amp;quot;, SYSFS{idVendor}==&amp;quot;03eb&amp;quot;, SYSFS{idProduct}==&amp;quot;204b&amp;quot;, MODE=&amp;quot;0666&amp;quot;, BUS==&amp;quot;usb&amp;quot;, SYMLINK+=&amp;quot;CUL&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dadurch werden symbolische Links &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/dev/elv_em1010pc&lt;br /&gt;
/dev/elv_fhz1300pc&lt;br /&gt;
/dev/CUL&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
angelegt und die Berechtigungen angemessen gesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Kommunikationsprobleme_mit_FHT&amp;diff=7291</id>
		<title>Kommunikationsprobleme mit FHT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Kommunikationsprobleme_mit_FHT&amp;diff=7291"/>
		<updated>2014-08-13T12:03:14Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: /* Problemquellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Während FHEM mit reinen Schaltaktoren in der Regel problemarm funktioniert, sind Probleme mit [[FHT80b]] Heizungsteuerungen recht häufig. Dies liegt in der deutlich anspruchsvolleren bidirektionalen Kommunikation, die zur Übermittlung der ggf. durchaus umfangreichen Daten notwendig ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Symptome ==&lt;br /&gt;
Im Einsatz von FHTs kann es zu folgenden Symptomen kommen:&lt;br /&gt;
&lt;br /&gt;
* FHT funktioniert zunächst einwandfrei, dann plötzlich sind keine Temperaturänderungen o.ä. mehr möglich&lt;br /&gt;
* FHTs funktionieren einwandfrei, jedoch seitdem ein weiteres dazu gekommen ist, wird die Datenübertragung langsam oder fällt ganz aus, auch zu FHTs, die vorher ohne Probleme liefen.&lt;br /&gt;
* FHT funktioniert manchmal für Stunden gut, übermittelt aktuelle Werte und lässt sich ansprechen, dann für mehrere Stunden wieder nicht, schliesslich &amp;quot;erholt&amp;quot; sich das FHT wieder (oft über Nacht)&lt;br /&gt;
* Temperaturänderungen werden von FHT mit hoher Verzögerung (bis hin zu Stunden) ausgeführt&lt;br /&gt;
* FHTs laufen ca. eine Woche problemfrei, dann kommen keinen Daten mehr. Nach einem neuen Pairing ist alles wieder in Ordnung, bis nach ca. einer Woche wieder keine Daten kommen.&lt;br /&gt;
&lt;br /&gt;
== Problemquellen ==&lt;br /&gt;
Die FHT-Kommunikation ist recht fragil. Für eine erfolgreiche Kommunikation müssen eine Menge Funktelegramme in einem bestimmten Timing ausgetauscht werden. Selbst wenn keine Kommandos an das [[FHT80b]] übergeben werden, finden alle 15 Minuten Datenübermittlungen statt, da das FHT Temperatur und andere Daten meldet.&lt;br /&gt;
&lt;br /&gt;
Bereits ein fehlendes Datenpaket kann dazu führen, dass die Kommunikation erfolglos war und insgesamt alles wiederholt werden muss.&lt;br /&gt;
&lt;br /&gt;
Störungen des Kanals (z.B. der berühmte Funkkopfhörer aus China) führen daher so gut wie immer zu Problemen in der FHT-Kommunikation. Es reicht, wenn von den 5+n Kommandos (n=Anzahl der übermittelten Werteänderungen) die mindestens hin und her gehen müssen, eines nicht korrekt ankommt und schon muss alles wiederholt werden.&lt;br /&gt;
&lt;br /&gt;
Diese Wiederholung kann aber nur ca. alle 2 Minuten erfolgen. Kommandos, die noch nicht erfolgreich abgearbeitet wurden, verbleiben im FHT Befehlsbuffer des CUL/CUNO (oder sonstiger Funkschnittstellen), obwohl sie seitens FHEM als &amp;quot;abgesetzt&amp;quot; geloggt werden. Dieser FHT Buffer kann mitunter sehr viele Kommandos aufnehmen, die der Reihe nach abgearbeitet werden. Kann z.B. eine Temperaturänderung aufgrund von Funkproblemen erst nach ca. 3 Versuchen erfolgreich zugestellt werden, so dauert es in der Regel etwa 3 x 2 = 6 Minuten, bis die Änderung im FHT sichtbar ankommt. Wird z.B. aus Ungeduld eine erneute Temperaturänderung ausgelöst, so wird diese im FHT Buffer gespeichert und dann nach erfolgter Übertragung des ersten Kommandos übermittelt. Die Abarbeitungszeit der Warteschlange für dieses FHT steigt dann bereits auf ca. 12 Minuten. Es ist leicht möglich, durch Abfrage der Wochenprogramme, Änderung der Day- oder Nighttemperatur, oder Änderung von Wochenschaltpunkten Warteschlangen aufzubauen, die buchstäblich Stunden oder gar Tage zum Abarbeiten benötigen. Temperaturänderungen könnten also mitunter erst Stunden später tatsächlich ausgeführt werden. Jeder Aussendungsversuch führt außerdem zur Belastung des Sendekontos. Ist die [[1% Regel]] überschritten, wird die Warteschlange nicht mehr weiter abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
Solche Störungen des Funkkanals sind nicht selten und können auch ohne äußere Einflüsse stattfinden.&lt;br /&gt;
Die FHTs sind mit relativ ungenauen Sendern ausgestattet und können in Sendefrequenz und Flankensteilheit mitunter deutlich von den Sollwerten abweichen, was insbesondere beim Einsatz von CUL / CUNO (weniger beim Einsatz einer FHZ1x00PC) ein Problem sein kann, weil die CUL / CUNO eher trennscharf sind. Dies kann dazu führen, dass die Funkkommunikation oft fehlerhaft ist oder sogar ganz abbricht.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich stellen einige FHTs das Aussenden von Temperatur und weiteren Daten nach 5-10 Tagen ein, wenn nicht zwischendurch von der Zentrale Änderungen übermittelt wurden.&lt;br /&gt;
&lt;br /&gt;
Alle vorstehenden Gründe kombinieren sich für gewöhnlich zu einem komplexen Versagensszenario, das sich gegenseitig selbst verstärkt:&lt;br /&gt;
&lt;br /&gt;
* Schlechte Funklage eines FHT80b erzeugt häufige Retrys.&lt;br /&gt;
* Inzwischen stauen sich weitere Kommandos an das FHT auf, z.B. wegen erneuter Temperaturänderungen, automatisiert oder aus Ungeduld, sowie andere Meldungen, etwa Abfrage oder Ändern des Wochenprogramms.&lt;br /&gt;
* Die Kommandos sammeln sich im FHT Buffer des Funkadapters an und sorgen dafür, dass die Sendezeit hoch belastet wird.&lt;br /&gt;
* Fast Glück hat man noch, wenn der Buffer voll läuft und [[EOB]] Meldungen im Log darauf hinweisen. Es kann aber auch passieren, dass über grössere Zeiträume der Buffer gerade eben nicht voll wird, insbesondere bei CUL / CUN, die im Vergleich zur FHZ1x00PC große Buffer haben, die 30 und mehr Kommandos halten können. Ist zusätzlich das Feature &amp;quot;Softbuffer&amp;quot; eingeschaltet, verschlimmert sich die Situation weiter, da die Warteschlange noch länger werden kann.&lt;br /&gt;
* Ist die 1% Marke erreicht, das Funkkontingent also aufgebraucht, verschlimmert sich die Situation dramatisch: Nun bricht auch die Kommunikation mit anderen FHTs zusammen. Da außerdem immer Kommandos im FHT Buffer sind, wird jede freie Sendezeit durch Versuche, die Warteschlange abzuarbeiten, sofort wieder aufgebraucht. Das Timing des Gesamtsystems ist hier leider so, dass sich innerhalb des Retryintervals von ca. 2 Minuten oft gerade zu wenig freie Sendezeiteinheiten aufbauen, um den nächsten Retry komplett abwickeln zu können. D.h. jedes Retry braucht die gerade aufgebauten freien Sendeeinheiten auf, ist aber in sich erfolglos.&lt;br /&gt;
* Spätestens ab hier ist vollständiger Stillstand erreicht. Im Log häufen sich die [[LOVF]]- Meldungen, jede Kommunikation mit allen FHTs ist zusammengebrochen. Es kommt eventuell sogar zu Beeinträchtigungen beim Schalten von FS20 Aktoren.&lt;br /&gt;
&lt;br /&gt;
Mit der Anzahl FHTs steigt die Wahrscheinlichkeit für das Auftreten dieser Probleme.&lt;br /&gt;
&lt;br /&gt;
Viele FHEM Nutzer verwenden die Kombination von FHEM und FHT so, dass die FHTs über Manipulation der im FHT gespeicherten Wochenprogramme, Schaltpunkte und Day/Nighttemp gesteuert werden. Dies erhöht die Datenmenge im Vergleich zu einer direkten Temperatursteuerung (&amp;quot;set desired-temp 22&amp;quot;) und wird in kritischen Situationen die Fehlerhäufigkeit deutlich anheben. Sehr viel Datenverkehr erzeugt auch die komplette Abfrage des Wochenprogramms mittels Report1=255.&lt;br /&gt;
&lt;br /&gt;
== Diagnose und Lösungsansätze ==&lt;br /&gt;
Im Folgenden einige Hinweise wie man das Auftreten von Problemen verringern bzw. diagnostizieren kann.&lt;br /&gt;
&lt;br /&gt;
=== Sparsam mit Funkzeit umgehen ===&lt;br /&gt;
Da die Ausnutzung der freien Funkzeit jede Situation schnell deutlich verschlimmert, sollte man immer bemüht sein, seine Ziele mit wenig Datenverkehr zu erreichen. Dies gilt insbesondere, wenn man sich der Anzahl [[Maximal nutzbare Geräte]] nähert.&lt;br /&gt;
&lt;br /&gt;
*  [http://www.fhemwiki.de/wiki/Heizung_mit_Bewegungsmelder_steuern#FHT80b FHT Lazy Mode] nutzen (Temperaturänderungen werden nur übertragen, wenn sie von der momentan eingestellten Temperatur abweichen.) Dies ist besonders hilfreich, wenn die Temperatursteuerung automatisiert durch Bewegungsmelder oder &amp;quot;Zuhausestatus&amp;quot;-Automatismen gesteuert wird, da hier in relativ kurzer Folge die selbe Temperatureinstellung übermittelt wird. Lazy Mode schützt aber nicht immer davor, dass die Warteschlange schnell anschwillt. Steht ein FHT80b z.b. auf 18 Grad, und soll auf 20 Grad angehoben werden, so wird das Kommando trotz Lazy Mode immer wieder in die Warteschlange eingetragen, solange das erste Kommando nicht erfolgreich abgesetzt und die neue Temperatur vom FHT rückgemeldet wurde. Das kann dazu führen, dass die FHT-Warteschlange dutzende Male das selbe &amp;quot;desired-temp&amp;quot; Kommando enthält.&lt;br /&gt;
* Temperatursteuerung der FHTs nicht auf täglicher Basis durch Setzen der Wochenprograme im FHT durchführen. Obwohl diese Methode den Vorteil hat, dass sie eine höhere Ausfallsicherheit bietet (weil die FHTs auch ohne FHEM ihr zuletzt eingegebenes Wochenprogamm weiter verwenden können), so steigt der auszutauschende Datenverkehr stark an.&lt;br /&gt;
&lt;br /&gt;
:Mitunter verwendete Implementationen, die Anhand von Tabellen, Kalendern oder der Auswertung von Excelsheets mehrere FHTs regelmässig mit geänderten Wochenprogrammen und/oder Änderungen der Day/Night Temperaturen steuern, sind in schwierigen Funksituation deutlich anfälliger.&lt;br /&gt;
&lt;br /&gt;
* Keine regelmässigen Reports abfragen, insbesondere NICHT report1=255 (also komplettes Wochenprogramm abfragen)&lt;br /&gt;
:Da einige FHTs nach einiger Zeit keine Temperaturdaten mehr senden, fragen viele Nutzer diese über tägliches Absetzen von report2=255 ab. Besser ist es jedoch, das FHT mit einem Wachdog zu überwachen und nur bei Bedarf zu &amp;quot;wecken&amp;quot;, z.B. so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define wd_FHT_Wohnzimmer watchdog hzg_wohnzimmer:measured-temp.* 01:00 SAME set hzg_wohnzimmer time&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:Alternativ report2=255 1-2x pro Woche nachts absetzen, bei mehreren FHTs eventuell tageweise versetzt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define fht_reportZimmer1 at *04:00:00 {if ($wday == 1) { fhem(&amp;quot;set hzg_Zimmer1 report2 255&amp;quot;)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funklage beobachten ===&lt;br /&gt;
* RSSI mitloggen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;attr CUL addvaltrigger 1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* RSSI der FHTs beobachten. Unter -85 (also z.b. -89) ist ungünstig. Unbedingt versuchen, ein besseres RSSI als -85 hinzubekommen, zu ALLEN FHTs.&lt;br /&gt;
* Antennnenlage des CUL/CUN korrigieren (z.b. Antenne um 45 Grad kippen), eventuell Lage des FHTs ändern, ein halber Meter kann schon viel bringen. Dabei kommt es nicht zwingend nur auf die absolute Entfernung zum Funkadapter an, auch die Lage im Gebäude kann viel ausmachen.&lt;br /&gt;
* Wenn CUL / CUN eingesetzt werden, gegebenenfalls die Parameter freq, bandwidth und sens ändern. Als Startpunkt z.B. bandwidth auf 464 khz und sens auf 8 db anstelle 4db ändern. Kombinationen ausprobieren, aber nicht mehrere Parameter gleichzeitig ändern. RSSI-Auswirkung jeder Änderung beobachten.&lt;br /&gt;
&lt;br /&gt;
Wenn das keinen Erfolg bringt, zweiten CUL / CUNO einsetzen, z.b. auch als RFR CUL. Dabei  [[RFR CUL und FHT80]] Besonderheiten berücksichtigen: Nicht zu viele FHTs ans RFR CUL anbinden, nur so viele wie gerade nötig. FS20 Repeater helfen nicht.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen prüfen ===&lt;br /&gt;
&lt;br /&gt;
* Attribut fhtsoftbuffer ausschalten. Beim Einsatz von CUL/CUNO ist die Verwendung von fhtsoftbuffer sowieso überflüssig, da die eigenen FHT Buffer dieser Adapter hinreichend groß sind. Gedacht ist dieses Attribut vor allem für den Einsatz von FHEM mit FHZ1x00PC Zentralen, deren FHT Buffer klein ist und zum Teil nur 8 Befehle halten kann. Das CUL V3 kann demgegenüber 40 FHT Befehle im Buffer halten. D.h. bei einer FHZ1x00PC kann es vorkommen, dass bei 10 zu steuernden FHTs schon ein Kommando der Art &amp;quot;Alle FHTs auf 20 Grad&amp;quot; *nicht* bei allen FHTs ankommt, da nicht alle Befehle zugleich in den Buffer passen. In solchen Fällen ist der Einsatz des Softbuffers hilfreich. (in neueren FHEM Versionen hat das Attribut fhtsoftbuffer daher auf CUL und CUNOs keine Wirkung mehr)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;Das Attribut fhtsoftbuffer erzeugt einen &amp;quot;unendlich&amp;quot; grossen Buffer, was sehr lange Warteschlangen zur Folge haben kann. Das macht die Diagnose sehr schwer und erzeugt seltsamste Effekte, wenn die Kommunikation mit den FHTs nicht einwandfrei ist. In jedem Fall aber &amp;quot;glaubt&amp;quot; FHEM sehr viel länger, dass alles in Ordnung sei, obwohl die Kommunikation gestört ist.&lt;br /&gt;
&lt;br /&gt;
Ganz generell: Wenn eine Installation ohne fhtsoftbuffer nicht zuverlässig läuft, sollte man der Versuchung widerstehen, das Problem durch einen grösseren Buffer lösen zu wollen. Fhtsoftbuffer sollte nur eingesetzt werden, wenn eine FHZ1x00 verwendet wird, die Installation an sich gut läuft und nur gelegentlich EOB Meldungen kommen.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Retrycount auf 1. Wenn fhtsoftbuffer aktiv ist, wird versucht, das Kommando Retrycount-Mal zu wiederholen, wenn es nicht innerhalb von 240 Sekunden abgesetzt werden kann. Das kann die Abarbeitungsgeschwindigkeit der Warteschlange zusätzlich senken, gleichzeitig den Funkzeitverbrauch erhöhen und dadurch Probleme eher noch verschärfen. Sinnvoll ist ein höherer Retrycount womöglich nur, wenn in kleineren Installationen ein FHT gerade am Rande des Funkbereiches liegt, ansonsten aber alles problemfrei abläuft. Ohne  fhtsoftbuffer hat retrycount keine Wirkung, wenn retrycount nicht definiert wird, ist der Defaultwert 1.&lt;br /&gt;
&lt;br /&gt;
* Bei mehreren CUxx in der Installation (auch 1 x CUL und 1x RFR CUL) das Attribut IODev kontrollieren. Ist ein FHT mit einem CUxx gepairt, aber das IODev zeigt auf das andere, ist eine Kommunikation nicht möglich. Da aber Temperatur (und weitere Werte) trotzdem empfangen werden, fällt dies zunächst eventuell nicht sofort auf. Der FHTbuffer des &amp;quot;falschen&amp;quot; CUxx wird dann mit Befehlen an das FHT zugemüllt, die nie erfolgreich abgesetzt werden können. Ist der Buffer schliesslich voll, können auch keine Kommandos an andere mit diesem CUxx gepairte FHTs mehr übermittelt werden, obwohl diese eigentlich nicht betroffen sind.&lt;br /&gt;
* Bei mehreren CUxx UNBEDINGT sicherstellen, dass die FHT-ID unterschiedlich ist. Bei gleicher FHT-ID fühlen sich zwei &amp;quot;Zentralen&amp;quot; für die FHT Kommunikation verantwortlich, was immer im Chaos endet: beide Funkadapter antworten bei FHT Kommunikationen und stören sich so gegenseitig. Siehe auch [[Was ist der Hauscode?]].&lt;br /&gt;
* Bei mehreren CUxx bitte auch die Erläuterungen zum [[Sendpool]] Attribut berücksichtigen, die Funktion von Sendpool wird oft missverstanden.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosemöglichkeiten im Fehlerfall ===&lt;br /&gt;
Eine Möglichkeit, sich dem Problem zu nähern ist, das Logfile mit verbose5 anzeigen zu lassen. Die Meldungen sind dann recht detailliert und lassen einige Rückschlüsse zu. Erfahrungsgemäß ist es jedoch besser, sich die Kommunikation mit einer Telnetsitzung anzusehen. Ein Nachteil des Logfiles liegt z.B. darin, dass eine Temperaturänderung als &amp;quot;ausgeführt&amp;quot; angezeigt wird, wenn sie erfolgreich an z.b. das CUL übermittelt wurde, auch wenn sie dort nur in einen schon übervollen Buffer geschrieben wird. In einer Telnetsitzung kann man hingegen den Zustand des Buffers prüfen und die Kommunikation mit dem FHT beobachten.&lt;br /&gt;
&lt;br /&gt;
Dazu:&lt;br /&gt;
&lt;br /&gt;
* Terminalprogramm starten&lt;br /&gt;
* Dann mittels &amp;lt;code&amp;gt;telnet (IP des FHEM Servers) 7072 &amp;amp;lt;entertaste&amp;amp;gt;&amp;lt;/code&amp;gt; eine Telnetverbindung zu FHEM starten (7072 ist FHEMs Telnetport)&lt;br /&gt;
* erneut &amp;amp;lt;entertaste&amp;amp;gt; drücken, nun muss als Prompt &amp;quot;fhem&amp;amp;gt;&amp;quot; erscheinen.&lt;br /&gt;
&lt;br /&gt;
Jetzt können zahlreiche Kommandos zur Diagnose abgegeben werden. &lt;br /&gt;
&lt;br /&gt;
* info timer &amp;amp;lt;entertaste&amp;amp;gt; zeigt einem alle Events, die FHEM empfängt und sendet. Hier kann man die Kommunikation live verfolgen und so z.B. sehen, ob noch Kommunikation mit dem FHT versucht wird. Einfach eine Weile mitlaufen lassen und sich ansehen, was alles passiert.&lt;br /&gt;
* Wenn man einen CUxx im Einsatz hat, dann kann man sich mittels &amp;quot;set CUL raw X61&amp;quot; (&amp;quot;CUL&amp;quot; durch Namen der eigenen Schnittstelle wie in fhemconfig definiert ersetzen) auch Details der Kommunikation anzeigen lassen. So kann man vergleichen, ob die Kommunikation mit dem Beispiel [[FHT80b#Log-Auszug]] übereinstimmt, also planmäßig abläuft. &amp;quot;set CUL raw X21&amp;quot; setzt das CUL wieder auf den Standard-Loglevel zurück. Achtung, Groß- und Kleinschreibung beachten: Das X61/X21 hat ein großes X. &lt;br /&gt;
* Auch sollte man prüfen, ob der der CUxx so konfiguriert ist, wie man glaubt. Mit &amp;quot;get CUL ccconf&amp;quot; kann man die wichtigsten Werte ansehen.&lt;br /&gt;
* Ist der FHT Buffer leer oder was hat sich da ggf. aufgestaut? &amp;quot;&#039;&#039;&#039;get CUL raw T02&#039;&#039;&#039;&amp;quot; ergibt den Inhalt des Buffers. Da sollte möglichst nichts drin stehen (&amp;quot;CUL raw =&amp;amp;gt; N/A&amp;quot;) oder nicht viel. Mit der Zeit erkennt man die Codes gleich, daraus ergibt sich, welches FHT Probleme macht (Adresse) und welche Kommandos noch auf Aussendung warten. Folgender Beispieloutput: &amp;quot;CUL raw =&amp;amp;gt; 060D:4118 060D:65FF 060D:66FF 060D:4120&amp;quot; ist bereits verdächtig. FHT 060D hat noch 4 Kommandos in der Warteschlange, die Abarbeitung hier dauert schon im besten Fall mindesten noch 8 Minuten. Sieht bereits nach &amp;quot;Rückstau&amp;quot; aus. (4118 = desired temp auf Wert 18, 65ff= report1=255 66ff= report2=255).&lt;br /&gt;
* Mehrfaches Eingeben von &amp;quot;get CUL raw T02&amp;quot; im Abstand von ca 2 Minuten (dem Intervall, in dem Kommunikation mit dem FHTs stattfinden kann) zeigt einem, ob die Schlange sich abarbeitet oder welche Kommandos klemmen.&lt;br /&gt;
* Wenn man CUxx im Einsatz hat kann man auch die freie Sendezeit prüfen: &amp;quot;get CUL raw X&amp;quot; Der zweite Zahlenwert ist die Sendezeit in 10ms Slots. Während ein FS20 Schalter im Idealfall mit 21 Einheiten (=210 ms) erledigt werden kann, braucht schon die simpelste Übertragung nur eines Wertes an ein FHT ca. 3x mehr Zeiteinheiten. Wenn also nicht mindestens 65 Zeiteinheiten frei sind, kann keine FHT Übertragung erfolgreich sein.&lt;br /&gt;
* CUxx Funkadapter können auch resettet werden: &amp;quot;set CUL raw B00&amp;quot; resettet das CUL, und löscht dabei alle Buffer und setzt die freie Funkzeit auf Maximum. Die Wirkung ist die selbe wie den Adapter kurz stromlos zu machen. Will man hingegen nur den FHT Buffer leeren, kann man auch &amp;quot;&#039;&#039;&#039;set CUL raw T01xxxx&#039;&#039;&#039;&amp;quot; eingeben, wobei xxxx = FHT-ID istdie aus fhem.cfg aus der CUL-Definition gelesen werden kann. Diese muss natürlich mit der vorherigen übereinstimmen, da sonst alle FHT-Pairings ungültig sind. Nach dem Löschen des Buffers noch kurz mit &amp;quot;get CUL raw T02&amp;quot; überprüfen, dass der buffer auch wirklich leer ist. Anschliessend irgendeinen Befehl an den FHT senden, z.B. Ändern der desired-temp um 1 Grad. Danach fängt der FHT meist wieder an zu senden. Manchmal muss man ihm auch einfach ein bischen Zeit geben, bis er sich wieder fängt.&lt;br /&gt;
&lt;br /&gt;
=== Repairen ===&lt;br /&gt;
Lassen sich durch die obigen Massnahmen keine nahliegenden Problem entdecken, hilft gelegentlich auch ein&lt;br /&gt;
simples neu Pairen eines nicht komunizierenden FHTs.&lt;br /&gt;
&lt;br /&gt;
Wiederkehrende Actuator-Meldung &amp;quot;&#039;&#039;&#039;unknown_69&#039;&#039;&#039;&amp;quot; lassen sich z.b. meist mit einem neuen Pairing lösen.&lt;br /&gt;
&lt;br /&gt;
====Neues Pairen ohne Autocreate====&lt;br /&gt;
*fhem.cfg unbearbeitet lassen&lt;br /&gt;
*FHT80b in Sonderfunktionen &amp;quot;cENT&amp;quot; auf &amp;quot;n/a&amp;quot; stellen, danach sofort in FHEM einen Befehl (egal welchen) an die FHT80b senden. &lt;br /&gt;
*Wenn ca. zwei Minuten später Sonderfunktion cENT auf &amp;quot;ON&amp;quot; steht, war das Pairing erfolgreich.&lt;br /&gt;
&lt;br /&gt;
====Neues Pairing mit Autocreate====&lt;br /&gt;
Alternativ hat auch dieser Weg zum Erfolg geführt:&lt;br /&gt;
*In der fhem.cfg den define-Eintrag für diesen FHT auskommentieren, autocreate ggf. einschalten, sichern.&lt;br /&gt;
*Am FHT80b in Sonderfunktionen &amp;quot;cENT&amp;quot; auf &amp;quot;n/a&amp;quot; stellen, sodass eine neue Paarung eingeleitet wird&lt;br /&gt;
*Warten bis FHEM nach Empfang eines Datenpaktes vom FHT80 das Geräte anlegt. In der nach dem erfolgten autocreate entstehenden Log-Datei nachsehen, warten, bis der angeblich neu entdeckte FHT das erste Mal seinen Status sendet.&lt;br /&gt;
*Wieder die fhem.cfg editieren, darin den &amp;quot;neu entdeckten&amp;quot; FHT löschen und die oben erfolgte Auskommentierung wieder rückgängig machen, autocrate ggf wieder auschalten, sichern.&lt;br /&gt;
&lt;br /&gt;
== Hardware defekt? ==&lt;br /&gt;
Es gibt auch defekte FHT80b, aber oft hilft eine geringe Aufweitung der Bandbreite (siehe oben) oder schlicht eine neuer Satz Batterien. Manchmal führt auch ein &amp;quot;matchen&amp;quot; der FHTs mit der Funklage zum Ziel: Rausfinden, welche FHTs am problemlosesten arbeiten und diese an den Stellen unterbringen, die funktechnisch die ungünstigsten sind, während weniger zuverlässige FHTs näher an der Zentrale eingesetzt werden. Aufgrund der recht primitiven Sender/Empfänger (Pendelempfänger) der FHTs sind hier durchaus deutliche Streuungen möglich.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Artikel ==&lt;br /&gt;
* [[Was ist der Hauscode?]]&lt;br /&gt;
* [[1% Regel]]&lt;br /&gt;
* [[Maximal nutzbare Geräte]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHT Components]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Kommunikationsprobleme_mit_FHT&amp;diff=7290</id>
		<title>Kommunikationsprobleme mit FHT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Kommunikationsprobleme_mit_FHT&amp;diff=7290"/>
		<updated>2014-08-13T11:57:58Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: /* Symptome */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Während FHEM mit reinen Schaltaktoren in der Regel problemarm funktioniert, sind Probleme mit [[FHT80b]] Heizungsteuerungen recht häufig. Dies liegt in der deutlich anspruchsvolleren bidirektionalen Kommunikation, die zur Übermittlung der ggf. durchaus umfangreichen Daten notwendig ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Symptome ==&lt;br /&gt;
Im Einsatz von FHTs kann es zu folgenden Symptomen kommen:&lt;br /&gt;
&lt;br /&gt;
* FHT funktioniert zunächst einwandfrei, dann plötzlich sind keine Temperaturänderungen o.ä. mehr möglich&lt;br /&gt;
* FHTs funktionieren einwandfrei, jedoch seitdem ein weiteres dazu gekommen ist, wird die Datenübertragung langsam oder fällt ganz aus, auch zu FHTs, die vorher ohne Probleme liefen.&lt;br /&gt;
* FHT funktioniert manchmal für Stunden gut, übermittelt aktuelle Werte und lässt sich ansprechen, dann für mehrere Stunden wieder nicht, schliesslich &amp;quot;erholt&amp;quot; sich das FHT wieder (oft über Nacht)&lt;br /&gt;
* Temperaturänderungen werden von FHT mit hoher Verzögerung (bis hin zu Stunden) ausgeführt&lt;br /&gt;
* FHTs laufen ca. eine Woche problemfrei, dann kommen keinen Daten mehr. Nach einem neuen Pairing ist alles wieder in Ordnung, bis nach ca. einer Woche wieder keine Daten kommen.&lt;br /&gt;
&lt;br /&gt;
== Problemquellen ==&lt;br /&gt;
Die FHT-Kommunikation ist recht fragil. Es müssen eine Menge Funktelegramme in einem bestimmten Timing ausgetauscht werden, damit Erfolg eintritt. Selbst wenn keine Kommandos an das [[FHT80b]] übergeben werden, findet alle 15 Minuten Datenübermittlungen statt, da das FHT Temperatur und andere Daten meldet.&lt;br /&gt;
&lt;br /&gt;
Bereits ein fehlendes Datenpaket kann dazu führen, dass die Kommunikation erfolglos war und insgesamt wiederholt werden muss.&lt;br /&gt;
&lt;br /&gt;
Störungen des Kanals (z.B. der berühmte Funkkopfhörer aus China) führen daher so gut wie immer zu Problemen in der FHT Kommunikation. Es reicht, wenn von den 5+n Kommandos (n=Anzahl der übermittelten Werteänderungen) die mindestens hin und her gehen müssen, eines nicht korrekt ankommt und schon muss alles wiederholt werden.&lt;br /&gt;
&lt;br /&gt;
Diese Wiederholung kann nur ca. alle 2 Minuten erfolgen. Kommandos, die noch nicht erfolgreich abgearbeitet wurden, verbleiben im FHT Befehlsbuffer des CUL/CUNO (oder sonstiger Funkschnittstellen), obwohl sie seitens FHEM als &amp;quot;abgesetzt&amp;quot; geloggt werden. Dieser FHT Buffer kann mitunter sehr viele Kommandos aufnehmen, die der Reihe nach abgearbeitet werden. Kann z.B. eine Temperaturänderung aufgrund von Funkproblemen erst nach ca. 3 Versuchen erfolgreich zugestellt werden, so dauert es in der Regel etwa 3 x 2 = 6 Minuten, bis die Änderung im FHT sichtbar ankommt. Wird z.B. aus Ungeduld eine erneute Temperaturänderung ausgelöst, so wird diese im FHT Buffer gespeichert und dann nach erfolgter Übertragung des ersten Kommandos übermittelt. Die Abarbeitungszeit der Warteschlange für dieses FHT steigt dann bereits auf ca. 12 Minuten. Es ist leicht möglich, durch Abfrage der Wochenprogramme, Änderung der Day- oder Nighttemperatur, oder Änderung von Wochenschaltpunkten Warteschlangen aufzubauen, die buchstäblich Stunden oder gar Tage zum Abarbeiten benötigen. Temperaturänderungen könnten also mitunter erst Stunden später tatsächlich ausgeführt werden. Jeder Aussendungsversuch führt außerdem zur Belastung des Sendekontos. Ist die [[1% Regel]] überschritten, wird die Warteschlange nicht mehr weiter abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
Solche Störungen des Funkkanals sind nicht selten und können auch ohne äußere Einflüsse stattfinden.&lt;br /&gt;
Die FHTs sind mit relativ ungenauen Sendern ausgestattet und können in Sendefrequenz und Flankensteilheit mitunter deutlich von den Sollwerten abweichen, was insbesondere beim Einsatz von CUL / CUNO (weniger beim Einsatz einer FHZ1x00PC) ein Problem sein kann, weil die CUL / CUNO eher trennscharf sind. Dies kann dazu führen, dass die Funkkommunikation oft fehlerhaft ist oder sogar ganz abbricht.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich stellen einige FHTs das Aussenden von Temperatur und weiteren Daten nach 5-10 Tagen ein, wenn nicht zwischendurch von der Zentrale Änderungen übermittelt wurden.&lt;br /&gt;
&lt;br /&gt;
Alle vorstehenden Gründe kombinieren sich für gewöhnlich zu einem komplexen Versagensszenario, das sich gegenseitig selbst verstärkt:&lt;br /&gt;
&lt;br /&gt;
* Schlechte Funklage eines FHT80b erzeugt häufige Retrys.&lt;br /&gt;
* Inzwischen stauen sich weitere Kommandos an das FHT auf, z.B. wegen erneuter Temperaturänderungen, automatisiert oder aus Ungeduld, sowie andere Meldungen, etwa Abfrage oder Ändern des Wochenprogramms.&lt;br /&gt;
* Die Kommandos sammeln sich im FHT Buffer des Funkadapters an und sorgen dafür, dass die Sendezeit hoch belastet wird.&lt;br /&gt;
* Fast Glück hat man noch, wenn der Buffer voll läuft und [[EOB]] Meldungen im Log darauf hinweisen. Es kann aber auch passieren, dass über grössere Zeiträume der Buffer gerade eben nicht voll wird, insbesondere bei CUL / CUN, die im Vergleich zur FHZ1x00PC große Buffer haben, die 30 und mehr Kommandos halten können. Ist zusätzlich das Feature &amp;quot;Softbuffer&amp;quot; eingeschaltet, verschlimmert sich die Situation weiter, da die Warteschlange noch länger werden kann.&lt;br /&gt;
* Ist die 1% Marke erreicht, das Funkkontingent also aufgebraucht, verschlimmert sich die Situation dramatisch: Nun bricht auch die Kommunikation mit anderen FHTs zusammen. Da außerdem immer Kommandos im FHT Buffer sind, wird jede freie Sendezeit durch Versuche die Warteschlange abzuarbeiten sofort wieder aufgebraucht. Das Timing des Gesamtsystems ist hier leider so, dass sich innerhalb des Retryintervals von ca. 2 Minuten oft gerade zu wenig freie Sendezeiteinheiten aufbauen, um den nächsten Retry komplett abwickeln zu können. D.h. jedes Retry braucht die gerade aufgebauten freien Sendeeinheiten auf, ist aber in sich erfolglos.&lt;br /&gt;
* Spätestens ab hier ist vollständiger Stillstand erreicht. Im Log häufen sich die [[LOVF]]- Meldungen, jede Kommunikation mit allen FHTs ist zusammengebrochen. Es kommt eventuell sogar zu Beeinträchtigungen beim Schalten von FS20 Aktoren.&lt;br /&gt;
&lt;br /&gt;
Mit der Anzahl FHTs steigt die Wahrscheinlichkeit für das Auftreten dieser Probleme.&lt;br /&gt;
&lt;br /&gt;
Viele FHEM Nutzer verwenden die Kombination von FHEM und FHT so, dass die FHTs über Manipulation der im FHT gespeicherten Wochenprogramme, Schaltpunkte und Day/Nighttemp gesteuert werden. Dies erhöht die Datenmenge im Vergleich zu einer direkten Temperatursteuerung (&amp;quot;set desired-temp 22&amp;quot;) und wird in kritischen Situationen die Fehlerhäufigkeit deutlich anheben. Sehr viel Datenverkehr erzeugt auch die komplette Abfrage des Wochenprogramms mittels Report1=255.&lt;br /&gt;
&lt;br /&gt;
== Diagnose und Lösungsansätze ==&lt;br /&gt;
Im Folgenden einige Hinweise wie man das Auftreten von Problemen verringern bzw. diagnostizieren kann.&lt;br /&gt;
&lt;br /&gt;
=== Sparsam mit Funkzeit umgehen ===&lt;br /&gt;
Da die Ausnutzung der freien Funkzeit jede Situation schnell deutlich verschlimmert, sollte man immer bemüht sein, seine Ziele mit wenig Datenverkehr zu erreichen. Dies gilt insbesondere, wenn man sich der Anzahl [[Maximal nutzbare Geräte]] nähert.&lt;br /&gt;
&lt;br /&gt;
*  [http://www.fhemwiki.de/wiki/Heizung_mit_Bewegungsmelder_steuern#FHT80b FHT Lazy Mode] nutzen (Temperaturänderungen werden nur übertragen, wenn sie von der momentan eingestellten Temperatur abweichen.) Dies ist besonders hilfreich, wenn die Temperatursteuerung automatisiert durch Bewegungsmelder oder &amp;quot;Zuhausestatus&amp;quot;-Automatismen gesteuert wird, da hier in relativ kurzer Folge die selbe Temperatureinstellung übermittelt wird. Lazy Mode schützt aber nicht immer davor, dass die Warteschlange schnell anschwillt. Steht ein FHT80b z.b. auf 18 Grad, und soll auf 20 Grad angehoben werden, so wird das Kommando trotz Lazy Mode immer wieder in die Warteschlange eingetragen, solange das erste Kommando nicht erfolgreich abgesetzt und die neue Temperatur vom FHT rückgemeldet wurde. Das kann dazu führen, dass die FHT-Warteschlange dutzende Male das selbe &amp;quot;desired-temp&amp;quot; Kommando enthält.&lt;br /&gt;
* Temperatursteuerung der FHTs nicht auf täglicher Basis durch Setzen der Wochenprograme im FHT durchführen. Obwohl diese Methode den Vorteil hat, dass sie eine höhere Ausfallsicherheit bietet (weil die FHTs auch ohne FHEM ihr zuletzt eingegebenes Wochenprogamm weiter verwenden können), so steigt der auszutauschende Datenverkehr stark an.&lt;br /&gt;
&lt;br /&gt;
:Mitunter verwendete Implementationen, die Anhand von Tabellen, Kalendern oder der Auswertung von Excelsheets mehrere FHTs regelmässig mit geänderten Wochenprogrammen und/oder Änderungen der Day/Night Temperaturen steuern, sind in schwierigen Funksituation deutlich anfälliger.&lt;br /&gt;
&lt;br /&gt;
* Keine regelmässigen Reports abfragen, insbesondere NICHT report1=255 (also komplettes Wochenprogramm abfragen)&lt;br /&gt;
:Da einige FHTs nach einiger Zeit keine Temperaturdaten mehr senden, fragen viele Nutzer diese über tägliches Absetzen von report2=255 ab. Besser ist es jedoch, das FHT mit einem Wachdog zu überwachen und nur bei Bedarf zu &amp;quot;wecken&amp;quot;, z.B. so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define wd_FHT_Wohnzimmer watchdog hzg_wohnzimmer:measured-temp.* 01:00 SAME set hzg_wohnzimmer time&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:Alternativ report2=255 1-2x pro Woche nachts absetzen, bei mehreren FHTs eventuell tageweise versetzt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define fht_reportZimmer1 at *04:00:00 {if ($wday == 1) { fhem(&amp;quot;set hzg_Zimmer1 report2 255&amp;quot;)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funklage beobachten ===&lt;br /&gt;
* RSSI mitloggen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;attr CUL addvaltrigger 1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* RSSI der FHTs beobachten. Unter -85 (also z.b. -89) ist ungünstig. Unbedingt versuchen, ein besseres RSSI als -85 hinzubekommen, zu ALLEN FHTs.&lt;br /&gt;
* Antennnenlage des CUL/CUN korrigieren (z.b. Antenne um 45 Grad kippen), eventuell Lage des FHTs ändern, ein halber Meter kann schon viel bringen. Dabei kommt es nicht zwingend nur auf die absolute Entfernung zum Funkadapter an, auch die Lage im Gebäude kann viel ausmachen.&lt;br /&gt;
* Wenn CUL / CUN eingesetzt werden, gegebenenfalls die Parameter freq, bandwidth und sens ändern. Als Startpunkt z.B. bandwidth auf 464 khz und sens auf 8 db anstelle 4db ändern. Kombinationen ausprobieren, aber nicht mehrere Parameter gleichzeitig ändern. RSSI-Auswirkung jeder Änderung beobachten.&lt;br /&gt;
&lt;br /&gt;
Wenn das keinen Erfolg bringt, zweiten CUL / CUNO einsetzen, z.b. auch als RFR CUL. Dabei  [[RFR CUL und FHT80]] Besonderheiten berücksichtigen: Nicht zu viele FHTs ans RFR CUL anbinden, nur so viele wie gerade nötig. FS20 Repeater helfen nicht.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen prüfen ===&lt;br /&gt;
&lt;br /&gt;
* Attribut fhtsoftbuffer ausschalten. Beim Einsatz von CUL/CUNO ist die Verwendung von fhtsoftbuffer sowieso überflüssig, da die eigenen FHT Buffer dieser Adapter hinreichend groß sind. Gedacht ist dieses Attribut vor allem für den Einsatz von FHEM mit FHZ1x00PC Zentralen, deren FHT Buffer klein ist und zum Teil nur 8 Befehle halten kann. Das CUL V3 kann demgegenüber 40 FHT Befehle im Buffer halten. D.h. bei einer FHZ1x00PC kann es vorkommen, dass bei 10 zu steuernden FHTs schon ein Kommando der Art &amp;quot;Alle FHTs auf 20 Grad&amp;quot; *nicht* bei allen FHTs ankommt, da nicht alle Befehle zugleich in den Buffer passen. In solchen Fällen ist der Einsatz des Softbuffers hilfreich. (in neueren FHEM Versionen hat das Attribut fhtsoftbuffer daher auf CUL und CUNOs keine Wirkung mehr)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;Das Attribut fhtsoftbuffer erzeugt einen &amp;quot;unendlich&amp;quot; grossen Buffer, was sehr lange Warteschlangen zur Folge haben kann. Das macht die Diagnose sehr schwer und erzeugt seltsamste Effekte, wenn die Kommunikation mit den FHTs nicht einwandfrei ist. In jedem Fall aber &amp;quot;glaubt&amp;quot; FHEM sehr viel länger, dass alles in Ordnung sei, obwohl die Kommunikation gestört ist.&lt;br /&gt;
&lt;br /&gt;
Ganz generell: Wenn eine Installation ohne fhtsoftbuffer nicht zuverlässig läuft, sollte man der Versuchung widerstehen, das Problem durch einen grösseren Buffer lösen zu wollen. Fhtsoftbuffer sollte nur eingesetzt werden, wenn eine FHZ1x00 verwendet wird, die Installation an sich gut läuft und nur gelegentlich EOB Meldungen kommen.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Retrycount auf 1. Wenn fhtsoftbuffer aktiv ist, wird versucht, das Kommando Retrycount-Mal zu wiederholen, wenn es nicht innerhalb von 240 Sekunden abgesetzt werden kann. Das kann die Abarbeitungsgeschwindigkeit der Warteschlange zusätzlich senken, gleichzeitig den Funkzeitverbrauch erhöhen und dadurch Probleme eher noch verschärfen. Sinnvoll ist ein höherer Retrycount womöglich nur, wenn in kleineren Installationen ein FHT gerade am Rande des Funkbereiches liegt, ansonsten aber alles problemfrei abläuft. Ohne  fhtsoftbuffer hat retrycount keine Wirkung, wenn retrycount nicht definiert wird, ist der Defaultwert 1.&lt;br /&gt;
&lt;br /&gt;
* Bei mehreren CUxx in der Installation (auch 1 x CUL und 1x RFR CUL) das Attribut IODev kontrollieren. Ist ein FHT mit einem CUxx gepairt, aber das IODev zeigt auf das andere, ist eine Kommunikation nicht möglich. Da aber Temperatur (und weitere Werte) trotzdem empfangen werden, fällt dies zunächst eventuell nicht sofort auf. Der FHTbuffer des &amp;quot;falschen&amp;quot; CUxx wird dann mit Befehlen an das FHT zugemüllt, die nie erfolgreich abgesetzt werden können. Ist der Buffer schliesslich voll, können auch keine Kommandos an andere mit diesem CUxx gepairte FHTs mehr übermittelt werden, obwohl diese eigentlich nicht betroffen sind.&lt;br /&gt;
* Bei mehreren CUxx UNBEDINGT sicherstellen, dass die FHT-ID unterschiedlich ist. Bei gleicher FHT-ID fühlen sich zwei &amp;quot;Zentralen&amp;quot; für die FHT Kommunikation verantwortlich, was immer im Chaos endet: beide Funkadapter antworten bei FHT Kommunikationen und stören sich so gegenseitig. Siehe auch [[Was ist der Hauscode?]].&lt;br /&gt;
* Bei mehreren CUxx bitte auch die Erläuterungen zum [[Sendpool]] Attribut berücksichtigen, die Funktion von Sendpool wird oft missverstanden.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosemöglichkeiten im Fehlerfall ===&lt;br /&gt;
Eine Möglichkeit, sich dem Problem zu nähern ist, das Logfile mit verbose5 anzeigen zu lassen. Die Meldungen sind dann recht detailliert und lassen einige Rückschlüsse zu. Erfahrungsgemäß ist es jedoch besser, sich die Kommunikation mit einer Telnetsitzung anzusehen. Ein Nachteil des Logfiles liegt z.B. darin, dass eine Temperaturänderung als &amp;quot;ausgeführt&amp;quot; angezeigt wird, wenn sie erfolgreich an z.b. das CUL übermittelt wurde, auch wenn sie dort nur in einen schon übervollen Buffer geschrieben wird. In einer Telnetsitzung kann man hingegen den Zustand des Buffers prüfen und die Kommunikation mit dem FHT beobachten.&lt;br /&gt;
&lt;br /&gt;
Dazu:&lt;br /&gt;
&lt;br /&gt;
* Terminalprogramm starten&lt;br /&gt;
* Dann mittels &amp;lt;code&amp;gt;telnet (IP des FHEM Servers) 7072 &amp;amp;lt;entertaste&amp;amp;gt;&amp;lt;/code&amp;gt; eine Telnetverbindung zu FHEM starten (7072 ist FHEMs Telnetport)&lt;br /&gt;
* erneut &amp;amp;lt;entertaste&amp;amp;gt; drücken, nun muss als Prompt &amp;quot;fhem&amp;amp;gt;&amp;quot; erscheinen.&lt;br /&gt;
&lt;br /&gt;
Jetzt können zahlreiche Kommandos zur Diagnose abgegeben werden. &lt;br /&gt;
&lt;br /&gt;
* info timer &amp;amp;lt;entertaste&amp;amp;gt; zeigt einem alle Events, die FHEM empfängt und sendet. Hier kann man die Kommunikation live verfolgen und so z.B. sehen, ob noch Kommunikation mit dem FHT versucht wird. Einfach eine Weile mitlaufen lassen und sich ansehen, was alles passiert.&lt;br /&gt;
* Wenn man einen CUxx im Einsatz hat, dann kann man sich mittels &amp;quot;set CUL raw X61&amp;quot; (&amp;quot;CUL&amp;quot; durch Namen der eigenen Schnittstelle wie in fhemconfig definiert ersetzen) auch Details der Kommunikation anzeigen lassen. So kann man vergleichen, ob die Kommunikation mit dem Beispiel [[FHT80b#Log-Auszug]] übereinstimmt, also planmäßig abläuft. &amp;quot;set CUL raw X21&amp;quot; setzt das CUL wieder auf den Standard-Loglevel zurück. Achtung, Groß- und Kleinschreibung beachten: Das X61/X21 hat ein großes X. &lt;br /&gt;
* Auch sollte man prüfen, ob der der CUxx so konfiguriert ist, wie man glaubt. Mit &amp;quot;get CUL ccconf&amp;quot; kann man die wichtigsten Werte ansehen.&lt;br /&gt;
* Ist der FHT Buffer leer oder was hat sich da ggf. aufgestaut? &amp;quot;&#039;&#039;&#039;get CUL raw T02&#039;&#039;&#039;&amp;quot; ergibt den Inhalt des Buffers. Da sollte möglichst nichts drin stehen (&amp;quot;CUL raw =&amp;amp;gt; N/A&amp;quot;) oder nicht viel. Mit der Zeit erkennt man die Codes gleich, daraus ergibt sich, welches FHT Probleme macht (Adresse) und welche Kommandos noch auf Aussendung warten. Folgender Beispieloutput: &amp;quot;CUL raw =&amp;amp;gt; 060D:4118 060D:65FF 060D:66FF 060D:4120&amp;quot; ist bereits verdächtig. FHT 060D hat noch 4 Kommandos in der Warteschlange, die Abarbeitung hier dauert schon im besten Fall mindesten noch 8 Minuten. Sieht bereits nach &amp;quot;Rückstau&amp;quot; aus. (4118 = desired temp auf Wert 18, 65ff= report1=255 66ff= report2=255).&lt;br /&gt;
* Mehrfaches Eingeben von &amp;quot;get CUL raw T02&amp;quot; im Abstand von ca 2 Minuten (dem Intervall, in dem Kommunikation mit dem FHTs stattfinden kann) zeigt einem, ob die Schlange sich abarbeitet oder welche Kommandos klemmen.&lt;br /&gt;
* Wenn man CUxx im Einsatz hat kann man auch die freie Sendezeit prüfen: &amp;quot;get CUL raw X&amp;quot; Der zweite Zahlenwert ist die Sendezeit in 10ms Slots. Während ein FS20 Schalter im Idealfall mit 21 Einheiten (=210 ms) erledigt werden kann, braucht schon die simpelste Übertragung nur eines Wertes an ein FHT ca. 3x mehr Zeiteinheiten. Wenn also nicht mindestens 65 Zeiteinheiten frei sind, kann keine FHT Übertragung erfolgreich sein.&lt;br /&gt;
* CUxx Funkadapter können auch resettet werden: &amp;quot;set CUL raw B00&amp;quot; resettet das CUL, und löscht dabei alle Buffer und setzt die freie Funkzeit auf Maximum. Die Wirkung ist die selbe wie den Adapter kurz stromlos zu machen. Will man hingegen nur den FHT Buffer leeren, kann man auch &amp;quot;&#039;&#039;&#039;set CUL raw T01xxxx&#039;&#039;&#039;&amp;quot; eingeben, wobei xxxx = FHT-ID istdie aus fhem.cfg aus der CUL-Definition gelesen werden kann. Diese muss natürlich mit der vorherigen übereinstimmen, da sonst alle FHT-Pairings ungültig sind. Nach dem Löschen des Buffers noch kurz mit &amp;quot;get CUL raw T02&amp;quot; überprüfen, dass der buffer auch wirklich leer ist. Anschliessend irgendeinen Befehl an den FHT senden, z.B. Ändern der desired-temp um 1 Grad. Danach fängt der FHT meist wieder an zu senden. Manchmal muss man ihm auch einfach ein bischen Zeit geben, bis er sich wieder fängt.&lt;br /&gt;
&lt;br /&gt;
=== Repairen ===&lt;br /&gt;
Lassen sich durch die obigen Massnahmen keine nahliegenden Problem entdecken, hilft gelegentlich auch ein&lt;br /&gt;
simples neu Pairen eines nicht komunizierenden FHTs.&lt;br /&gt;
&lt;br /&gt;
Wiederkehrende Actuator-Meldung &amp;quot;&#039;&#039;&#039;unknown_69&#039;&#039;&#039;&amp;quot; lassen sich z.b. meist mit einem neuen Pairing lösen.&lt;br /&gt;
&lt;br /&gt;
====Neues Pairen ohne Autocreate====&lt;br /&gt;
*fhem.cfg unbearbeitet lassen&lt;br /&gt;
*FHT80b in Sonderfunktionen &amp;quot;cENT&amp;quot; auf &amp;quot;n/a&amp;quot; stellen, danach sofort in FHEM einen Befehl (egal welchen) an die FHT80b senden. &lt;br /&gt;
*Wenn ca. zwei Minuten später Sonderfunktion cENT auf &amp;quot;ON&amp;quot; steht, war das Pairing erfolgreich.&lt;br /&gt;
&lt;br /&gt;
====Neues Pairing mit Autocreate====&lt;br /&gt;
Alternativ hat auch dieser Weg zum Erfolg geführt:&lt;br /&gt;
*In der fhem.cfg den define-Eintrag für diesen FHT auskommentieren, autocreate ggf. einschalten, sichern.&lt;br /&gt;
*Am FHT80b in Sonderfunktionen &amp;quot;cENT&amp;quot; auf &amp;quot;n/a&amp;quot; stellen, sodass eine neue Paarung eingeleitet wird&lt;br /&gt;
*Warten bis FHEM nach Empfang eines Datenpaktes vom FHT80 das Geräte anlegt. In der nach dem erfolgten autocreate entstehenden Log-Datei nachsehen, warten, bis der angeblich neu entdeckte FHT das erste Mal seinen Status sendet.&lt;br /&gt;
*Wieder die fhem.cfg editieren, darin den &amp;quot;neu entdeckten&amp;quot; FHT löschen und die oben erfolgte Auskommentierung wieder rückgängig machen, autocrate ggf wieder auschalten, sichern.&lt;br /&gt;
&lt;br /&gt;
== Hardware defekt? ==&lt;br /&gt;
Es gibt auch defekte FHT80b, aber oft hilft eine geringe Aufweitung der Bandbreite (siehe oben) oder schlicht eine neuer Satz Batterien. Manchmal führt auch ein &amp;quot;matchen&amp;quot; der FHTs mit der Funklage zum Ziel: Rausfinden, welche FHTs am problemlosesten arbeiten und diese an den Stellen unterbringen, die funktechnisch die ungünstigsten sind, während weniger zuverlässige FHTs näher an der Zentrale eingesetzt werden. Aufgrund der recht primitiven Sender/Empfänger (Pendelempfänger) der FHTs sind hier durchaus deutliche Streuungen möglich.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Artikel ==&lt;br /&gt;
* [[Was ist der Hauscode?]]&lt;br /&gt;
* [[1% Regel]]&lt;br /&gt;
* [[Maximal nutzbare Geräte]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHT Components]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=7279</id>
		<title>HM-CFG-USB USB Konfigurations-Adapter</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=7279"/>
		<updated>2014-08-12T23:51:36Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: /* Einrichtung unter Mac OS X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der [[HomeMatic]] &#039;&#039;&#039;USB Konfigurations-Adapter&#039;&#039;&#039; ist ein USB-Stick, der außer zur Konfiguration von HomeMatic Komponenten auch als [[Interface]] zwischen Fhem und HomeMatic Geräten benutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
Im FHEM-Forum wird das Thema diskutiert unter dem Titel  [http://forum.fhem.de/index.php/topic,13071.msg86075.html#msg86075 HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen]. Teile der Informationen sind hier zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Linux ===&lt;br /&gt;
Es gibt einen gut funktionierenden Dämon, um den USB Stick mit FHEM zum Laufen zu bekommen. Dabei wird zuerst der Dämon [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb hmland] installiert und danach das Gerät (üblicherweise auf localhost) genau wie [[HM-CFG-LAN LAN Konfigurations-Adapter|HMLAN]] in FHEM eingebunden.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss der Dämon compiliert werden. Analog zu [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb dieser Beschreibung] ist die Vorgehensweise die folgende (in Debian/Ubuntu/Raspbian):&lt;br /&gt;
 cd /opt/&lt;br /&gt;
 apt-get install build-essential libusb-1.0-0-dev make gcc git-core&lt;br /&gt;
 git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
 cd hmcfgusb&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
(Unter Debian ist &amp;quot;build-essentials&amp;quot; nicht als Paket vorhanden, dieser Schritt kann entfallen.)&lt;br /&gt;
&lt;br /&gt;
Danach kann der Dienst zu Testzwecken gestartet werden (in /opt/hmcfgusb):&lt;br /&gt;
:&amp;lt;code&amp;gt;./hmland -p 1234 -D&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Dämon nach einem Neustart automatisiert zu starten, kann ein init-script wie das Folgende verwendet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # simple init for hmland&lt;br /&gt;
 &lt;br /&gt;
 pidfile=/var/run/hmland.pid&lt;br /&gt;
 port=1234&lt;br /&gt;
 &lt;br /&gt;
 case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start|&amp;quot;&amp;quot;)&lt;br /&gt;
 	chrt 50 /opt/hmcfgusb/hmland -r 03:30 -d -P -l 127.0.0.1 -p $port 2&amp;gt;&amp;amp;1 | perl -ne &#039;$|=1; print localtime . &amp;quot;: [hmland] $_&amp;quot;&#039; &amp;gt;&amp;gt; /var/log/hmland.log &amp;amp;&lt;br /&gt;
 	;;&lt;br /&gt;
  restart|reload|force-reload)&lt;br /&gt;
 	echo &amp;quot;Error: argument &#039;$1&#039; not supported&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
  stop)&lt;br /&gt;
 	killall hmland&lt;br /&gt;
 	;;&lt;br /&gt;
  status)&lt;br /&gt;
 	if [ ! -e $pidfile ]; then&lt;br /&gt;
 		echo &amp;quot;No pid&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 	pid=`cat $pidfile`&lt;br /&gt;
 	if kill -0 $pid &amp;amp;&amp;gt;1 &amp;gt; /dev/null; then&lt;br /&gt;
 		echo &amp;quot;Running&amp;quot;&lt;br /&gt;
 		exit 0&lt;br /&gt;
 	else&lt;br /&gt;
 		rm $pidfile&lt;br /&gt;
 		echo &amp;quot;Not running&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 &lt;br /&gt;
 	;;&lt;br /&gt;
  *)&lt;br /&gt;
 	echo &amp;quot;Usage: hmland [start|stop|status]&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
 esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Distributionen, die Upstart einsetzen (z.B. xbian) kann folgendes Konfigurationsfile verwendet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# HMLAND&lt;br /&gt;
&lt;br /&gt;
description     &amp;quot;hmland&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start on starting fhem&lt;br /&gt;
stop on stopped fhem&lt;br /&gt;
&lt;br /&gt;
respawn&lt;br /&gt;
expect fork&lt;br /&gt;
&lt;br /&gt;
chdir /opt/hmcfgusb&lt;br /&gt;
exec /opt/hmcfgusb/hmland -d -l 127.0.0.1 -p 1234&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte als &amp;quot;/etc/init/hmland.conf&amp;quot; angelegt werden. Mit dem Befehl &lt;br /&gt;
 initctl reload-configuration&lt;br /&gt;
wird Upstart angewiesen, seine Konfiguration erneut einzulesen. Danach kann der neue Dienst &lt;br /&gt;
mit &lt;br /&gt;
 service hmland start&lt;br /&gt;
gestartet werden. &amp;lt;code&amp;gt;hmland&amp;lt;/code&amp;gt; wird jetzt immer vor FHEM gestartet und nach FHEM beendet.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Einrichtung, Start über fhem Startskript ===&lt;br /&gt;
&lt;br /&gt;
Ausprobiert auf einem BBB mit Debian, eigentlich ist das alles von Betateilchen:&lt;br /&gt;
&lt;br /&gt;
Zunächst hmland kompilieren wie oben beschrieben, bis zum make. Das muss erfolgreich durchgelaufen sein.&lt;br /&gt;
&lt;br /&gt;
Dann geht es weiter:&lt;br /&gt;
&lt;br /&gt;
 sudo cp hmcfgusb.rules /etc/udev/rules.d/&lt;br /&gt;
&lt;br /&gt;
Jetzt das fhem Startskript anpassen (in den Blöcken &#039;start&#039; und &#039;stop&#039; muss quasi nur jeweils 1 Zeile eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
Damit editiert man das fhem Startskript:&lt;br /&gt;
 sudo nano /etc/init.d/fhem&lt;br /&gt;
&lt;br /&gt;
Und so sollten die Blöcke anschließend aussehen (bitte nur jeweils die Zeile mit hmland einfügen)&lt;br /&gt;
&lt;br /&gt;
 &#039;start&#039;)&lt;br /&gt;
        echo &amp;quot;Starting fhem...&amp;quot;&lt;br /&gt;
        /opt/hmcfgusb/hmland -d -p 1234&lt;br /&gt;
        perl fhem.pl fhem.cfg&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        ;;&lt;br /&gt;
&lt;br /&gt;
 &#039;stop&#039;)&lt;br /&gt;
        echo &amp;quot;Stopping fhem...&amp;quot;&lt;br /&gt;
        perl fhem.pl $port &amp;quot;shutdown&amp;quot;&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        pkill hmland&lt;br /&gt;
&lt;br /&gt;
So wird hmland vor fhem gestartet und nach fhem beendet. Letztlich erspart es das Hantieren mit den diversen Startskripten und ihren Rechten.&lt;br /&gt;
&lt;br /&gt;
Es dauert nach dem Start von fhem noch einige Sekunden, bis hmland fertig geladen ist. In dieser Zeit kann es zu fehlerhaften Einträgen im Logfile kommen.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Mac OS X ===&lt;br /&gt;
Wie unter Linux braucht man den Dämon hmland, den man aus Quelltexten erstellen muss. Dazu muss man die Bibliothek libusb installieren, entweder mit einem der Paketmanager wie Fink, MacPorts oder Homebrew oder direkt aus den Quellentexten (Beispiel: &amp;quot;fink install libusb1-shlibs libusb1&amp;quot;). Hat man wie bei Linux das Quelltextarchiv für hmland heruntergeladen und ausgepackt, müssen die Dateien Makefile und hmcfgusb.c angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Im Makefile muss man den Pfad zur libusb anpassen. Hat man libusb mit fink installiert muss man, &amp;quot;/opt/local/&amp;quot; durch &amp;quot;/sw/&amp;quot; bei den CFLAGS und den LDFLAGS ersetzen und&lt;br /&gt;
das &amp;quot;-lrt&amp;quot; aus den LDLIBS entfernen. Die Library librt gibt es bei Mac OS X nicht und wird anscheinend auch nicht gebraucht. (Stimmt das eigentlich?)&lt;br /&gt;
&lt;br /&gt;
In der Datei hmcfgusb.c muss man die Zeilen 130-134 mit dem Aufruf libusb_detach_kernel_driver auskommentieren oder löschen. Der geht nicht auf Mac OS X.&lt;br /&gt;
&lt;br /&gt;
Nach den Änderungen in den zwei Dateien, kann man wie bei Linux den Dämon hmland mit dem Kommando &amp;quot;make&amp;quot; erzeugen und mit &amp;quot;./hmland&amp;quot; ausführen. Automatisches Starten beim Booten mit launchd ist noch nicht probiert.&lt;br /&gt;
&lt;br /&gt;
Beim Start von hmland sollte man folgende Fehlermeldung in einer Endlos-Schleife erhalten:&lt;br /&gt;
&lt;br /&gt;
Datum Zeit: Client 127.0.0.1 connected! &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t claim interface: Access denied (insufficient permissions) &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t find/open hmcfgusb! &amp;lt;br /&amp;gt;&lt;br /&gt;
Datum Zeit: Connection to 127.0.0.1 closed! &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ein Start von hmland mit Superuser-Rechten ändert daran nichts. Damit das claim interface klappt, muss man eine codeless kext in den Ordner /Library/Extensions legen. Ich habe dieses (http://mspdebug.sourceforge.net/misc/ex430rf2500-kext.zip) herunter geladen. Damit es funktioniert, muss man aber in der Datei Info.plist des Bündle die Properties idProduct und idVendor ändern, entweder mit dem Property List Editor oder einem anderen Texteditor. Die beiden Properties sind etwas versteckt bei Information Property List → IOKitPersonalities → ComIntf. Bei DebugIntf und DeviceDriver scheint man es nicht ändern zu müssen, aber schaden kann es nicht.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
idProduct: 49167&amp;lt;br /&amp;gt;&lt;br /&gt;
idVendor: 6943&lt;br /&gt;
&lt;br /&gt;
Die Rechte des kext-Bundles müssen auch noch gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
  chmod -R 755 ex430rf2500.kext&lt;br /&gt;
  chown -R root:wheel ex430rf2500.kext&lt;br /&gt;
&lt;br /&gt;
Danach die Datei ex430rf2500.kext in den Ordner /Library/Extensions legen und hmland sollte dann funktionieren.&lt;br /&gt;
&lt;br /&gt;
Es kann sein, dass ab Mac OS X 10.9 der Trick mit dem codeless kext nicht mehr funktioniert, aber noch ist das nicht getestet oder bestätigt. Langfristig kann man vielleicht auch eine kext mit einem Treiber für den HM-CFG-USB USB erstellen&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Windows ===&lt;br /&gt;
&amp;lt; Todo &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi ===&lt;br /&gt;
Der USB-Stack am Raspberry Pi ist für viele Probleme verantwortlich. Daher sieht man öfter Fehlermeldungen:&lt;br /&gt;
  usb-transfer took more than 100ms (1039ms), this may lead to timing problems!&lt;br /&gt;
&lt;br /&gt;
Da das Timing bei Homematic wichtig ist führt das zu vielen Retransmits und zu unzuverlässigen Aktoren. Als Workaround kann man den USB-Stack auf die deutlich langsamere Version 1.1 stellen. Dazu fügt man folgenden Text am Anfang der Datei /boot/cmdline.txt ein:&lt;br /&gt;
  dwc_otg.speed=1&lt;br /&gt;
&lt;br /&gt;
== Weitergehende Informationen ==&lt;br /&gt;
Es sind zwei Versionen des HM-CFG-USB im Umlauf:&lt;br /&gt;
* HM-CFG-USB-2: die aktuelle Version; Dokumentation derzeit (12/2013) nicht über die ELV-Artikelseite verfügbar, alternativ jedoch bei [http://files.voelkner.de/625000-649999/640558-an-01-ml-USB_FUNK_KONFIGURATIONSADAPTER_de_en.pdf Völkner]; Kennzeichen dieser Version: &lt;br /&gt;
** Größe: 28 x 84 x 11,5&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 18&amp;amp;nbsp;g&lt;br /&gt;
** Antenne innenliegend&lt;br /&gt;
* HM-CFG-USB: Vorgängerversion; Stand 12/2013 noch Restbestände im Handel verfügbar. Dokumentation ([http://files.voelkner.de/625000-649999/646462-an-01-ml-HM_Konfigurationsadapter_CFG_USB_de_en.pdf Völkner]); Kennzeichen:&lt;br /&gt;
** Anschluss per separatem USB-Kabel&lt;br /&gt;
** abstehende Stabantenne&lt;br /&gt;
** Größe: 40 x 90 x 25&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 45&amp;amp;nbsp;g&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,13071.msg86075.html#msg86075 FHEM Forum: HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen]&lt;br /&gt;
* [http://www.elv.de/homematic-usb-konfigurations-adapter-1.html ELV- / Herstellerinformationen] zum HM-CFG-USB&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:OSX]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=7278</id>
		<title>HM-CFG-USB USB Konfigurations-Adapter</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=7278"/>
		<updated>2014-08-12T23:50:47Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: /* Einrichtung unter Mac OS X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der [[HomeMatic]] &#039;&#039;&#039;USB Konfigurations-Adapter&#039;&#039;&#039; ist ein USB-Stick, der außer zur Konfiguration von HomeMatic Komponenten auch als [[Interface]] zwischen Fhem und HomeMatic Geräten benutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
Im FHEM-Forum wird das Thema diskutiert unter dem Titel  [http://forum.fhem.de/index.php/topic,13071.msg86075.html#msg86075 HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen]. Teile der Informationen sind hier zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Linux ===&lt;br /&gt;
Es gibt einen gut funktionierenden Dämon, um den USB Stick mit FHEM zum Laufen zu bekommen. Dabei wird zuerst der Dämon [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb hmland] installiert und danach das Gerät (üblicherweise auf localhost) genau wie [[HM-CFG-LAN LAN Konfigurations-Adapter|HMLAN]] in FHEM eingebunden.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss der Dämon compiliert werden. Analog zu [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb dieser Beschreibung] ist die Vorgehensweise die folgende (in Debian/Ubuntu/Raspbian):&lt;br /&gt;
 cd /opt/&lt;br /&gt;
 apt-get install build-essential libusb-1.0-0-dev make gcc git-core&lt;br /&gt;
 git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
 cd hmcfgusb&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
(Unter Debian ist &amp;quot;build-essentials&amp;quot; nicht als Paket vorhanden, dieser Schritt kann entfallen.)&lt;br /&gt;
&lt;br /&gt;
Danach kann der Dienst zu Testzwecken gestartet werden (in /opt/hmcfgusb):&lt;br /&gt;
:&amp;lt;code&amp;gt;./hmland -p 1234 -D&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Dämon nach einem Neustart automatisiert zu starten, kann ein init-script wie das Folgende verwendet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # simple init for hmland&lt;br /&gt;
 &lt;br /&gt;
 pidfile=/var/run/hmland.pid&lt;br /&gt;
 port=1234&lt;br /&gt;
 &lt;br /&gt;
 case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start|&amp;quot;&amp;quot;)&lt;br /&gt;
 	chrt 50 /opt/hmcfgusb/hmland -r 03:30 -d -P -l 127.0.0.1 -p $port 2&amp;gt;&amp;amp;1 | perl -ne &#039;$|=1; print localtime . &amp;quot;: [hmland] $_&amp;quot;&#039; &amp;gt;&amp;gt; /var/log/hmland.log &amp;amp;&lt;br /&gt;
 	;;&lt;br /&gt;
  restart|reload|force-reload)&lt;br /&gt;
 	echo &amp;quot;Error: argument &#039;$1&#039; not supported&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
  stop)&lt;br /&gt;
 	killall hmland&lt;br /&gt;
 	;;&lt;br /&gt;
  status)&lt;br /&gt;
 	if [ ! -e $pidfile ]; then&lt;br /&gt;
 		echo &amp;quot;No pid&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 	pid=`cat $pidfile`&lt;br /&gt;
 	if kill -0 $pid &amp;amp;&amp;gt;1 &amp;gt; /dev/null; then&lt;br /&gt;
 		echo &amp;quot;Running&amp;quot;&lt;br /&gt;
 		exit 0&lt;br /&gt;
 	else&lt;br /&gt;
 		rm $pidfile&lt;br /&gt;
 		echo &amp;quot;Not running&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 &lt;br /&gt;
 	;;&lt;br /&gt;
  *)&lt;br /&gt;
 	echo &amp;quot;Usage: hmland [start|stop|status]&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
 esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Distributionen, die Upstart einsetzen (z.B. xbian) kann folgendes Konfigurationsfile verwendet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# HMLAND&lt;br /&gt;
&lt;br /&gt;
description     &amp;quot;hmland&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start on starting fhem&lt;br /&gt;
stop on stopped fhem&lt;br /&gt;
&lt;br /&gt;
respawn&lt;br /&gt;
expect fork&lt;br /&gt;
&lt;br /&gt;
chdir /opt/hmcfgusb&lt;br /&gt;
exec /opt/hmcfgusb/hmland -d -l 127.0.0.1 -p 1234&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte als &amp;quot;/etc/init/hmland.conf&amp;quot; angelegt werden. Mit dem Befehl &lt;br /&gt;
 initctl reload-configuration&lt;br /&gt;
wird Upstart angewiesen, seine Konfiguration erneut einzulesen. Danach kann der neue Dienst &lt;br /&gt;
mit &lt;br /&gt;
 service hmland start&lt;br /&gt;
gestartet werden. &amp;lt;code&amp;gt;hmland&amp;lt;/code&amp;gt; wird jetzt immer vor FHEM gestartet und nach FHEM beendet.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Einrichtung, Start über fhem Startskript ===&lt;br /&gt;
&lt;br /&gt;
Ausprobiert auf einem BBB mit Debian, eigentlich ist das alles von Betateilchen:&lt;br /&gt;
&lt;br /&gt;
Zunächst hmland kompilieren wie oben beschrieben, bis zum make. Das muss erfolgreich durchgelaufen sein.&lt;br /&gt;
&lt;br /&gt;
Dann geht es weiter:&lt;br /&gt;
&lt;br /&gt;
 sudo cp hmcfgusb.rules /etc/udev/rules.d/&lt;br /&gt;
&lt;br /&gt;
Jetzt das fhem Startskript anpassen (in den Blöcken &#039;start&#039; und &#039;stop&#039; muss quasi nur jeweils 1 Zeile eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
Damit editiert man das fhem Startskript:&lt;br /&gt;
 sudo nano /etc/init.d/fhem&lt;br /&gt;
&lt;br /&gt;
Und so sollten die Blöcke anschließend aussehen (bitte nur jeweils die Zeile mit hmland einfügen)&lt;br /&gt;
&lt;br /&gt;
 &#039;start&#039;)&lt;br /&gt;
        echo &amp;quot;Starting fhem...&amp;quot;&lt;br /&gt;
        /opt/hmcfgusb/hmland -d -p 1234&lt;br /&gt;
        perl fhem.pl fhem.cfg&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        ;;&lt;br /&gt;
&lt;br /&gt;
 &#039;stop&#039;)&lt;br /&gt;
        echo &amp;quot;Stopping fhem...&amp;quot;&lt;br /&gt;
        perl fhem.pl $port &amp;quot;shutdown&amp;quot;&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        pkill hmland&lt;br /&gt;
&lt;br /&gt;
So wird hmland vor fhem gestartet und nach fhem beendet. Letztlich erspart es das Hantieren mit den diversen Startskripten und ihren Rechten.&lt;br /&gt;
&lt;br /&gt;
Es dauert nach dem Start von fhem noch einige Sekunden, bis hmland fertig geladen ist. In dieser Zeit kann es zu fehlerhaften Einträgen im Logfile kommen.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Mac OS X ===&lt;br /&gt;
Wie unter Linux braucht man den Dämon hmland, den man aus Quelltexten erstellen muss. Dazu muss man die Bibliothek libusb installieren, entweder mit einem der Paketmanager wie Fink, MacPorts oder Homebrew oder direkt aus den Quellentexten (Beispiel: &amp;quot;fink install libusb1-shlibs libusb1&amp;quot;). Hat man wie bei Linux das Quelltextarchiv für hmland heruntergeladen und ausgepackt, müssen die Dateien Makefile und hmcfgusb.c angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Im Makefile muss man den Pfad zur libusb anpassen. Hat man libusb mit fink installiert muss man, &amp;quot;/opt/local/&amp;quot; durch &amp;quot;/sw/&amp;quot; bei den CFLAGS und den LDFLAGS ersetzen und&lt;br /&gt;
das &amp;quot;-lrt&amp;quot; aus den LDLIBS entfernen. Die Library librt gibt es bei Mac OS X nicht und wird anscheinend auch nicht gebraucht. (Stimmt das eigentlich?)&lt;br /&gt;
&lt;br /&gt;
In der Datei hmcfgusb.c muss man die Zeilen 130-134 mit dem Aufruf libusb_detach_kernel_driver auskommentieren oder löschen. Der geht nicht auf Mac OS X.&lt;br /&gt;
&lt;br /&gt;
Nach den Änderungen in den zwei Dateien, kann man wie bei Linux den Dämon hmland mit dem Kommando &amp;quot;make&amp;quot; erzeugen und mit &amp;quot;./hmland&amp;quot; ausführen. Automatisches Starten beim Booten mit launchd ist noch nicht probiert.&lt;br /&gt;
&lt;br /&gt;
Beim Start von hmland sollte man folgende Fehlermeldung in einer Endlos-Schleife erhalten:&lt;br /&gt;
&lt;br /&gt;
Datum Zeit: Client 127.0.0.1 connected! &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t claim interface: Access denied (insufficient permissions) &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t find/open hmcfgusb! &amp;lt;br /&amp;gt;&lt;br /&gt;
Datum Zeit: Connection to 127.0.0.1 closed! &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ein Start von hmland mit Superuser-Rechten ändert daran nichts. Damit das claim interface klappt, muss man eine codeless kext in den Ordner /Library/Extensions legen. Ich habe dieses (http://mspdebug.sourceforge.net/misc/ex430rf2500-kext.zip) herunter geladen. Damit es funktioniert, muss man aber in der Datei Info.plist des Bündle die Properties idProduct und idVendor ändern, entweder mit dem Property List Editor oder einem anderen Texteditor. Die beiden Properties sind etwas versteckt bei Information Property List → IOKitPersonalities → ComIntf. Bei DebugIntf und DeviceDriver scheint man es nicht ändern zu müssen, aber schaden kann es nicht.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
idProduct: 49167&amp;lt;br /&amp;gt;&lt;br /&gt;
idVendor: 6943&lt;br /&gt;
&lt;br /&gt;
Die Rechte des kext-Bundles müssen auch noch gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
  chmod -R 755 ex430rf2500.kext&lt;br /&gt;
  chown -R root:wheel ex430rf2500.kext&lt;br /&gt;
&lt;br /&gt;
Danach die Datei ex430rf2500.kext in den Ordner /Library/Extensions legen und hmland sollte dann funktionieren.&lt;br /&gt;
&lt;br /&gt;
Es kann sein, dass ab Mac OS X 10.9 der Trick mit dem codeless kext nicht mehr funktionieren soll, aber noch ist das nicht getestet. Langfristig kann man vielleicht auch eine kext mit einem Treiber für den HM-CFG-USB USB erstellen&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Windows ===&lt;br /&gt;
&amp;lt; Todo &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi ===&lt;br /&gt;
Der USB-Stack am Raspberry Pi ist für viele Probleme verantwortlich. Daher sieht man öfter Fehlermeldungen:&lt;br /&gt;
  usb-transfer took more than 100ms (1039ms), this may lead to timing problems!&lt;br /&gt;
&lt;br /&gt;
Da das Timing bei Homematic wichtig ist führt das zu vielen Retransmits und zu unzuverlässigen Aktoren. Als Workaround kann man den USB-Stack auf die deutlich langsamere Version 1.1 stellen. Dazu fügt man folgenden Text am Anfang der Datei /boot/cmdline.txt ein:&lt;br /&gt;
  dwc_otg.speed=1&lt;br /&gt;
&lt;br /&gt;
== Weitergehende Informationen ==&lt;br /&gt;
Es sind zwei Versionen des HM-CFG-USB im Umlauf:&lt;br /&gt;
* HM-CFG-USB-2: die aktuelle Version; Dokumentation derzeit (12/2013) nicht über die ELV-Artikelseite verfügbar, alternativ jedoch bei [http://files.voelkner.de/625000-649999/640558-an-01-ml-USB_FUNK_KONFIGURATIONSADAPTER_de_en.pdf Völkner]; Kennzeichen dieser Version: &lt;br /&gt;
** Größe: 28 x 84 x 11,5&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 18&amp;amp;nbsp;g&lt;br /&gt;
** Antenne innenliegend&lt;br /&gt;
* HM-CFG-USB: Vorgängerversion; Stand 12/2013 noch Restbestände im Handel verfügbar. Dokumentation ([http://files.voelkner.de/625000-649999/646462-an-01-ml-HM_Konfigurationsadapter_CFG_USB_de_en.pdf Völkner]); Kennzeichen:&lt;br /&gt;
** Anschluss per separatem USB-Kabel&lt;br /&gt;
** abstehende Stabantenne&lt;br /&gt;
** Größe: 40 x 90 x 25&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 45&amp;amp;nbsp;g&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,13071.msg86075.html#msg86075 FHEM Forum: HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen]&lt;br /&gt;
* [http://www.elv.de/homematic-usb-konfigurations-adapter-1.html ELV- / Herstellerinformationen] zum HM-CFG-USB&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:OSX]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=7277</id>
		<title>HM-CFG-USB USB Konfigurations-Adapter</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-CFG-USB_USB_Konfigurations-Adapter&amp;diff=7277"/>
		<updated>2014-08-12T23:45:30Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: /* Einrichtung unter Mac OS X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der [[HomeMatic]] &#039;&#039;&#039;USB Konfigurations-Adapter&#039;&#039;&#039; ist ein USB-Stick, der außer zur Konfiguration von HomeMatic Komponenten auch als [[Interface]] zwischen Fhem und HomeMatic Geräten benutzt werden kann.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
Im FHEM-Forum wird das Thema diskutiert unter dem Titel  [http://forum.fhem.de/index.php/topic,13071.msg86075.html#msg86075 HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen]. Teile der Informationen sind hier zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Linux ===&lt;br /&gt;
Es gibt einen gut funktionierenden Dämon, um den USB Stick mit FHEM zum Laufen zu bekommen. Dabei wird zuerst der Dämon [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb hmland] installiert und danach das Gerät (üblicherweise auf localhost) genau wie [[HM-CFG-LAN LAN Konfigurations-Adapter|HMLAN]] in FHEM eingebunden.&lt;br /&gt;
&lt;br /&gt;
Zunächst muss der Dämon compiliert werden. Analog zu [https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb dieser Beschreibung] ist die Vorgehensweise die folgende (in Debian/Ubuntu/Raspbian):&lt;br /&gt;
 cd /opt/&lt;br /&gt;
 apt-get install build-essential libusb-1.0-0-dev make gcc git-core&lt;br /&gt;
 git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
 cd hmcfgusb&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
(Unter Debian ist &amp;quot;build-essentials&amp;quot; nicht als Paket vorhanden, dieser Schritt kann entfallen.)&lt;br /&gt;
&lt;br /&gt;
Danach kann der Dienst zu Testzwecken gestartet werden (in /opt/hmcfgusb):&lt;br /&gt;
:&amp;lt;code&amp;gt;./hmland -p 1234 -D&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Dämon nach einem Neustart automatisiert zu starten, kann ein init-script wie das Folgende verwendet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # simple init for hmland&lt;br /&gt;
 &lt;br /&gt;
 pidfile=/var/run/hmland.pid&lt;br /&gt;
 port=1234&lt;br /&gt;
 &lt;br /&gt;
 case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start|&amp;quot;&amp;quot;)&lt;br /&gt;
 	chrt 50 /opt/hmcfgusb/hmland -r 03:30 -d -P -l 127.0.0.1 -p $port 2&amp;gt;&amp;amp;1 | perl -ne &#039;$|=1; print localtime . &amp;quot;: [hmland] $_&amp;quot;&#039; &amp;gt;&amp;gt; /var/log/hmland.log &amp;amp;&lt;br /&gt;
 	;;&lt;br /&gt;
  restart|reload|force-reload)&lt;br /&gt;
 	echo &amp;quot;Error: argument &#039;$1&#039; not supported&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
  stop)&lt;br /&gt;
 	killall hmland&lt;br /&gt;
 	;;&lt;br /&gt;
  status)&lt;br /&gt;
 	if [ ! -e $pidfile ]; then&lt;br /&gt;
 		echo &amp;quot;No pid&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 	pid=`cat $pidfile`&lt;br /&gt;
 	if kill -0 $pid &amp;amp;&amp;gt;1 &amp;gt; /dev/null; then&lt;br /&gt;
 		echo &amp;quot;Running&amp;quot;&lt;br /&gt;
 		exit 0&lt;br /&gt;
 	else&lt;br /&gt;
 		rm $pidfile&lt;br /&gt;
 		echo &amp;quot;Not running&amp;quot;&lt;br /&gt;
 		exit 1&lt;br /&gt;
 	fi&lt;br /&gt;
 &lt;br /&gt;
 	;;&lt;br /&gt;
  *)&lt;br /&gt;
 	echo &amp;quot;Usage: hmland [start|stop|status]&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 	exit 3&lt;br /&gt;
 	;;&lt;br /&gt;
 esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Distributionen, die Upstart einsetzen (z.B. xbian) kann folgendes Konfigurationsfile verwendet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# HMLAND&lt;br /&gt;
&lt;br /&gt;
description     &amp;quot;hmland&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start on starting fhem&lt;br /&gt;
stop on stopped fhem&lt;br /&gt;
&lt;br /&gt;
respawn&lt;br /&gt;
expect fork&lt;br /&gt;
&lt;br /&gt;
chdir /opt/hmcfgusb&lt;br /&gt;
exec /opt/hmcfgusb/hmland -d -l 127.0.0.1 -p 1234&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte als &amp;quot;/etc/init/hmland.conf&amp;quot; angelegt werden. Mit dem Befehl &lt;br /&gt;
 initctl reload-configuration&lt;br /&gt;
wird Upstart angewiesen, seine Konfiguration erneut einzulesen. Danach kann der neue Dienst &lt;br /&gt;
mit &lt;br /&gt;
 service hmland start&lt;br /&gt;
gestartet werden. &amp;lt;code&amp;gt;hmland&amp;lt;/code&amp;gt; wird jetzt immer vor FHEM gestartet und nach FHEM beendet.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Einrichtung, Start über fhem Startskript ===&lt;br /&gt;
&lt;br /&gt;
Ausprobiert auf einem BBB mit Debian, eigentlich ist das alles von Betateilchen:&lt;br /&gt;
&lt;br /&gt;
Zunächst hmland kompilieren wie oben beschrieben, bis zum make. Das muss erfolgreich durchgelaufen sein.&lt;br /&gt;
&lt;br /&gt;
Dann geht es weiter:&lt;br /&gt;
&lt;br /&gt;
 sudo cp hmcfgusb.rules /etc/udev/rules.d/&lt;br /&gt;
&lt;br /&gt;
Jetzt das fhem Startskript anpassen (in den Blöcken &#039;start&#039; und &#039;stop&#039; muss quasi nur jeweils 1 Zeile eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
Damit editiert man das fhem Startskript:&lt;br /&gt;
 sudo nano /etc/init.d/fhem&lt;br /&gt;
&lt;br /&gt;
Und so sollten die Blöcke anschließend aussehen (bitte nur jeweils die Zeile mit hmland einfügen)&lt;br /&gt;
&lt;br /&gt;
 &#039;start&#039;)&lt;br /&gt;
        echo &amp;quot;Starting fhem...&amp;quot;&lt;br /&gt;
        /opt/hmcfgusb/hmland -d -p 1234&lt;br /&gt;
        perl fhem.pl fhem.cfg&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        ;;&lt;br /&gt;
&lt;br /&gt;
 &#039;stop&#039;)&lt;br /&gt;
        echo &amp;quot;Stopping fhem...&amp;quot;&lt;br /&gt;
        perl fhem.pl $port &amp;quot;shutdown&amp;quot;&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
        pkill hmland&lt;br /&gt;
&lt;br /&gt;
So wird hmland vor fhem gestartet und nach fhem beendet. Letztlich erspart es das Hantieren mit den diversen Startskripten und ihren Rechten.&lt;br /&gt;
&lt;br /&gt;
Es dauert nach dem Start von fhem noch einige Sekunden, bis hmland fertig geladen ist. In dieser Zeit kann es zu fehlerhaften Einträgen im Logfile kommen.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Mac OS X ===&lt;br /&gt;
Wie unter Linux braucht man den Dämon hmland, den man aus Quelltexten erstellen muss. Dazu muss man die Bibliothek libusb installieren, entweder mit einem der Paketmanager wie Fink, MacPorts oder Homebrew oder direkt aus den Quellentexten (Beispiel: &amp;quot;fink install libusb1-shlibs libusb1&amp;quot;). Hat man wie bei Linux das Quelltextarchiv für hmland heruntergeladen und ausgepackt, müssen die Dateien Makefile und hmcfgusb.c angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Im Makefile muss man den Pfad zur libusb anpassen. Hat man libusb mit fink installiert muss man, &amp;quot;/opt/local/&amp;quot; durch &amp;quot;/sw/&amp;quot; bei den CFLAGS und den LDFLAGS ersetzen und&lt;br /&gt;
das &amp;quot;-lrt&amp;quot; aus den LDLIBS entfernen. Die Library librt gibt es bei Mac OS X nicht und wird anscheinend auch nicht gebraucht. (Stimmt das eigentlich?)&lt;br /&gt;
&lt;br /&gt;
In der Datei hmcfgusb.c muss man die Zeilen 130-134 mit dem Aufruf libusb_detach_kernel_driver auskommentieren oder löschen. Der geht nicht auf Mac OS X.&lt;br /&gt;
&lt;br /&gt;
Nach den Änderungen in den zwei Dateien, kann man wie bei Linux den Dämon hmland mit dem Kommando &amp;quot;make&amp;quot; erzeugen und mit &amp;quot;./hmland&amp;quot; ausführen. Automatisches Starten beim Booten mit launchd ist noch nicht probiert.&lt;br /&gt;
&lt;br /&gt;
Beim Start von hmland sollte man folgende Fehlermeldung in einer Endlos-Schleife erhalten:&lt;br /&gt;
&lt;br /&gt;
Datum Zeit: Client 127.0.0.1 connected! &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t claim interface: Access denied (insufficient permissions) &amp;lt;br /&amp;gt;&lt;br /&gt;
Can&#039;t find/open hmcfgusb! &amp;lt;br /&amp;gt;&lt;br /&gt;
Datum Zeit: Connection to 127.0.0.1 closed! &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ein Start von hmland mit Superuser-Rechten ändert daran nichts. Damit das claim interface klappt, muss man eine codeless Text in den Ordner /Library/Extensions legen. Ich habe dieses (http://mspdebug.sourceforge.net/misc/ex430rf2500-kext.zip) herunter geladen. Damit es funktioniert, muss man aber in der Datei Info.plist des Bündle die Properties idProduct und idVendor ändern, entweder mit dem Property List Editor oder einem anderen Texteditor. Die beiden Properties sind etwas versteckt bei Information Property List → IOKitPersonalities → ComIntf. Bei DebugIntf und DeviceDriver scheint man es nicht ändern zu müssen, aber schaden kann es nicht.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
idProduct: 49167&amp;lt;br /&amp;gt;&lt;br /&gt;
idVendor: 6943&lt;br /&gt;
&lt;br /&gt;
Die Rechte des kext-Bundles müssen auch noch gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
  chmod -R 755 ex430rf2500.kext&lt;br /&gt;
  chown -R root:wheel ex430rf2500.kext&lt;br /&gt;
&lt;br /&gt;
Danach die Datei ex430rf2500.kext in den Ordner /Library/Extensions legen und hmland sollte dann funktionieren.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung unter Windows ===&lt;br /&gt;
&amp;lt; Todo &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi ===&lt;br /&gt;
Der USB-Stack am Raspberry Pi ist für viele Probleme verantwortlich. Daher sieht man öfter Fehlermeldungen:&lt;br /&gt;
  usb-transfer took more than 100ms (1039ms), this may lead to timing problems!&lt;br /&gt;
&lt;br /&gt;
Da das Timing bei Homematic wichtig ist führt das zu vielen Retransmits und zu unzuverlässigen Aktoren. Als Workaround kann man den USB-Stack auf die deutlich langsamere Version 1.1 stellen. Dazu fügt man folgenden Text am Anfang der Datei /boot/cmdline.txt ein:&lt;br /&gt;
  dwc_otg.speed=1&lt;br /&gt;
&lt;br /&gt;
== Weitergehende Informationen ==&lt;br /&gt;
Es sind zwei Versionen des HM-CFG-USB im Umlauf:&lt;br /&gt;
* HM-CFG-USB-2: die aktuelle Version; Dokumentation derzeit (12/2013) nicht über die ELV-Artikelseite verfügbar, alternativ jedoch bei [http://files.voelkner.de/625000-649999/640558-an-01-ml-USB_FUNK_KONFIGURATIONSADAPTER_de_en.pdf Völkner]; Kennzeichen dieser Version: &lt;br /&gt;
** Größe: 28 x 84 x 11,5&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 18&amp;amp;nbsp;g&lt;br /&gt;
** Antenne innenliegend&lt;br /&gt;
* HM-CFG-USB: Vorgängerversion; Stand 12/2013 noch Restbestände im Handel verfügbar. Dokumentation ([http://files.voelkner.de/625000-649999/646462-an-01-ml-HM_Konfigurationsadapter_CFG_USB_de_en.pdf Völkner]); Kennzeichen:&lt;br /&gt;
** Anschluss per separatem USB-Kabel&lt;br /&gt;
** abstehende Stabantenne&lt;br /&gt;
** Größe: 40 x 90 x 25&amp;amp;nbsp;mm&lt;br /&gt;
** Gewicht: 45&amp;amp;nbsp;g&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,13071.msg86075.html#msg86075 FHEM Forum: HomeMatic USB Konfigurations-Adapter (HM-CFG-USB) in Fhem nutzen]&lt;br /&gt;
* [http://www.elv.de/homematic-usb-konfigurations-adapter-1.html ELV- / Herstellerinformationen] zum HM-CFG-USB&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:OSX]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Squeezebox&amp;diff=7276</id>
		<title>Squeezebox</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Squeezebox&amp;diff=7276"/>
		<updated>2014-08-12T21:38:23Z</updated>

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

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anzeige von Informationen und Statistiken zu dem System, auf dem Fhem ausgeführt wird.&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= --&amp;gt;&lt;br /&gt;
|ModForumArea=[http://forum.fhem.de/index.php/board,44.0.html Unterstützende Dienste]&lt;br /&gt;
|ModTechName=42_SYSMON.pm&lt;br /&gt;
|ModOwner=hexenmeister &amp;lt;br /&amp;gt;([http://forum.fhem.de/index.php?action=profile;u=4065 Forum] / [[Benutzer:Hexenmeister|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[SYSMON]] Modul liefert diverse Informationen und Statistiken zu dem System, auf dem FHEM-Server ausgeführt wird. &lt;br /&gt;
Es werden nur Linux-basierte Systeme unterstützt. Manche Informationen sind hardwarespezifisch und sind daher nicht auf jeder Plattform verfügbar. &lt;br /&gt;
Bis jetzt wurde dieses Modul auf folgenden Systemen getestet: Raspberry Pi (Debian Wheezy), BeagleBone Black, FritzBox 7390, WR703N unter OpenWrt.&lt;br /&gt;
&lt;br /&gt;
==Definition== &lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SYSMON [&amp;lt;M1&amp;gt;[ &amp;lt;M2&amp;gt;[ &amp;lt;M3&amp;gt;[ &amp;lt;M4&amp;gt;]]]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung erstellt eine neue SYSMON-Instanz. Die Parameter M1 bis M4 legen die Aktualisierungsintervalle für verschiedenen Readings (Statistiken) fest. Die Parameter sind als Multiplikatoren für die Zeit, die durch INTERVAL_BASE definiert ist, zu verstehen. Da diese Zeit fest auf 60 Sekunden gesetzt ist, können die Mx-Parameters als Zeitintervalle in Minuten angesehen werden.&lt;br /&gt;
Wird einer (oder mehrere) Multiplikatoren auf Null gesetzt werden, wird das entsprechende Readings deaktiviert.&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
Die Parameter sind für die Aktualisierung der Readings nach folgender Schema zuständig:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M1&#039;&#039;&#039;: (Default-Wert: 1)&lt;br /&gt;
:CPU-Daten: &#039;&#039;cpu_freq&#039;&#039;, &#039;&#039;cpu_temp&#039;&#039;, &#039;&#039;cpu_temp_avg&#039;&#039;, &#039;&#039;loadavg&#039;&#039;, &#039;&#039;stat_cpu&#039;&#039;, &#039;&#039;stat_cpu_diff&#039;&#039;, &#039;&#039;stat_cpu_percent&#039;&#039;, &#039;&#039;stat_cpu_text&#039;&#039;, power readings&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M2&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Speicher: &#039;&#039;ram&#039;&#039;, &#039;&#039;swap&#039;&#039; etc.&lt;br /&gt;
    &lt;br /&gt;
* &#039;&#039;&#039;M3&#039;&#039;&#039;: (Default-Wert: M1)&lt;br /&gt;
:Netztwerkinformationen: &#039;&#039;eth0&#039;&#039;, &#039;&#039;eth0_diff&#039;&#039;, &#039;&#039;wlan0&#039;&#039;, &#039;&#039;wlan0_diff&#039;&#039; etc.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;M4&#039;&#039;&#039;: (Default-Wert: 10*M1)&lt;br /&gt;
:Filesystem-Informationen&lt;br /&gt;
&lt;br /&gt;
folgende Readings werden immer anhand des Basisintervalls (unabhängig von den Mx-Parameters) aktualisiert:&lt;br /&gt;
&#039;&#039;fhemuptime&#039;&#039;, &#039;&#039;fhemuptime_text&#039;&#039;, &#039;&#039;idletime&#039;&#039;, &#039;&#039;idletime_text&#039;&#039;, &#039;&#039;uptime&#039;&#039;, &#039;&#039;uptime_text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==readings==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_bogomips&#039;&#039;&#039;&lt;br /&gt;
:CPU Speed: BogoMIPS&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_freq&#039;&#039;&#039;&lt;br /&gt;
:CPU-Frequenz&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp&#039;&#039;&#039;&lt;br /&gt;
:CPU-Temperatur&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cpu_temp_avg&#039;&#039;&#039;&lt;br /&gt;
:Durchschnitt der CPU-Temperatur, gebildet über die letzten 4 Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Start des FHEM-Servers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fhemuptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Start des FHEM-Servers: Menschenlesbare Ausgabe (textuelle Darstellung).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;idletime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden und in Prozent), die das System (nicht der FHEM-Server!) seit dem Start in dem Idle-Modus verbracht hat. Also die Zeit der Inaktivität.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;idletime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit der Inaktivität des Systems seit dem Systemstart in menschenlesbarer Form.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;loadavg&#039;&#039;&#039;&lt;br /&gt;
:Ausgabe der Werte für die Systemauslastung (load average): 1 Minute-, 5 Minuten- und 15 Minuten-Werte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ram&#039;&#039;&#039;&lt;br /&gt;
:Ausgabe der Speicherauslastung.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;swap&#039;&#039;&#039;&lt;br /&gt;
:Benutzung und Auslastung der SWAP-Datei (bzw. Partition).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;uptime&#039;&#039;&#039;&lt;br /&gt;
:Zeit (in Sekunden) seit dem Systemstart.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;uptime_text&#039;&#039;&#039;&lt;br /&gt;
:Zeit seit dem Systemstart in menschenlesbarer Form.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Netzwerkinformationen&#039;&#039;&#039;&lt;br /&gt;
:Informationen zu den über die angegebene Netzwerkschnittstellen übertragene Datenmengen und der Differenz zu der vorherigen Messung.&lt;br /&gt;
:Beispiele:&lt;br /&gt;
::Menge der übertragenen Daten über die Schnittstelle eth0.&lt;br /&gt;
::eth0: RX: 940.58 MB, TX: 736.19 MB, Total: 1676.77 MB&lt;br /&gt;
::Änderung der übertragenen Datenmenge in Bezug auf den vorherigen Aufruf (für eth0).&lt;br /&gt;
::eth0_diff: RX: 0.66 MB, TX: 0.06 MB, Total: 0.72 MB&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Dateisysteminformationen&#039;&#039;&#039;&lt;br /&gt;
:Informationen zu der Größe und der Belegung der gewünschten Dateisystemen.&lt;br /&gt;
:Seit Version 1.1.0 können Dateisysteme auch benannt werden (s.u.).&lt;br /&gt;
:In diesem Fall werden für die diese Readings die angegebenen Namen verwendet.&lt;br /&gt;
:Dies soll die Übersicht verbessern und die Erstellung von Plots erleichtern.&lt;br /&gt;
:Beispiel:&lt;br /&gt;
::fs_root: Total: 7340 MB, Used: 3573 MB, 52 %, Available: 3425 MB at /&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU Auslastung&#039;&#039;&#039;&lt;br /&gt;
:Informationen zu der Auslastung der CPU(s).&lt;br /&gt;
:Beispiel:&lt;br /&gt;
::stat_cpu: 10145283 0 2187286 90586051 542691 69393 400342&lt;br /&gt;
::stat_cpu_diff: 2151 0 1239 2522 10 3 761&lt;br /&gt;
::stat_cpu_percent: 4.82 0.00 1.81 93.11 0.05 0.00 0.20&lt;br /&gt;
::stat_cpu_text: user: 32.17 %, nice: 0.00 %, sys: 18.53 %, idle: 37.72 %, io: 0.15 %, irq: 0.04 %, sirq: 11.38 %&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Benutzerdefinierte Einträge&#039;&#039;&#039;&lt;br /&gt;
::Diese Readings sind Ausgaben der Kommandos, die an das Betriebssystem übergeben werden. Die entsprechende Angaben werden im Attribut user-defined vorgenommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FritzBox-spezifische Readings&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;wlan_state&#039;&#039;&#039;&lt;br /&gt;
:WLAN-Status: on/off&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;wlan_guest_state&#039;&#039;&#039;&lt;br /&gt;
:Gast-WLAN-Status: on/off&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;internet_ip&#039;&#039;&#039;&lt;br /&gt;
:aktuelle IP-Adresse&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;internet_state&#039;&#039;&#039;&lt;br /&gt;
:Status der Internetverbindung: connected/disconnected&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;night_time_ctrl&#039;&#039;&#039;&lt;br /&gt;
:Status der Klingelsperre on/off&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;num_new_messages&#039;&#039;&#039;&lt;br /&gt;
:Anzahl der neuen Anrufbeantworter-Meldungen&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fw_version_info&#039;&#039;&#039;&lt;br /&gt;
:Angaben zu der installierten Firmware-Version: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Readings zur Stromversorgung&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;power_ac_stat&#039;&#039;&#039;&lt;br /&gt;
:Statusinformation für die AC-Buchse: present (0|1), online (0|1), voltage, current&lt;br /&gt;
:Beispiel:&lt;br /&gt;
::power_ac_stat: 1 1 4.807 264&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;power_ac_text&#039;&#039;&#039;&lt;br /&gt;
:Statusinformation für die AC-Buchse in menschenlesbarer Form&lt;br /&gt;
:Beispiel:&lt;br /&gt;
::power_ac_text ac: present / online, Voltage: 4.807 V, Current: 264 mA&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;power_usb_stat&#039;&#039;&#039;&lt;br /&gt;
:Statusinformation für die USB-Buchse&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;power_usb_text&#039;&#039;&#039;&lt;br /&gt;
Statusinformation für die USB-Buchse in menschenlesbarer Form&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;power_battery_stat&#039;&#039;&#039;&lt;br /&gt;
:Statusinformation für die Batterie (wenn vorhanden): present (0|1), online (0|1), voltage, current, actual capacity&lt;br /&gt;
:Beispiel:&lt;br /&gt;
::power_battery_stat: 1 1 4.807 264 100&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;power_battery_text&#039;&#039;&#039;&lt;br /&gt;
:Statusinformation für die Batterie (wenn vorhanden) in menschenlesbarer Form&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;power_battery_info&#039;&#039;&#039;&lt;br /&gt;
:Menschenlesbare Zusatzinformationen für die Batterie (wenn vorhanden): Technologie, Kapazität, Status, Zustand, Gesamtkapazität&lt;br /&gt;
:Beispiel:&lt;br /&gt;
::power_battery_info: battery info: Li-Ion , capacity: 100 %, status: Full , health: Good , total capacity: 2100 mAh&lt;br /&gt;
&lt;br /&gt;
===Ausgabe-Beispiel===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|cpu_freq&lt;br /&gt;
|900&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|cpu_temp&lt;br /&gt;
|49.77&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|cpu_temp_avg&lt;br /&gt;
|49.7&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|eth0&lt;br /&gt;
|RX: 2954.22 MB, TX: 3469.21 MB, Total: 6423.43 MB&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|eth0_diff&lt;br /&gt;
|RX: 6.50 MB, TX: 0.23 MB, Total: 6.73 MB&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|fhemuptime&lt;br /&gt;
|11231&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|fhemuptime_text  &lt;br /&gt;
|0 days, 03 hours, 07 minutes&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|idletime&lt;br /&gt;
|931024 88.35 %&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|idletime_text&lt;br /&gt;
|10 days, 18 hours, 37 minutes (88.35 %)&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|loadavg&lt;br /&gt;
|0.14 0.18 0.22&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|ram&lt;br /&gt;
|Total: 485 MB, Used: 140 MB, 28.87 %, Free: 345 MB&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|swap&lt;br /&gt;
|n/a&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|uptime&lt;br /&gt;
|1053739&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|uptime_text&lt;br /&gt;
|12 days, 04 hours, 42 minutes&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|wlan0&lt;br /&gt;
|RX: 0.00 MB, TX: 0.00 MB, Total: 0 MB&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|wlan0_diff&lt;br /&gt;
|RX: 0.00 MB, TX: 0.00 MB, Total: 0.00 MB&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|fs_root&lt;br /&gt;
|Total: 7404 MB, Used: 3533 MB, 50 %, Available: 3545 MB at /&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|fs_boot&lt;br /&gt;
|Total: 56 MB, Used: 19 MB, 33 %, Available: 38 MB at /boot&lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|fs_usb1&lt;br /&gt;
|Total: 30942 MB, Used: 6191 MB, 21 %, Available: 24752 MB at /media/usb1  &lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|stat_cpu&lt;br /&gt;
|10145283 0 2187286 90586051 542691 69393 400342  &lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|stat_cpu_diff&lt;br /&gt;
|2151 0 1239 2522 10 3 761  &lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|stat_cpu_percent&lt;br /&gt;
|4.82 0.00 1.81 93.11 0.05 0.00 0.20  &lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|-&lt;br /&gt;
|stat_cpu_text&lt;br /&gt;
|user: 32.17 %, nice: 0.00 %, sys: 18.53 %, idle: 37.72 %, io: 0.15 %, irq: 0.04 %, sirq: 11.38 %  &lt;br /&gt;
|2013-11-27 00:05:36&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Befehle==&lt;br /&gt;
&lt;br /&gt;
===get===&lt;br /&gt;
&lt;br /&gt;
*interval&lt;br /&gt;
:Listet die bei der Definition angegebene Polling-Intervalle auf.&lt;br /&gt;
&lt;br /&gt;
*list&lt;br /&gt;
:Gibt alle Readings aus.&lt;br /&gt;
&lt;br /&gt;
*update&lt;br /&gt;
:Aktualisiert alle Readings. Alle Werte werden neu abgefragt.&lt;br /&gt;
&lt;br /&gt;
*version&lt;br /&gt;
:Zeigt die Version des SYSMON-Moduls.&lt;br /&gt;
&lt;br /&gt;
===set===&lt;br /&gt;
&lt;br /&gt;
*interval_multipliers&lt;br /&gt;
:Definiert Multipliers (wie bei der Definition des Gerätes).&lt;br /&gt;
&lt;br /&gt;
*clean&lt;br /&gt;
:Löscht benutzerdefinierbare Readings. Nach einem Update (oder nach der automatischen Aktualisierung) werden neue Readings generiert.&lt;br /&gt;
&lt;br /&gt;
*clear &amp;lt;reading name&amp;gt;&lt;br /&gt;
:Löscht den Reading-Eintrag mit dem gegebenen Namen. Nach einem Update (oder nach der automatischen Aktualisierung) wird dieser Eintrag ggf. neu erstellt (falls noch definiert). Dieses Mechanismus erlaubt das gezielte Löschen nicht mehr benötigter benutzerdefinierten Einträge.&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
&lt;br /&gt;
*filesystems &amp;lt;reading name&amp;gt;[:&amp;lt;mountpoint&amp;gt;[:&amp;lt;comment&amp;gt;]],...&lt;br /&gt;
:Gibt die zu überwachende Dateisysteme an. Es wird eine kommaseparierte Liste erwartet.&lt;br /&gt;
:Reading-Name wird bei der Anzeige und Logging verwendet, Mount-Point ist die Grundlage der Auswertung, Kommentar ist relevant für die HTML-Anzeige (s. SYSMON_ShowValuesHTML)&lt;br /&gt;
:Beispiel: /boot,/,/media/usb1&lt;br /&gt;
:oder: fs_boot:/boot,fs_root:/:Root,fs_usb1:/media/usb1:USB-Stick&lt;br /&gt;
:Im Sinne der besseren Übersicht sollten zumindest Name und MountPoint angegeben werden.&lt;br /&gt;
&lt;br /&gt;
*network-interfaces &amp;lt;name&amp;gt;[:&amp;lt;interface&amp;gt;[:&amp;lt;comment&amp;gt;]],...&lt;br /&gt;
:Kommaseparierte Liste der Netzwerk-Interfaces, die überwacht werden sollen. Jeder Eintrag besteht aus dem Reading-Namen, dem Namen des Netzwerk-Adapters und einem Kommentar für die HTML-Anzeige (s. SYSMON_ShowValuesHTML). Wird kein Doppelpunkt verwendet, wird der Wert gleichzeitig als Reading-Name und Interface-Name verwendet.&lt;br /&gt;
:Beispiel ethernet:eth0:Ethernet,wlan:wlan0:WiFi&lt;br /&gt;
&lt;br /&gt;
*user-defined &amp;lt;readingsName&amp;gt;:&amp;lt;Interval_Minutes&amp;gt;:&amp;lt;Comment&amp;gt;:&amp;lt;Cmd&amp;gt;,...&lt;br /&gt;
:Diese kommaseparierte Liste definiert Einträge mit jeweils folgenden Daten: Reading-Name, Aktualisierungsintervall in Minuten, Kommentar und Betriebssystem-Kommando.&lt;br /&gt;
:Die BS-Befehle werden entsprechend des angegebenen Intervalls ausgeführt und als Readings mit den angegebenen Namen vermerkt. Kommentare werden für die HTML-Ausgaben (s. SYSMON_ShowValuesHTML) benötigt.&lt;br /&gt;
:Alle Parameter sind nicht optional!&lt;br /&gt;
:Es ist wichtig, dass die angegebenen Befehle schnell ausgeführt werden, denn in dieser Zeit wird der gesamte FHEM-Server blockiert!&lt;br /&gt;
:Werden Ergebnisse der lang laufenden Operationen benötigt, sollten diese z.B als CRON-Job eingerichtet werden und in FHEM nur die davor gespeicherten Ausgaben visualisiert.&lt;br /&gt;
&lt;br /&gt;
:Beispiel: Anzeige der vorliegenden Paket-Aktualisierungen für das Betriebssystem:&lt;br /&gt;
:In einem cron-Job wird folgendes täglich ausgeführt:&lt;br /&gt;
:apt-get upgrade --dry-run| perl -ne &#039;/(\d*)\s[upgraded|aktualisiert]\D*(\d*)\D*install|^ \S+.*/ and print &amp;quot;$1 aktualisierte, $2 neue Pakete&amp;quot;&#039; 2&amp;gt;/dev/null &amp;gt; /opt/fhem/data/updatestatus.txt&lt;br /&gt;
:Das Attribute uder-defined wird auf&lt;br /&gt;
:sys_updates:1440:System Aktualisierungen:cat /opt/fhem/data/updatestatus.txt&lt;br /&gt;
:gesetzt. Danach wird die Anzahl der verfügbaren Aktualisierungen täglich als Reading &#039;sys_updates&#039; protokolliert.&lt;br /&gt;
&lt;br /&gt;
*disable&lt;br /&gt;
:Mögliche Werte: 0,1. Bei 1 wird die Aktualisierung gestoppt.&lt;br /&gt;
&lt;br /&gt;
==Plots==&lt;br /&gt;
&lt;br /&gt;
Für dieses Modul sind bereits einige gplot-Dateien vordefiniert:&lt;br /&gt;
&lt;br /&gt;
:FileLog-Versionen:&lt;br /&gt;
::SM_RAM.gplot&lt;br /&gt;
::SM_CPUTemp.gplot&lt;br /&gt;
::SM_FS_root.gplot&lt;br /&gt;
::SM_FS_usb1.gplot&lt;br /&gt;
::SM_Load.gplot&lt;br /&gt;
::SM_Network_eth0.gplot&lt;br /&gt;
::SM_Network_eth0t.gplot&lt;br /&gt;
::SM_Network_wlan0.gplot&lt;br /&gt;
::SM_CPUStat.gplot&lt;br /&gt;
::SM_CPUStatSum.gplot&lt;br /&gt;
::SM_CPUStatTotal.gplot&lt;br /&gt;
::SM_power_ac.gplot&lt;br /&gt;
::SM_power_usb.gplot&lt;br /&gt;
::SM_power_battery.gplot&lt;br /&gt;
:DbLog-Versionen:&lt;br /&gt;
::SM_DB_all.gplot&lt;br /&gt;
::SM_DB_CPUFreq.gplot&lt;br /&gt;
::SM_DB_CPUTemp.gplot&lt;br /&gt;
::SM_DB_Load.gplot&lt;br /&gt;
::SM_DB_Network_eth0.gplot&lt;br /&gt;
::SM_DB_RAM.gplot&lt;br /&gt;
&lt;br /&gt;
==Methoden==&lt;br /&gt;
&lt;br /&gt;
===HTML-Ausgabe===&lt;br /&gt;
HTML-Ausgabe-Methode (für ein Weblink): SYSMON_ShowValuesHTML(&amp;lt;SYSMON-Instanz&amp;gt;[,&amp;lt;Liste&amp;gt;])&lt;br /&gt;
&lt;br /&gt;
Das Modul definiert eine Funktion, die ausgewählte Readings in HTML-Format ausgibt.&lt;br /&gt;
Als Parameter wird der Name des definierten SYSMON-Geräts erwartet.&lt;br /&gt;
Der zweite Parameter ist optional und gibt eine Liste der anzuzeigenden Readings im Format &amp;lt;ReadingName&amp;gt;[:&amp;lt;Comment&amp;gt;[:&amp;lt;Postfix&amp;gt;]] an.&lt;br /&gt;
Dabei gibt ReadingName den anzuzeigenden Reading an, der Wert aus Comment wird als der Anzeigename verwendet und Postfix wird nach dem einheitlichen Wert angezeigt (so können z.B. Einheiten wie MHz angezeigt werden).&lt;br /&gt;
Falls kein Comment angegeben ist, wird eine intern vordefinierte Beschreibung angegeben. Bei benutzerdefinierbaren Readings wird ggf. Comment aus der Definition verwendet.&lt;br /&gt;
Wird keine Liste angegeben, wird eine vordefinierte Auswahl verwendet (alle Werte).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define sysv1 weblink htmlCode {SYSMON_ShowValuesHTML(&#039;sysmon&#039;)}&lt;br /&gt;
define sysv2 weblink htmlCode {SYSMON_ShowValuesHTML(&#039;sysmon&#039;, (&#039;date:Datum&#039;, &#039;cpu_temp:CPU Temperatur: °C&#039;, &#039;cpu_freq:CPU Frequenz: MHz&#039;))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text-Ausgabe===&lt;br /&gt;
&lt;br /&gt;
Text-Ausgabe-Methode: SYSMON_ShowValuesText(&amp;lt;SYSMON-Instance&amp;gt;[,&amp;lt;Liste&amp;gt;])&lt;br /&gt;
&lt;br /&gt;
Analog SYSMON_ShowValuesHTML, jedoch formatiert als reines Text.&lt;br /&gt;
&lt;br /&gt;
===Readings-Werte mit Perl lesen===&lt;br /&gt;
SYSMON_getValues([&amp;lt;Liste der gewünschten Schlüssel&amp;gt;])&lt;br /&gt;
&lt;br /&gt;
Liefert ein Hash-Ref mit den gewünschten Werten. Wenn keine Liste (array) übergeben wird, werden alle Werte geliefert.&lt;br /&gt;
&lt;br /&gt;
==Beispielkonfiguration==&lt;br /&gt;
&lt;br /&gt;
    # Modul-Definition&lt;br /&gt;
    define sysmon SYSMON 1 1 1 10&lt;br /&gt;
    #attr sysmon event-on-update-reading cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,^~ /.*usb.*,~ /$&lt;br /&gt;
    attr sysmon event-on-update-reading cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,fs_.*,stat_cpu_percent&lt;br /&gt;
    attr sysmon filesystems fs_boot:/boot,fs_root:/:Root,fs_usb1:/media/usb1:USB-Stick&lt;br /&gt;
    attr sysmon network-interfaces eth0:eth0:Ethernet,wlan0:wlan0:WiFi&lt;br /&gt;
    attr sysmon group RPi&lt;br /&gt;
    attr sysmon room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Log&lt;br /&gt;
    define FileLog_sysmon FileLog ./log/sysmon-%Y-%m.log sysmon&lt;br /&gt;
    attr FileLog_sysmon group RPi&lt;br /&gt;
    attr FileLog_sysmon logtype SM_CPUTemp:Plot,text&lt;br /&gt;
    attr FileLog_sysmon room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: CPU-Temperatur&lt;br /&gt;
    define wl_sysmon_temp SVG FileLog_sysmon:SM_CPUTemp:CURRENT&lt;br /&gt;
    attr wl_sysmon_temp group RPi&lt;br /&gt;
    attr wl_sysmon_temp label &amp;quot;CPU Temperatur: Min $data{min2}, Max $data{max2}, Last $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_temp room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Netzwerk-Datenübertragung für eth0&lt;br /&gt;
    define wl_sysmon_eth0 SVG FileLog_sysmon:SM_Network_eth0:CURRENT&lt;br /&gt;
    attr wl_sysmon_eth0 group RPi&lt;br /&gt;
    attr wl_sysmon_eth0 label &amp;quot;Netzwerk-Traffic eth0: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_eth0 room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Netzwerk-Datenübertragung für wlan0&lt;br /&gt;
    define wl_sysmon_wlan0 SVG FileLog_sysmon:SM_Network_wlan0:CURRENT&lt;br /&gt;
    attr wl_sysmon_wlan0 group RPi&lt;br /&gt;
    attr wl_sysmon_wlan0 label &amp;quot;Netzwerk-Traffic wlan0: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_wlan0 room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: CPU-Auslastung (load average)&lt;br /&gt;
    define wl_sysmon_load SVG FileLog_sysmon:SM_Load:CURRENT&lt;br /&gt;
    attr wl_sysmon_load group RPi&lt;br /&gt;
    attr wl_sysmon_load label &amp;quot;Load Min: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_load room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: RAM-Nutzung&lt;br /&gt;
    define wl_sysmon_ram SVG FileLog_sysmon:SM_RAM:CURRENT&lt;br /&gt;
    attr wl_sysmon_ram group RPi&lt;br /&gt;
    attr wl_sysmon_ram label &amp;quot;RAM-Nutzung Total: $data{max1}, Min: $data{min2}, Max: $data{max2}, Aktuell: $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_ram room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Dateisystem: Root-Partition&lt;br /&gt;
    define wl_sysmon_fs_root SVG FileLog_sysmon:SM_FS_root:CURRENT&lt;br /&gt;
    attr wl_sysmon_fs_root group RPi&lt;br /&gt;
    attr wl_sysmon_fs_root label &amp;quot;Root Partition Total: $data{max1}, Min: $data{min2}, Max: $data{max2}, Aktuell: $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_fs_root room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Visualisierung: Dateisystem: USB-Stick&lt;br /&gt;
    define wl_sysmon_fs_usb1 SVG FileLog_sysmon:SM_FS_usb1:CURRENT&lt;br /&gt;
    attr wl_sysmon_fs_usb1 group RPi&lt;br /&gt;
    attr wl_sysmon_fs_usb1 label &amp;quot;USB1 Total: $data{max1}, Min: $data{min2}, Max: $data{max2}, Aktuell: $data{currval2}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_fs_usb1 room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige der Readings zum Einbinden in ein &#039;Raum&#039;.&lt;br /&gt;
    define SysValues weblink htmlCode {SYSMON_ShowValuesHTML(&#039;sysmon&#039;)}&lt;br /&gt;
    attr SysValues group RPi&lt;br /&gt;
    attr SysValues room 9.03_Tech&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige CPU Auslasung&lt;br /&gt;
    define wl_sysmon_cpustat SVG FileLog_sysmon:SM_CPUStat:CURRENT&lt;br /&gt;
    attr wl_sysmon_cpustat label &amp;quot;CPU(min/max): user:$data{min1}/$data{max1} nice:$data{min2}/$data{max2} sys:$data{min3}/$data{max3} idle:$data{min4}/$data{max4} io:$data{min5}/$data{max5} irq:$data{min6}/$data{max6} sirq:$data{min7}/$data{max7}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_cpustat group RPi&lt;br /&gt;
    attr wl_sysmon_cpustat room 9.99_Test&lt;br /&gt;
    attr wl_sysmon_cpustat plotsize 840,420&lt;br /&gt;
    define wl_sysmon_cpustat_s SVG FileLog_sysmon:SM_CPUStatSum:CURRENT&lt;br /&gt;
    attr wl_sysmon_cpustat_s label &amp;quot;CPU(min/max): user:$data{min1}/$data{max1} nice:$data{min2}/$data{max2} sys:$data{min3}/$data{max3} idle:$data{min4}/$data{max4} io:$data{min5}/$data{max5} irq:$data{min6}/$data{max6} sirq:$data{min7}/$data{max7}&amp;quot;&lt;br /&gt;
    attr wl_sysmon_cpustat_s group RPi&lt;br /&gt;
    attr wl_sysmon_cpustat_s room 9.99_Test&lt;br /&gt;
    attr wl_sysmon_cpustat_s plotsize 840,420&lt;br /&gt;
    define wl_sysmon_cpustatT SVG FileLog_sysmon:SM_CPUStatTotal:CURRENT&lt;br /&gt;
    attr wl_sysmon_cpustatT label &amp;quot;CPU-Auslastung&amp;quot;&lt;br /&gt;
    attr wl_sysmon_cpustatT group RPi&lt;br /&gt;
    attr wl_sysmon_cpustatT plotsize 840,420&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige Stromversorgung AC&lt;br /&gt;
    define wl_sysmon_power_ac SVG FileLog_sysmon:SM_power_ac:CURRENT&lt;br /&gt;
    attr wl_sysmon_power_ac label &amp;quot;Stromversorgung (ac) Spannung: $data{min1} - $data{max1} V,  Strom: $data{min2} - $data{max2} mA&amp;quot;&lt;br /&gt;
    attr wl_sysmon_power_ac room Technik&lt;br /&gt;
    attr wl_sysmon_power_ac group system&lt;br /&gt;
    &lt;br /&gt;
    # Anzeige Stromversorgung Battery&lt;br /&gt;
    define wl_sysmon_power_bat SVG FileLog_sysmon:SM_power_battery:CURRENT&lt;br /&gt;
    attr wl_sysmon_power_bat label &amp;quot;Stromversorgung (bat) Spannung: $data{min1} - $data{max1} V,  Strom: $data{min2} - $data{max2} mA&amp;quot;&lt;br /&gt;
    attr wl_sysmon_power_bat room Technik&lt;br /&gt;
    attr wl_sysmon_power_bat group system&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelines&amp;diff=7271</id>
		<title>DevelopmentGuidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelines&amp;diff=7271"/>
		<updated>2014-08-12T21:21:35Z</updated>

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

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open Issues =&lt;br /&gt;
== Vor Entwicklungsbeginn von fhem 5.x zu klären ==&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;Informationsumfang von xmllist&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
xmllist muss alle Werte mitnehmen, da sonst diese nie angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
xmllist hat auch weitere Daten:&lt;br /&gt;
&lt;br /&gt;
* die Liste aller möglichen set Werte&lt;br /&gt;
* die Liste aller möglichen Attribute&lt;br /&gt;
&lt;br /&gt;
Variante: Optionales Argument bei xmllist, das die Detailstufe oder der Informationsumfang eingrenzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;Aufbau einer Polling-Infrastruktur für Geräte, die nicht aktiv den Zustand melden&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Beispiele: EMEM, M232.&lt;br /&gt;
Denkbar auch zur Identifikation von toten Geräten (USF1000 muss alle 30 Minuten einen Wert liefern; bleibt der n mal aus, wird eine Warnung erzeugt).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;Multithreading/Parallelisierung&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Nähe zur Polling-Infrastruktur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;Dokumentation&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Standardfunktionen:&lt;br /&gt;
AttrFn&lt;br /&gt;
AttrList&lt;br /&gt;
Clients&lt;br /&gt;
DefFn&lt;br /&gt;
GetFn&lt;br /&gt;
ListFn&lt;br /&gt;
Match&lt;br /&gt;
MatchList&lt;br /&gt;
NotifyFn&lt;br /&gt;
ParseFn&lt;br /&gt;
ReadFn&lt;br /&gt;
ReadyFn&lt;br /&gt;
SetFn&lt;br /&gt;
ShutdownFn&lt;br /&gt;
StateFn&lt;br /&gt;
UndefFn&lt;br /&gt;
WriteFn&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;Erstellung eines Template-Moduls&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Kommentierte Vorlage nn_Modul.pm fuer fhem 5.x.&lt;br /&gt;
&lt;br /&gt;
== Erweiterungen/Verbesserungen ==&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt; Auslagerung der Funktionen für die Bildung von Mittelwerten über Zeitintervalle in ein eigenes Modul&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
z.B. Niederschlag pro Tag, Woche, Monat&lt;br /&gt;
Module: CUL_WS,KS300,CUL_EM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt; contrib/dblog/93_DBLog ins FHEM-Verzeichnis aufrücken lassen&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Kann benutzt werden, um Events in Datenbanken zu loggen.&lt;br /&gt;
&lt;br /&gt;
Todos:&lt;br /&gt;
&lt;br /&gt;
* FileLog-artigen Getter implementieren&lt;br /&gt;
* Komplettdump&lt;br /&gt;
* Auflistung der gespeicherten Daten&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;Logs und Zeitreihen&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Derzeit erfüllen Logs u.a. zwei grundverschiedene Aufgaben:&lt;br /&gt;
&lt;br /&gt;
* der Benutzer kann sehen, was zu einem bestimmten Zeitpunkt passiert ist&lt;br /&gt;
* ein Frontend kann daraus eine Zeitreihe ableiten für eine Grafik&lt;br /&gt;
&lt;br /&gt;
Es sollte geklärt werden, wie mit den daraus entstehenden Anforderungen an die Logs (möglichst gut menschenlesbar vs. möglichst gut maschinenverarbeitbar) optimal erfüllt werden können.&lt;br /&gt;
&lt;br /&gt;
= Martins Liste der Readings, Internals, etc. =&lt;br /&gt;
Beispiele:&lt;br /&gt;
local, LOCAL&lt;br /&gt;
po, PortObj&lt;br /&gt;
socket, SOCKET&lt;br /&gt;
Type, TYPE&lt;br /&gt;
&lt;br /&gt;
weitere teils unklare Bezeichnungen, die evtl. harmonisiert werden könnten:&lt;br /&gt;
DELTAUNIT, NUMUNITS, RAINUNIT, UNIT, UNITS, WINDUNIT&lt;br /&gt;
CODE, FamilyCode, HOUSE&lt;br /&gt;
INTERVAL, Timer, TRIGGERTIME&lt;br /&gt;
NAME, DeviceName&lt;br /&gt;
NR, DEVNR&lt;br /&gt;
&lt;br /&gt;
dann sind da die Standardfunktionen bei Initialize, die einfach mal&lt;br /&gt;
dokumentiert werden müssten:&lt;br /&gt;
AttrFn&lt;br /&gt;
AttrList&lt;br /&gt;
Clients&lt;br /&gt;
DefFn&lt;br /&gt;
GetFn&lt;br /&gt;
ListFn&lt;br /&gt;
Match&lt;br /&gt;
MatchList&lt;br /&gt;
NotifyFn&lt;br /&gt;
ParseFn&lt;br /&gt;
ReadFn&lt;br /&gt;
ReadyFn&lt;br /&gt;
SetFn&lt;br /&gt;
ShutdownFn&lt;br /&gt;
StateFn&lt;br /&gt;
UndefFn&lt;br /&gt;
WriteFn&lt;br /&gt;
&lt;br /&gt;
einer weiteren Betrachtung bedarf der Trigger für notify&#039;s:&lt;br /&gt;
CHANGED&lt;br /&gt;
sowie der eigentlichen&lt;br /&gt;
READINGS&lt;br /&gt;
die aber in einem anderen Kontext behandelt werden sollten.&lt;br /&gt;
&lt;br /&gt;
einige feste Parameter können vorab schonmal gefiltert werden:&lt;br /&gt;
DEF&lt;br /&gt;
IODev&lt;br /&gt;
NAME&lt;br /&gt;
NR&lt;br /&gt;
STATE&lt;br /&gt;
TYPE&lt;br /&gt;
&lt;br /&gt;
je nach IODev können weitere dazu kommen:&lt;br /&gt;
CUN868_MSGCNT&lt;br /&gt;
CUN868_RAWMSG&lt;br /&gt;
CUN868_RSSI&lt;br /&gt;
CUN868_TIME&lt;br /&gt;
LASTIODev&lt;br /&gt;
MSGCNT&lt;br /&gt;
RAWMSG&lt;br /&gt;
RSSI&lt;br /&gt;
&lt;br /&gt;
bei X10 fiel auf, das in den Internals&lt;br /&gt;
MODEL&lt;br /&gt;
gesetzt wird, aber explizit noch einmal&lt;br /&gt;
model&lt;br /&gt;
in den Attributes vorkommen.&lt;br /&gt;
&lt;br /&gt;
bei CUL_WS fiel auf, das die STATE summary sowohl in den Internals als auch in&lt;br /&gt;
den Readings auftaucht, obwohl in den Readings einzelne Werte vorhanden sind:&lt;br /&gt;
Internals:&lt;br /&gt;
STATE T: 16.7 H: 66.7&lt;br /&gt;
Readings:&lt;br /&gt;
humidity 66.7&lt;br /&gt;
state T: 16.7 H: 66.7&lt;br /&gt;
temperature 16.7 &lt;br /&gt;
&lt;br /&gt;
verbleibende Internals:&lt;br /&gt;
&lt;br /&gt;
ALARM&lt;br /&gt;
ATTR&lt;br /&gt;
BasicFeePerMonth&lt;br /&gt;
BTN&lt;br /&gt;
CHANGETIME&lt;br /&gt;
Cmd&lt;br /&gt;
CONTENT&lt;br /&gt;
corr1&lt;br /&gt;
corr2&lt;br /&gt;
corr3&lt;br /&gt;
corr4&lt;br /&gt;
CostPerUnit&lt;br /&gt;
currentlogfile&lt;br /&gt;
DELTAFACTOR&lt;br /&gt;
DELTAUNIT&lt;br /&gt;
DeviceName&lt;br /&gt;
DEVNR&lt;br /&gt;
DIAMETER&lt;br /&gt;
FACTOR&lt;br /&gt;
FamilyCode&lt;br /&gt;
FD&lt;br /&gt;
FH&lt;br /&gt;
FHTID&lt;br /&gt;
FIXNEW&lt;br /&gt;
FIXRENUMBER&lt;br /&gt;
GEOMETRY&lt;br /&gt;
HEIGHT&lt;br /&gt;
Host&lt;br /&gt;
HOUSE&lt;br /&gt;
ID&lt;br /&gt;
IDX&lt;br /&gt;
INATTR&lt;br /&gt;
INPUT&lt;br /&gt;
INSET&lt;br /&gt;
INTERVAL&lt;br /&gt;
INTV_ALARM&lt;br /&gt;
INTV_CHECK&lt;br /&gt;
LENGTH&lt;br /&gt;
LINK&lt;br /&gt;
LircObj&lt;br /&gt;
local&lt;br /&gt;
LOCAL&lt;br /&gt;
LOCATION&lt;br /&gt;
logfile&lt;br /&gt;
MAX&lt;br /&gt;
MOBILE&lt;br /&gt;
MODEL&lt;br /&gt;
NEXT_OPEN&lt;br /&gt;
NR_CMD_LAST_H&lt;br /&gt;
NR_EMSG&lt;br /&gt;
NR_FMSG&lt;br /&gt;
NR_KMSG&lt;br /&gt;
NR_RMSG&lt;br /&gt;
NR_TMSG&lt;br /&gt;
NTM&lt;br /&gt;
NUMUNITS&lt;br /&gt;
OFFSET&lt;br /&gt;
OLDDEF&lt;br /&gt;
OW_FAMILY&lt;br /&gt;
OWFS_ID&lt;br /&gt;
OW_ID&lt;br /&gt;
OW_PATH&lt;br /&gt;
OW_SCALE&lt;br /&gt;
PARTIAL&lt;br /&gt;
pipeopentime&lt;br /&gt;
po&lt;br /&gt;
PortObj&lt;br /&gt;
pos&lt;br /&gt;
PRESENT&lt;br /&gt;
PREV&lt;br /&gt;
QUEUE&lt;br /&gt;
RAINUNIT&lt;br /&gt;
RA_Timeout&lt;br /&gt;
RE&lt;br /&gt;
REGEXP&lt;br /&gt;
REP&lt;br /&gt;
RExt&lt;br /&gt;
ROUTERID&lt;br /&gt;
SelectObj&lt;br /&gt;
SENSOR&lt;br /&gt;
SERIAL&lt;br /&gt;
SERIALS&lt;br /&gt;
socket&lt;br /&gt;
SOCKET&lt;br /&gt;
STEP&lt;br /&gt;
TCPDev&lt;br /&gt;
Timer&lt;br /&gt;
TRIGGERTIME&lt;br /&gt;
ttytype&lt;br /&gt;
Type&lt;br /&gt;
UNIT&lt;br /&gt;
UNITS&lt;br /&gt;
USBDev&lt;br /&gt;
VERSION&lt;br /&gt;
VOLATILE&lt;br /&gt;
WIDTH&lt;br /&gt;
WINDUNIT&lt;br /&gt;
XMIT&lt;br /&gt;
XMIT_TIME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;amp;#160;;; und&amp;amp;#160;%% ==&lt;br /&gt;
Das Problem ist, dass sowohl &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define lampoff at 07:00 set Lamp1 off;; set Lamp2 off&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
als auch später (um 07:00)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set Lamp1 off; set Lamp2 off&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
vom gleichen AnalyzeCommandChain verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Diese erkennt an dem&amp;amp;#160;;;, dass die erste Zeile nicht zu trennen ist, die zweite&lt;br /&gt;
aber schon. In der ersten Zeile wird dann auch&amp;amp;#160;;; nach&amp;amp;#160;; gewandelt, und intern&lt;br /&gt;
speichert das &amp;quot;at&amp;quot; nur noch &amp;quot;set Lamp1 off; set Lamp2 off&amp;quot;. Bevor&lt;br /&gt;
AnalyzeCommand den Befehl ausführt, müssen perl- und shellskripte wieder ein&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt; bekommen, um nicht von AnalyzeCommand an falscher Stelle zersägt zu werden.&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;
Die &amp;quot;richtige&amp;quot; Lösung wäre so etwas wie&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define lampoff at 07:00 [ set Lamp1 off; set Lamp2 off ]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
erfordert aber einen Parser, der den passenden Klammer-zu findet, und das ist&lt;br /&gt;
aufwendig. &lt;br /&gt;
&lt;br /&gt;
Uns gefällt @,&amp;amp;#160;%,&amp;amp;#160;%EVTPART1, usw. immer weniger, wir&lt;br /&gt;
finden &amp;quot;magische&amp;quot; Variablen wie $DEVICE, $EVENT, $EVTPART1, usw. &lt;br /&gt;
logischer - sie würden keinen Stress mit @@/%% verursachen. Wir wissen nicht, wie man einen schmerzlosen&lt;br /&gt;
Übergang durchführt, insb. mit den vielen fhemwiki-Beispielen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Callmonitor_mit_Anruferliste_und_Zusatzfunktionen&amp;diff=7268</id>
		<title>Callmonitor mit Anruferliste und Zusatzfunktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Callmonitor_mit_Anruferliste_und_Zusatzfunktionen&amp;diff=7268"/>
		<updated>2014-08-12T21:11:01Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Beschreibung [[Callmonitor mit Anruferliste und Zusatzfunktionen]] basiert hauptsächlich auf dem Beitrag [http://forum.fhem.de/index.php/topic,19238.0.html Callmonitor für Anfänger] im Fhem Forum.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors (im Forenthread) nicht einheitlich durchgehalten wird. Im hier vorgestellten Code heißt er &#039;&#039;my_callmonitor&#039;&#039;. Das muss sowohl in der Konfiguration als auch in der 99_myUtilsTelefon.pm konsistent durchgehalten werden}}&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem [http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260 Beitrag] in oben genannter Diskussion entnommen. Er umfasst alle Bestandteile zum Anzeigen einer rollierenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS) sind auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
Wie die Anruferliste erstellt wird und wie die Voraussetzungen für auszulösende Aktionen eingebunden werden, wird im Abschnitt [[Callmonitor mit Anruferliste und Zusatzfunktionen#Lösung|Lösung]] schrittweise erklärt. Die Anforderungen an die Anruferliste und auszulösende Aktionen werden folgend kurz dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Anforderungen an die Anruferliste ===&lt;br /&gt;
* Liste mit der Möglichkeit die letzten fünf über die Fritz!Box angenommenen und getätigten Anrufe darzustellen&lt;br /&gt;
* die Liste soll den letzen Anruf in der ersten Zeile anzeigen&lt;br /&gt;
* der Status des Anrufes ist über ein Symbol ersichtlich&lt;br /&gt;
* Name und Nummer des Angerufenen / Anrufenden sind ersichtlich&lt;br /&gt;
&lt;br /&gt;
=== Anforderungen an die Möglichkeit Aktionen auszulösen ===&lt;br /&gt;
* Aktionen können in Abhängigkeit von Status des Anrufes ausgeführt werden&lt;br /&gt;
* Aktionen können auch gekapselt werden&lt;br /&gt;
&lt;br /&gt;
=== Durchzuführende Schritte ===&lt;br /&gt;
Die Reihenfolge ist hier unerheblich. Die Liste soll lediglich einen groben Überblick über die einzelnen erforderlichen Schritte geben&lt;br /&gt;
* 99_myUtilsTelefon.pm erstellen (bitte zuerst durchführen)&lt;br /&gt;
* UserReadings im Callmonitor in FHEM einrichten&lt;br /&gt;
* [[ReadingsGroup]] erstellen, die die UserReadings anzeigt&lt;br /&gt;
* Notify erstellen, das die Telefonaktionen aufruft&lt;br /&gt;
* in Abhängigkeit vom Anrufstatus auszulösende Aktionen einbinden&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Aktivierter Callmonitor in der Fritz!Box ===&lt;br /&gt;
Damit das Modul Callmonitor in FHEM überhaupt arbeitet, muss zuerst in der Fritz!Box der Callmonitor eingeschaltet werden. Das geht am einfachsten, indem man von einem direkt an die Fritz!Box angeschlossenen Telefon die Nummer #96*5* wählt.&lt;br /&gt;
&lt;br /&gt;
=== Modul FB_CALLMONITOR in FHEM ===&lt;br /&gt;
Fhem-seitig sind die erforderlichen Funktionen im Modul [[FB_CALLMONITOR]] implementiert.&lt;br /&gt;
&lt;br /&gt;
=== Anlegen einer Datei 99_myUtilsTelefon.pm ===&lt;br /&gt;
Die Datei 99_myUtilsTelefon.pm wird den Perlcode aufnehmen, der die Anruferliste sowie die damit verknüpften Aktionen ausführt. Das Prinzip, um die 99_myUtilsTelefon.pm zu erstellen, ist exakt das Gleiche wie für &amp;quot;[[99 myUtils anlegen]]&amp;quot; beschrieben. In unserem konkreten Fall soll die Datei allerdings den Namen 99_myUtilsTelefon.pm erhalten.&lt;br /&gt;
&lt;br /&gt;
Bitte diesen Schritt nun ausführen, damit später das Script nur noch in die 99_myUtilsTelefon.pm kopiert werden muss.&lt;br /&gt;
&lt;br /&gt;
Natürlich muss auch die 99_myUtilsTelefon.pm nach jeder Anpassung an eigene Bedürfnisse neu geladen werden.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
In die [[Konfiguration]] (fhem.cfg) ist einzutragen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste generieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
#attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war,&lt;br /&gt;
                # der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war,&lt;br /&gt;
                # der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war,&lt;br /&gt;
                # der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, &lt;br /&gt;
                # der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        # hier notieren was generell passieren soll, sobald ein Anruf beendet wurde &lt;br /&gt;
        # (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Tecalor_THZ_W%C3%A4rmepumpe&amp;diff=7267</id>
		<title>Tecalor THZ Wärmepumpe</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Tecalor_THZ_W%C3%A4rmepumpe&amp;diff=7267"/>
		<updated>2014-08-12T21:08:57Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Englisch version [[Tecalor THZ Heatpump]]&lt;br /&gt;
&lt;br /&gt;
Hier wird beschrieben wie man mit FHEM eine Tecalor THZ / Stieben Eltron LWZ 303/403/404 &lt;br /&gt;
/SOL Wärmepumpe auslesen steuern kann.&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis: Tecalor ist die Privatkundenmarke von Stieben Eltron. Die Geräte sind absolut baugleich.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend wird von der &amp;quot;THZ&amp;quot; gesprochen.&lt;br /&gt;
&lt;br /&gt;
Getestet sind die Versionen 4.09, 4.19, 4.39 und 5.39. &lt;br /&gt;
Ältere Versionen können funktionieren, das ist jedoch nicht garantiert.&lt;br /&gt;
HINWEIS: Diese Anleitung ist für Personen gedacht, die sich mit Elektronik auskennen.&lt;br /&gt;
Der Autor und der Entwickler haften nicht für Schäden und geben keine Funktionsgarantie.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG! Seit Version 0.087 wurden die Parameternamen geändert!&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Dies dient der Vereinheitlichung der Parameternamen. Werte mit &amp;quot;s&amp;quot; sind Statuswerte, solche mit &amp;quot;p&amp;quot; sind Parameter die in der Heizung eingestellt sind.&lt;br /&gt;
Weitere Infos bei den ausgelesenen Parametern. Nach einem Updaten müssen ggf. Sachen wie readingsGroups, Dashboards, etc. angepasst werden.&lt;br /&gt;
&lt;br /&gt;
=Verbindungsmöglichkeiten=&lt;br /&gt;
==Lokal per RS232 oder USB==&lt;br /&gt;
Die THZ hat zwei Anschlüsse die zur Verbindung genutzt werden können.&lt;br /&gt;
* Einen Seriellen Anschluss der mit einem MNL-SG3 Stecker genutzt werden kann.&lt;br /&gt;
* Einen USB Anschluss der auf der Platine zu finden ist un mit einem TYP-B Kabel funktioniert.&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG! Der USB Anschluss befindet sich rückseitig auf der Platine die sich hinter der Abdeckung hinter der rechten Türe. Darf nur stromlos verbunden werden. Dazu die Wärmepumpe komplett vom Strom trennen!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Baudraten variieren je nach Hardware- und Softwareversion zwischen 9600 und 115200 bei Seriell. Bei USB liegt diese bei 115200 oder 57600.&lt;br /&gt;
Eine Verbindungsanleitung zum Seriellen Port findet sich hier: [http://robert.penz.name/heat-pump-lwz/ Robert Penz Homepage]&lt;br /&gt;
&lt;br /&gt;
==Entfernte Verbindung mit Ser2Net==&lt;br /&gt;
Wenn die FHEM Zentrale nicht direkt in der Nähe der Heizung steht kann mir Ser2Net gearbeitet werden. Dieses stellt auf einem TCP-Port einen virtuellen seriellen Anschluss zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Installation Ser2Net auf Linux===&lt;br /&gt;
Um den Serial-Port-Server Ser2Net zu installieren ist auf Linux folgendes zu tun:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install ser2net&amp;lt;/code&amp;gt;&lt;br /&gt;
in der /etc/ser2net.conf (/dev/ttyXXX)&lt;br /&gt;
:&amp;lt;code&amp;gt;2003:raw:500:/dev/ttyUSB0:115200 NONE 1STOPBIT 8DATABITS  &amp;lt;/code&amp;gt;&lt;br /&gt;
Der Port kann frei gewählt werden, solange er nicht bereits genutzt wird.&lt;br /&gt;
&lt;br /&gt;
==Getestete Host-Systeme==&lt;br /&gt;
Getestet ist dieses Modul auf FritzBox, nas-qnap, Raspberry Pi und MacOS.&lt;br /&gt;
&lt;br /&gt;
=Definition in FHEM=&lt;br /&gt;
==Mit direkter serieller oder USB Verbindung==&lt;br /&gt;
:&amp;lt;code&amp;gt;define Mythz THZ /dev/ttyUSB0@115200 # oder (/dev/ttyXXX)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Mythz interval_sGlobal 300 # Internes Polling Intervall 5min&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Mythz interval_sHistory 28800 # Internes Polling Intervall 8h&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Mythz interval_sLast10errors 120 # Internes Polling Fehlerspeicher&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define FileLog_Mythz FileLog ./log/Mythz-%Y.log Mythz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Attribute interval_sGlobal und interval_sHistory nicht definiert sind (oder 0), ist das interne Polling deaktiviert. Natürlich kann das Polling auch mit dem &amp;quot;at&amp;quot; Befehl ausserhalb des Moduls definiert werden.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Mythz THZ /dev/ttyUSB0@115200 # oder (/dev/ttyXXX)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define atMythzGlobal at +*00:05:00 {fhem &amp;quot;get Mythz sGlobal&amp;quot;,&amp;quot;1&amp;quot;;;return()}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define atMythzHistory at +*08:00:00 {fhem &amp;quot;get Mythz sHistory&amp;quot;,&amp;quot;1&amp;quot;;;return()}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define FileLog_Mythz FileLog ./log/Mythz-%Y.log Mythz &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Via Netzwerk mit Ser2Net==&lt;br /&gt;
:&amp;lt;code&amp;gt;define Mythz THZ 192.168.0.244:2003&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Mythz interval_sGlobal 300 # Internes Polling Intervall 5min&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Mythz interval_sHistory 28800 # Internes Polling Intervall 8h&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Mythz interval_sLast10errors 120 # Internes Polling Fehlerspeicher&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define FileLog_Mythz FileLog ./log/Mythz-%Y.log Mythz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ausgelesene Werte=&lt;br /&gt;
Wenn die Verbindung und das Auslesen erfolgreich waren, sollten Werte wie sGlobal, sFirmware, sHistory und diverse Einstellungen wie die Urlaubszeiten sowie einige PXX Werte angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sGlobal (vormals allFB)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beinhaltet alle aktuellen Werte wie Temperaturen von Wasser und Gas, Lüfterstatus, Drücke, usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sFirmware&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zeigt die Firmware Version der Wärmepumpe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sHistory&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Enthält Angaben zur Betriebsdauer. Beispielsweise die Anzahl der Betriebsstunden der Kompressoren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pHoliday-Werte&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier werden die aktuellen Einstellungen der Urlaubsfunktion der THZ angezeigt. Diese bewirken, dass keine Tagabsenkung (sofern programmiert) gemacht wird. &lt;br /&gt;
Die holiday-Werte können mittels &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; auch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sLast10errors&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Liest die letzten 10 Fehlercodes aus und stellt diese dar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pXX-Werte &amp;amp; program-Werte&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die pXX-Werte und program-Werte stellen Einstellungen wie Heizkreistemperaturen und Lüfterstufen sowie Heizungs- und Warmwasserprogramme der THZ dar. Alle pXX-Werte und program-Werte können mittels &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; auch angepasst werden.&lt;br /&gt;
Es sind auch Lüfterdurchsatzmengen und Passivkühlung konfigurierbar.&amp;lt;br&amp;gt;&lt;br /&gt;
pOpMode zeigt den Betriebszustand. Automatik, Handbetrieb, etc...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;party-time&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier wird die Uhrzeit der Party programmiert.&lt;br /&gt;
Party-Time regelt die Lüfterstufe (p99FanStageParty) im Party-Modus. Diese kann auch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sDHW (ex Status_DHW_F3)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Informationen zur Warmwasserbereitung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sHC1 (ex Status_HC1_F4)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Enthält Informationen zum Heizkreis 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sHC2 (ex Status_HC2_F5)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Heizkreis 2 Informationen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sSol (ex Status_Sol_16)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Informationen zur Solaranlage&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pOpMode (ex OperatingMode)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Betriebsart: Bereitschaft, Automatik, Tagbetrieb, Absenkbetrieb, WW-Betrieb, Manueller Betrieb, Notbetrieb&lt;br /&gt;
&lt;br /&gt;
Wenn die Betriebsart via FHEM geändert werden soll dann muss als set-Wert die entsprechende englische Bezeichnung gesendet werden (Standby, Automatic, DAYmode, SetBack, DHWmode, Manual, Emergency)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sXXX&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einige weitere &amp;quot;s&amp;quot;tatus Werte die unter anderen die Wärmerückgewinnungswerte beinhalten.&lt;br /&gt;
&lt;br /&gt;
= Plots - Grafische Darstellung =&lt;br /&gt;
Nachfolgend wird gezeigt wie man aus den Readings wie sGlobal grafische Plots erstellen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Angenommen wir wollen aus sGlobal die outside_temp und die dhw_temp (dhw=domestic hot water = Warmwasser) grafisch darstellen:&lt;br /&gt;
&lt;br /&gt;
In der fhem.cfg legen wir das Plot an:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Plot_Temp SVG FileLog_Mythz:thz:CURRENT&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Plot_Temp room Heizung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraufhin wird das Plot erzeugt, noch ohne Daten und evtl. mit einer Fehlermeldung.&lt;br /&gt;
Hier klicken wir dann auf den Plot-Namen um in das Plot-Konfigurationsfenster zu kommen.&lt;br /&gt;
Hier tragen wir die entsprechenden Daten ein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig sind nun die Input-Felder&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unterhalb der Eingabemaske befinden sich die zu Mythz gehörenden Readings die verwendet werden können. Darunter auch sGlobal.&lt;br /&gt;
&lt;br /&gt;
Das sGlobal wird in etwa so aussehen:&lt;br /&gt;
:&amp;lt;code&amp;gt;2014-03-02_13:07:49 Mythz sGlobal: outside_temp: 3.8 flow_temp: 26.5 return_temp: 27.2 hot_gas_temp: 32.1 dhw_temp: 43.4 flow_temp_HC2: -60 evaporator_temp: 5.3 condenser_temp: 27.4 Mixer_open: 0 Mixer_closed: 0 HeatPipeValve: 0 DiverterValve: 0 DHW_Pump: 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Thzplot.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
Um den richtigen Input zu finden, zählen wir die durch Leerzeichen getrennten Daten ab. Somit ist der Wert der outside_temp an Stelle 5, die dhw_temp an Stelle 13.&lt;br /&gt;
Diese Zahl tragen wir dann im Input-Feld ein und schon haben wir einen Plot der Daten erzeugt.&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zu [http://www.fhemwiki.de/wiki/Plots_erzeugen Plots]&lt;br /&gt;
&lt;br /&gt;
= einzelne Werte aus den Readings=&lt;br /&gt;
Um einzelne Werte aus den großen Readings wie sGlobal oder history zu bekommen, kann man ein &lt;br /&gt;
&lt;br /&gt;
userReading verwenden.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Mythz userReadings AussenTemp {(split &#039; &#039;,ReadingsVal(&amp;quot;Mythz&amp;quot;,&amp;quot;sGlobal&amp;quot;,0))[1]}, &lt;br /&gt;
&lt;br /&gt;
VorlaufTemp {(split &#039; &#039;,ReadingsVal(&amp;quot;Mythz&amp;quot;,&amp;quot;sGlobal&amp;quot;,0))[3]}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zu userReadings in der [http://fhem.de/commandref_DE.html CommandRef]&lt;br /&gt;
&lt;br /&gt;
= Hinweise =&lt;br /&gt;
* Ein kompletter Refresh aller Werte wird nur beim Systemstart von FHEM gemacht. Dies geschieht sehr langsam um die Performance nicht zu beeinträchtigen. Erst nachdem dieser Refresh (dauert ca. 3-4 Minuten) gelaufen ist, wird das interne Polling gestartet.&lt;br /&gt;
*Wenn das Refresh Intervall kürzer oder gleich ist wie der initiale Refresh kann es zu einer Überschneidung kommen was allerdings kein Problem sein sollte.&lt;br /&gt;
*Im Wintermodus kommt roomSetTemp (sHC1) von p01RoomTempDayHC1 und p02RoomTempNightHC1   &lt;br /&gt;
*Im Sommermodus kommt roomSetTemp (sHC1) von p01RoomTempDayHC1SummerMode und p02RoomTempNightHC1SummerMode&lt;br /&gt;
&lt;br /&gt;
= Bekannte Probleme =&lt;br /&gt;
Im FHEM Log tauchen bei Ser2Net Verbindung häufig folgende Meldungen auf:&lt;br /&gt;
:&amp;lt;code&amp;gt;2014.03.02 09:41:09 1: 192.168.178.50:2003 disconnected, waiting to reappear&lt;br /&gt;
2014.03.02 09:41:09 1: 192.168.178.50:2003 reappeared (Mythz)&amp;lt;/code&amp;gt;&lt;br /&gt;
Dieses Problem ist aktuell nicht gelöst.&lt;br /&gt;
&lt;br /&gt;
= Release History =&lt;br /&gt;
&#039;&#039;&#039;v0.067&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Erstmalige Implementierung in FHEM&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.068&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
neuer Befehl f. Party implementiert&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.069&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deutsche CommandRef hinzugefügt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.070&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BugFix in Status Bits&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.071&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bugfix, undefFn verbessert&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.072&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Alle programHC1*, programHC2*, programFan* und programDHW* sind nun mit &amp;quot;get&amp;quot; und &amp;quot;set&amp;quot; implementiert&lt;br /&gt;
* inside_temp  wurde am Ende von allFB hinzugefügt&lt;br /&gt;
* der Ser2Net connect/disconnet Bug wurde eingedämmt auf max 1 Logeintrag pro Sekunde&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.074&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jetzt sind auch die Lüfterdurchsatzmengen und die Passivkühlung ausgelesen und änderbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.075&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
interval_last10errors implementiert. Intervall, in dem der Fehlerspeicher ausgelesen werden soll&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.076&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bugfixes und neuer Parameter Status_HC1_F4&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.078&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
neue Parameter Status_Sol_16 und Status_DHW_F3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.080&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* neue Parameter p49SummerModeTemp und p50SummerModeHysteresis&lt;br /&gt;
* Status_HC1_F4 und Status_HC2_F5 zeigen nun &amp;quot;mode: Summer&amp;quot; (oder Winter)&lt;br /&gt;
Die Berechnung des Modus ist wie folgt:&lt;br /&gt;
:&amp;lt;code&amp;gt; if outsidetemp &amp;gt; p49SummerModeTemp + p50SummerModeHysteresis ---&amp;gt; Summermode&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt; if outsidetemp &amp;lt; p49SummerModeTemp - p50SummerModeHysteresis ---&amp;gt; Wintermode&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.081&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BugFix für Sommer/Wintermodus-Anzeige&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.084&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* OperatingMode wird nun ausgelesen (read-only)&lt;br /&gt;
* p33BoosterTimeoutDHW (read/write)&lt;br /&gt;
* p79BoosterTimeoutHC (read/write)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.085&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
OperatingMode kann jetzt auch geaendert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.087&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Neue Readings&lt;br /&gt;
* Angepasste Readingnamen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.089&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Kommunikation wurde stabilisiert&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Neue Readings&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.091&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neue Readings: sHeatRecoveredDay &amp;amp; sHeatRecoveredTotal&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.094&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bugfixes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.095&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neue Readings: sHeatDHWDay &amp;amp; sHeatDHWTotal&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.096&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Weitere neue Readings: sEletrx... &amp;amp; sHeat...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.097&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bugfixes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.099&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Raumeinfluss wurde in die Heizkurvengrafik eingebaut&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.100&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neue Parameter: p54MinPumpCycles, p55MaxPumpCycles, p56OutTempMaxPumpCycles, p57OutTempMinPumpCycles&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.101&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* keine neuen Features&lt;br /&gt;
* Code clean up&lt;br /&gt;
* Logs in verbose 5 implementiert&lt;br /&gt;
* buffer overflow (Verursacht von sGlobal bei LWZ 303 Firmware 3.19) gefixt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.103&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Änderung der Kommunikation. Jetzt 10x schneller&lt;br /&gt;
* Versionsinformation hinzugefügt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.104&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Delay in der Kommunikation hinzugefügt (aber immer noch 5x schneller)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.105&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Schnelleres set und get Verhalten&lt;br /&gt;
* Dauer des Update beim Start halbiert&lt;br /&gt;
* THZ Attribute können ohne Neustart geändert werden&lt;br /&gt;
* BugFix&lt;br /&gt;
* P83 hinzugefügt (DHWSetSolarTemp)&lt;br /&gt;
* Suffix bei den Temp-Werten hinzugefügt. z.B. p04DHWsetDay jetzt p04DHWsetDayTemp&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.107&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* p56 and p57 getauscht und repariert&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.108&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Party-Time wurde entfernt da nicht funktionsfähig&lt;br /&gt;
* Grouping bei &amp;quot;set programFan_Mo-Fr_0  to  08:00--20:00&amp;quot; --&amp;gt; Einzelne Tage werden automatisch gesetzt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;v0.109&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fehlerbehebung bei langen Nachrichten via Seriellem Kabel&lt;br /&gt;
&lt;br /&gt;
= Beispielkonfiguration =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Start Definition mit Ser2Net&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define Mythz THZ 192.168.111.5:2003&amp;lt;br&amp;gt;&lt;br /&gt;
attr Mythz room Sysintern&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;userReadings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:dash.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
attr Mythz userReadings AussenTemp:sGlobal {(split &#039; &#039;,ReadingsVal(&amp;quot;Mythz&amp;quot;,&amp;quot;sGlobal&amp;quot;,0))[1]}, VorlaufTemp:sGlobal {(split &#039; &#039;,ReadingsVal(&amp;quot;Mythz&amp;quot;,&amp;quot;sGlobal&amp;quot;,0))[3]}, RuecklaufTemp:sGlobal {(split &#039; &#039;,ReadingsVal(&amp;quot;Mythz&amp;quot;,&amp;quot;sGlobal&amp;quot;,0))[5]}, WWTemp:sGlobal {(split &#039; &#039;,ReadingsVal(&amp;quot;Mythz&amp;quot;,&amp;quot;sGlobal&amp;quot;,0))[9]}, KollektorTemp:sGlobal {(split &#039; &#039;,ReadingsVal(&amp;quot;Mythz&amp;quot;,&amp;quot;sGlobal&amp;quot;,0))[79]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interval Definitionen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
attr Mythz interval_sGlobal 300 &amp;lt;br&amp;gt;&lt;br /&gt;
attr Mythz interval_sHistory 28800 &amp;lt;br&amp;gt; &lt;br /&gt;
attr Mythz interval_sLast10errors 120 &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Definition von file-log und den SVG-Plots einiger Daten&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define FileLog_Mythz FileLog ./log/Mythz-%Y-%m.log Mythz&amp;lt;br&amp;gt;&lt;br /&gt;
define wal_0 SVG FileLog_Mythz:thz:CURRENT&amp;lt;br&amp;gt;&lt;br /&gt;
attr wal_0 room Heizung&amp;lt;br&amp;gt;&lt;br /&gt;
define wal_1 SVG FileLog_Mythz:thz1:CURRENT&amp;lt;br&amp;gt;&lt;br /&gt;
attr wal_1 room Heizung&amp;lt;br&amp;gt;&lt;br /&gt;
define wal_2 SVG FileLog_Mythz:thz2:CURRENT&amp;lt;br&amp;gt;&lt;br /&gt;
attr wal_2 room Heizung&amp;lt;br&amp;gt;&lt;br /&gt;
define wal_3 SVG FileLog_Mythz:thz3:CURRENT&amp;lt;br&amp;gt;&lt;br /&gt;
attr wal_3 room Heizung&amp;lt;br&amp;gt;&lt;br /&gt;
define wal_4 SVG FileLog_Mythz:thz4:CURRENT&amp;lt;br&amp;gt;&lt;br /&gt;
attr wal_4 room Heizung&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;readingsGroup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define rg_thz readingsGroup Mythz:&amp;lt;%temp_outside&amp;gt;,&amp;lt;Aussen&amp;gt;,AussenTemp Mythz:&amp;lt;%sani_supply_temp@red&amp;gt;,&amp;lt;Vorlauf&amp;gt;,VorlaufTemp Mythz:&amp;lt;%sani_return_temp@blue&amp;gt;,&amp;lt;Rücklauf&amp;gt;,RuecklaufTemp Mythz:&amp;lt;%sani_boiler_temp@BD7800&amp;gt;,&amp;lt;Wasser&amp;gt;,WWTemp Mythz:&amp;lt;%sani_solar_temp&amp;gt;,&amp;lt;Kollektor&amp;gt;,KollektorTemp&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
attr rg_thz alias Heizung Temperaturen&amp;lt;br&amp;gt;&lt;br /&gt;
attr rg_thz group THZ&amp;lt;br&amp;gt;&lt;br /&gt;
attr rg_thz room Sysintern&amp;lt;br&amp;gt;&lt;br /&gt;
attr rg_thz valueFormat { AussenTemp =&amp;gt; &#039;%1.f &amp;amp;deg;C&#039;, VorlaufTemp =&amp;gt; &#039;%1.f &amp;amp;deg;C&#039;, AussenTemp=&amp;gt; &#039;%1.f &amp;amp;deg;C&#039;, RuecklaufTemp=&amp;gt; &#039;%1.f &amp;amp;deg;C&#039;, WWTemp=&amp;gt; &#039;%1.f &amp;amp;deg;C&#039;, KollektorTemp=&amp;gt; &#039;%1.f &amp;amp;deg;C&#039; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dashboard&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define MyDashboard Dashboard&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_lockstate unlock&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_row top-center&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_showhelper 0&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_showtooglebuttons 0&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_tab1groups THZ&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_tab1name micofhem&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_tab1sorting t0c100,THZ,true,170,253&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_tabcount 1&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard dashboard_webfrontendfilter WEB&amp;lt;br&amp;gt;&lt;br /&gt;
define MyDashboard_weblink weblink htmlCode {DashboardAsHtml(&amp;quot;MyDashboard&amp;quot;)}&amp;lt;br&amp;gt;&lt;br /&gt;
attr MyDashboard_weblink room DashboardRoom&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FanSelector für die Lüftungssteuerung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define FanSelectorDay dummy&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorDay group THZ&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorDay setList 0 1 2 3 offFor60min&amp;lt;br&amp;gt;&lt;br /&gt;
attr  FanSelectorDay webCmd 0:1:2:3:offFor60min&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorDay devStateIcon 0:vent_ventilation_level_0 1:vent_ventilation_level_1 2:vent_ventilation_level_2 3:vent_ventilation_level_3&amp;lt;br&amp;gt;&lt;br /&gt;
define Notify_p07FanStageDay notify FanSelectorDay  IF ([FanSelectorDay] eq &amp;quot;offFor60min&amp;quot;) (define at_D_offFor60min at +00:59:00 set Mythz p07FanStageDay [Mythz:p07FanStageDay],set Mythz p07FanStageDay 0, setstate FanSelectorDay offFor60min) ELSE (set Mythz p07FanStageDay $EVENT)&amp;lt;br&amp;gt;&lt;br /&gt;
define Notify_FanselectorDay notify (Mythz.p07FanStageDay.*) setstate FanSelectorDay $EVTPART1&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorDay room heatpump&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:fanselectorv2.png|thumb]]&lt;br /&gt;
define FanSelectorNight dummy&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorNight group THZ&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorNight setList 0 1 2 3 offFor60min&amp;lt;br&amp;gt;&lt;br /&gt;
attr  FanSelectorNight webCmd 0:1:2:3:offFor60min&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorNight devStateIcon 0:vent_ventilation_level_0 1:vent_ventilation_level_1 2:vent_ventilation_level_2 3:vent_ventilation_level_3&amp;lt;br&amp;gt;&lt;br /&gt;
define Notify_p08FanStageNight notify FanSelectorNight IF ([FanSelectorNight] eq &amp;quot;offFor60min&amp;quot;) (define at_N_offFor60min at +00:59:00 set Mythz p08FanStageNight [Mythz:p08FanStageNight],set Mythz p08FanStageNight 0, setstate FanSelectorNight offFor60min) ELSE (set Mythz p08FanStageNight $EVENT)&amp;lt;br&amp;gt;&lt;br /&gt;
define Notify_FanselectorNight notify (Mythz.p08FanStageNight.*) setstate FanSelectorNight $EVTPART1&amp;lt;br&amp;gt;&lt;br /&gt;
attr FanSelectorNight room heatpump&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
[https://launchpad.net/heatpumpmonitor Launchpad Heatpumpmonitor]&lt;br /&gt;
&lt;br /&gt;
[http://forum.fhem.de/index.php/topic,13132.0.html Forenthread im FHEM-Forum]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=7265</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=7265"/>
		<updated>2014-08-12T21:02:01Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:readingsGroup}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache zusammenfassende Darstellung von Informationen über mehrere Geräte&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=readingsGroup&lt;br /&gt;
|ModTechName=33_readingsGroup.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=430 Andre / justme1968]}}&lt;br /&gt;
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsGroup]] bietet eine einfache Möglichkeit, &#039;&#039;readings&#039;&#039; und &#039;&#039;internal values&#039;&#039; von einem oder mehreren &#039;&#039;Devices&#039;&#039; darzustellen und flexibel zu formatieren. &lt;br /&gt;
&lt;br /&gt;
Hier soll eine Sammlung von Beispielen zur Verwendung der &#039;&#039;readingsGroup&#039;&#039; mitsamt der zugehörigen Screenshots entstehen.&lt;br /&gt;
&lt;br /&gt;
== Definition == &lt;br /&gt;
Siehe commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&lt;br /&gt;
&lt;br /&gt;
=== noheading ===&lt;br /&gt;
[[Datei:ReadingsGroup_noheading.png|mini|rechts|400px|ReadingsGroup: rechts mit &amp;quot;noheading&amp;quot; Attribut, links der anklickbare Titel]]&lt;br /&gt;
Das Attribut &amp;lt;code&amp;gt;noheading&amp;lt;/code&amp;gt; führt dazu, dass der Alias der ReadingsGroup nicht mehr als Titel angezeigt wird. Das kann wünschenswert sein, wenn die ReadingsGroup auf einer [[Dashboard]]-Seite angezeigt werden soll, hat allerdings den Nachteil, dass die Detail-Ansicht der ReadingsGroup nicht mehr über einen Klick auf den Titel aufgerufen werden kann. Der Einstellungsdialog der ReadingsGroup ist dann nur noch (z.&amp;amp;nbsp;B.) über&lt;br /&gt;
* einen &amp;quot;Probably associated with&amp;quot;-Link eines anderen Objekts oder über&lt;br /&gt;
* manuelle Modifikation der URL eines anderen Objekts (&amp;lt;code&amp;gt;http:.../fhem?detail=&amp;lt;objektname&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
erreichbar.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie in Fhemweb, in der command box oder nach Klick auf DEF eingegeben werden. Beim manuellen Einfügen in eine [[Konfiguration|Konfigurationsdatei]] sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
=== Einfache Auswahl über Reading-Namen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define battStatus readingsGroup .*:[Bb]attery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;Battery&#039;&#039;&#039; oder &#039;&#039;&#039;battery&#039;&#039;&#039; von allen Devices. &lt;br /&gt;
| rowspan=3 | [[Datei:rgBattery.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr battStatus alias FHT Batteriestatus &amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias wird als Zeilentitel verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr battStatus mapping %ROOM &amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;Mapping %ROOM&#039;&#039; führt dazu, dass der Raumname als Zeilentitel angezeigt wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Auswahl über Reading-Namen, Status als Symbol dargestellt ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_battery readingsGroup .*:battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;battery&#039;&#039;&#039; von allen Devices. &lt;br /&gt;
| rowspan=4 | [[Datei:rgBattery2.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery alias Batteriestatus &amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias wird als Überschrift verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Statt der reading Werte &amp;quot;ok&amp;quot; und &amp;quot;low&amp;quot; soll ein Icon angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr rg_battery commands { &amp;quot;battery.low&amp;quot; =&amp;gt; &amp;quot;set %DEVICE replaceBatteryForSec 60&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für LaCrosse devices kann man beim Klick auf ein rotes &amp;quot;battery low icon&amp;quot; direkt replaceBatteryForSec setzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reading-Werte zuordnen (Icon / Text) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg readingsGroup Contact.Dachboden_gross:sensed.*&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle sensedreadings des Contact.Dachboden_gross device. &lt;br /&gt;
| rowspan=4 | [[Datei:rgFenster.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg mapping { &#039;sensed.A&#039; =&amp;gt; &#039;links&#039;, &#039;sensed.B&#039; =&amp;gt; &#039;rechts&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung rechts/links&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg valueFormat {($VALUE eq &#039;1&#039;)?&amp;quot;fts_window_roof&amp;quot;:&amp;quot;fts_window_roof_open_2&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung von reading Wert zu Icon Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery valueIcon %VALUE &amp;lt;/code&amp;gt;&lt;br /&gt;
| Statt des reading Werts soll ein Icon angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Formatvorgabe für Ausgabewerte ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define TempHygro readingsGroup TYPE=CUL_WS:temperature,humidity,dewpoint&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039;, &#039;&#039;&#039;dewpoint&#039;&#039;&#039; von allen Devices des Typs &#039;&#039;&#039;CUL_WS&#039;&#039;&#039;&lt;br /&gt;
| rowspan=4 | [[Datei:rgTemperatur.png|thumb|[[S300TH]]-Werte in einer readingsGroup]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro alias Temperatur / rel. Feuchte / Taupunkt&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias der readingsGroup wird als Überschrift verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro mapping %ALIAS&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;Mapping %ALIAS&#039;&#039; führt dazu, dass der Alias des Geräts als Zeilentitel angezeigt wird.&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro valueFormat { temperature =&amp;gt; &amp;quot;%.1f&amp;amp;amp;deg;C&amp;quot;, humidity =&amp;gt; &amp;quot;%.1f %%&amp;quot;, dewpoint =&amp;gt; &amp;quot;%.1f&amp;amp;amp;deg;C&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Formatierung der Ausgabewerte. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; &amp;quot;%&amp;quot; die in der Ausgabe erscheinen sollen, müssen verdoppelt werden!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ausgabestil (hier rechtsbündig) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Wetter readingsGroup WetterXXX:&amp;lt;%temp_temperature&amp;gt;,&amp;lt;Temperatur&amp;gt;,temperature WetterXXX:&amp;lt;%weather_humidity&amp;gt;,&amp;lt;Luftfeuchte&amp;gt;,humidity WetterXXX:&amp;lt;%weather_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den cul_RSSI Wert aller Devices die einen solchen haben anzeigen.&amp;lt;br&amp;gt; &#039;&#039;&#039;Achtung&#039;&#039;&#039;: &amp;quot;internal values&amp;quot; werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.&lt;br /&gt;
| rowspan=1 | [[Datei:rgculRSSI.png|thumb]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Values ausgeben ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI,+cul_TIME&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den cul_RSSI Wert mit der zugehörigen Zeit aller Devices die einen solchen haben anzeigen.&amp;lt;br&amp;gt; &#039;&#039;&#039;Achtung&#039;&#039;&#039;: &amp;quot;internal values&amp;quot; werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.&amp;lt;br&amp;gt;&amp;quot;Internal Values&amp;quot; werden durch das vorangestellte &#039;&#039;&#039;+&#039;&#039;&#039; (Pluszeichen) identifiziert.&lt;br /&gt;
| rowspan=1 | [[Datei:rgculRSSI2.png|thumb]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Alle Readings eines Gerätes, mit Ausnahme von... ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Systemstatus readingsGroup sysstat&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings des sysstat Device&lt;br /&gt;
| rowspan=4 | [[Datei:rgSysstat.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne state&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne readings timestamp&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus mapping {&#039;load&#039; =&amp;gt; &#039;Systemauslastung&#039;, &#039;temperature&#039; =&amp;gt; &#039;Systemtemperatur in &amp;amp;amp;deg;C&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung der reading Namen zu den Zeilentiteln&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Anzeige auf einem Floorplan ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizung readingsGroup t(1|2|3):temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Temperatur readings der Devices t1, t2 und t3&lt;br /&gt;
| rowspan=6 | [[Datei:rgHeizung.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung mapping {&#039;t1.temperature&#039; =&amp;gt; &#039;Vorlauf&#039;, &#039;t2.temperature&#039; =&amp;gt; &#039;R&amp;amp;amp;&amp;amp;uuml;cklauf&#039;, &#039;t3.temperature&#039; =&amp;gt; &#039;Zirkulation&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung der reading Namen zu den Zeilentiteln&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung nameStyle style=&amp;quot;text-align:left&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Zeilentitel linksbündig wegen floorplan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung style style=&amp;quot;font-size:20px;color:lightgray&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Großer Font und Farbe passend für den floorplan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne readings timestamp&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung valueFormat : %.1f &amp;amp;amp;deg;C&amp;lt;/code&amp;gt;&lt;br /&gt;
| Doppelpunkt zwischen Zeilentitel und Wert, eine Nachkommastelle plus Einheit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Schriftgrößen, Farben, Icons ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgVerbrauchPCA301.png|links|mini|400px|Schriftgröße, Farbe, Icons...]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Verbrauch readingsGroup TYPE=PCA301:state,power,consumption&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings state, power und consumption aller [[PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung|PCA301]] Devices mit einer Zeile pro Device. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch mapping %ROOM %ALIAS&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Raumname und der Alias werden als Zeilentitel verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch nameStyle style=&amp;quot;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Zeilentitel soll fett sein&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch style style=&amp;quot;font-size:20px&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alles in einem größeren Font&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch valueFormat {power =&amp;gt; &amp;quot;%.1f W&amp;quot;, consumption =&amp;gt; &amp;quot;%.2f kWh&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung für die power und consumption readings: eine Nachkommastelle plus Einheit.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr Verbrauch valueIcon { state =&amp;gt; &#039;%devStateIcon&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für die Dosen, die schaltbar sind, soll das anklickbare device icon gezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr Verbrauch valueStyle {($READING eq &amp;quot;power&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 40)?&#039;style=&amp;quot;color:red&amp;quot;&#039;:&#039;style=&amp;quot;color:green&amp;quot;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Wenn das power reading &amp;gt;40 ist, soll es in rot angezeigt werden, alle anderen Werte und readings in grün&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wertabhängige Farbgebung ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:TemperaturenRG.png|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
[[Datei:TemperaturenRG2.png|600px|mini|links|Andere Werte - andere Farben]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define wzTemperaturenRG readingsGroup Aussen:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity Wohnzimmer:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity Kasten_E_Geraete:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings temperatur und humidity der Devices Aussen, Wohnzimmer und Kasten_E_Geraete in einer Zeile pro Device. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG group 3. Temperaturen&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readingsGroup kommt in eine Gruppe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG noheading 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| noheading&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| nostate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| notime&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG valueFormat {temperature =&amp;gt; &amp;quot;%.1f °C&amp;quot;, humidity =&amp;gt;&amp;quot;%.1f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung für die temperatur und humidity readings: eine Nachkommastelle plus Einheit.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr wzTemperaturenRG valueStyle { if($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 30) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 20) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 5) { &#039;style=&amp;quot;color:blue&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 23) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 21) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 20) { &#039;style=&amp;quot;color:blue&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Kasten_E_Geraete&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 30) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Kasten_E_Geraete&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 28) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($READING eq &amp;quot;humidity&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 65) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($READING eq &amp;quot;humidity&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 60) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}else{&#039;style=&amp;quot;color:green&amp;quot;&#039;} }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Farbkombinationen sind möglich&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Enigma Receiver ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:ReceiverRG.jpg|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
[[Datei:ReceiverRGmute.jpg|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define wzReceiverRG readingsGroup wzReceiver:,&amp;lt;Aktuell&amp;gt;,eventtitle,&amp;lt;Rest&amp;gt;,eventremaining_hr,&amp;lt;Dauer&amp;gt;,eventduration_hr wzReceiver:&amp;lt;Beschreibung&amp;gt;,eventdescription wzReceiver:,&amp;lt;Nächste&amp;gt;,eventtitle_next,&amp;lt;Start&amp;gt;,eventstart_next_hr,&amp;lt;Dauer&amp;gt;,eventduration_next_hr wzReceiver:,&amp;lt;HDD Kapazität&amp;gt;,hdd1_capacity,&amp;lt;Frei&amp;gt;,wzReceiver:hdd1_free wzReceiver:,&amp;lt;Lautstärke&amp;gt;,volume,&amp;lt;HDD&amp;gt;,hdd1_capacity,&amp;lt;Frei&amp;gt;,hdd1_free&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mehrere readings des Device wzReceiver in mehreren Zeilen. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke, mute angezeigt. Farbige Anzeige des freien Speicherplatzes&lt;br /&gt;
&#039;&#039;&#039;Benötigt:&#039;&#039;&#039; ENIGMA2 Receiver, 70_ENIGMA2.pm - Siehe: [[Enigma2 Receiver (Dreambox, VUplus etc.) steuern]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG group Fernseher Receiver&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readingsGroup kommt in eine Gruppe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG mapping &amp;amp;amp;nbsp;&amp;lt;/code&amp;gt;&lt;br /&gt;
| mapping wird auf &amp;amp;amp;nbsp; (Leerzeichen) gesetzt, damit der Device Name nicht angezeigt wird&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG noheading 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| noheading&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| nostate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| notime&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG valueColumns { eventdescription =&amp;gt; &#039;colspan=&amp;quot;4&amp;quot;&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Beschreibung soll über 4 Spalten gehen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG valueFormat { wzReceiverRGvalueFormat($DEVICE,$READING,$VALUE);; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung wird in die 99_myUtils.pm ausgelagert. Siehe: [[99 myUtils anlegen]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr wzReceiverRG valueStyle { if($READING eq &amp;quot;hdd1_free&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 200){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }elsif( $READING eq &amp;quot;hdd1_free&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 500 ){ &#039;style=&amp;quot;color:orange&amp;quot;&#039; }elsif( $READING eq &amp;quot;volume&amp;quot; &amp;amp;&amp;amp; ReadingsVal($DEVICE, &amp;quot;mute&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot; ){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }else{ &#039;style=&amp;quot;color:green&amp;quot;&#039; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Farbkombinationen sind möglich. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;mute&amp;lt;/span&amp;gt; angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 sub wzReceiverRGvalueFormat($$$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING,$VALUE) = @_;&lt;br /&gt;
 &lt;br /&gt;
   if($READING eq &#039;hdd1_capacity&#039;) { &lt;br /&gt;
     return &amp;quot;%.2f MB&amp;quot;;&lt;br /&gt;
   } elsif( $READING eq &#039;hdd1_free&#039;) {&lt;br /&gt;
     return &amp;quot;%.2f MB&amp;quot;;&lt;br /&gt;
   } elsif( $READING eq &#039;volume&#039; ) {&lt;br /&gt;
     if( ReadingsVal($DEVICE, &amp;quot;mute&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
       return &amp;quot;mute&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       return &amp;quot;%i %%&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte inklusive Batterie- und Fensterstatus ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung3.png|thumb|links|500px|Heizungswerte inklusive Batterie- und Fensterstatus]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt; &amp;gt;,&amp;lt;Act&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt; TYPE=FHT:actuator,desired-temp,measured-temp,&amp;lt;%18&amp;gt;,&amp;lt;%20&amp;gt;,&amp;lt;%22&amp;gt;,window,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;FHT&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte commands { &#039;Heizungswerte.18&#039; =&amp;gt; &#039;set $DEVICE desired-temp 18&#039;, &#039;Heizungswerte.20&#039; =&amp;gt; &#039;set $DEVICE desired-temp 20&#039;, &#039;Heizungswerte.22&#039; =&amp;gt; &#039;set $DEVICE desired-temp 22&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Links/Kommandos die hinter den 18, 20 und 22 liegen sollen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte inklusive Ventilposition ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:Rg_Heizung_Valveposition.png|thumb|links|500px|Heizungswerte inklusive Statusinformationen (MAX!)]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt;Ventil&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt;,&amp;lt;MaxV&amp;gt;,&amp;lt;GID&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Batterie&amp;gt; type=CUL_HM:ValvePosition,desired-tempe,measured-temp,R-valveMaxPos,groupid,mode,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;MAX&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte mapping %ROOM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Raumnamen werden angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb (fett) sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte room Heizung&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die &amp;quot;readingsgroup&amp;quot; wird dem Raum &amp;quot;Heizung&amp;quot; zugeordnet.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueFormat {temperature =&amp;gt; &amp;quot;%.0f °C&amp;quot;, desiredTemperature =&amp;gt; &amp;quot;%.0f °C&amp;quot;, valveposition =&amp;gt;&amp;quot;%.0f %%&amp;quot;,maxValveSetting =&amp;gt;&amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Es wird noch die Einheit °C hinter den Temperaturwerten angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriezustand werden Icons anstatt Klartextwerte genommen!&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueStyle { if($READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 20){ &#039;style=&amp;quot;color:green;;font-weight:bold&amp;quot;&#039; }elsif( $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 20 ){ &#039;style=&amp;quot;color:blue&amp;quot;&#039; }elsif( $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 23 ){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }else{ &#039;style=&amp;quot;color:gray&amp;quot;&#039; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Temperaturwerte werden abhängig vom Wert farbig dargestellt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte, Status und Regelmöglichkeit ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung2.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte2 readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt; &amp;gt;,&amp;lt;Act&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt; TYPE=FHT:actuator,desired-temp,measured-temp,&amp;lt;{myUtils_HeizungUpDown($DEVICE,&amp;quot;up&amp;quot;)}@desired-temp&amp;gt;,desired-new,&amp;lt;{myUtils_HeizungUpDown($DEVICE,&amp;quot;down&amp;quot;)}@desired-temp&amp;gt;,window,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;FHT&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 valueStyle {($VALUE eq &amp;quot;00&amp;quot;)?&#039;style=&amp;quot;visibility:hidden&amp;quot;&#039;:&#039;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nach dem Einstellen den Wert wieder ausblenden. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings aus zusätzlichen Devices ===&lt;br /&gt;
Im folgenden Beispiel wird gezeigt wie sich Readings zusätzlicher Devices zu einer Zeile mit mehreren Readings hinzufügen lassen. Diese zusätzlichen Devices können z.b. die unterschiedlichen Channel eines HomeMatic Gerätes sein. Im folgenden Beispiel wird der Name des zugehörigen Geräts dynamisch bestimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung4.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, dass der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
[[Datei:rgPCA-detail.png|mini|400px|readingsGroup mit Link]]&lt;br /&gt;
Das PCA301 Beispiel oben lässt sich mit einem ans Ende des define angehängten &lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;{appendTrigger($DEVICE,&amp;quot;clear&amp;quot;,&amp;quot;Alle löschen&amp;quot;)}&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
und der folgenden appendTrigger Definition in 99_myUtils.pm um einen Link erweitern, der ein Event auslöst, an das z.B. ein notify gehängt werden kann, um die Verbrauchszähler der PCA301 Dosen zurückzusetzen. &lt;br /&gt;
:&amp;lt;code&amp;gt;define clearVerbrauch notify Verbrauch:clear set TYPE=PCA301 clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;use vars qw($FW_ME);&lt;br /&gt;
use vars qw($FW_subdir);&lt;br /&gt;
sub&lt;br /&gt;
appendTrigger($$$)&lt;br /&gt;
{&lt;br /&gt;
  my ($name,$trigger,$label) = @_; &lt;br /&gt;
&lt;br /&gt;
  my $ret .= &amp;quot;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $link = &amp;quot;cmd=trigger $name $trigger&amp;quot;;&lt;br /&gt;
  my $txt = &amp;quot;&amp;lt;a onClick=\&amp;quot;FW_cmd(&#039;$FW_ME$FW_subdir?XHR=1&amp;amp;$link&#039;)\&amp;quot;&amp;gt;$label&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  $ret .= &amp;quot;&amp;lt;td colspan=\&amp;quot;99\&amp;quot;&amp;gt;&amp;lt;div style=\&amp;quot;cursor:pointer;color:#888888;text-align:right\&amp;quot;&amp;gt;$txt&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return ($ret,0);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für &#039;custom links und trigger&#039; findet sich im  [http://forum.fhem.de/index.php/topic,14425.msg109383.html#msg109383 Forum]: dort wird damit eine readingsGroup dynamisch umgeschaltet, um nur die eingeschalteten, nur die ausgeschalteten oder alle Lampen anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
In der Regel werden die Parameter zu einem reading in den mappings unter &amp;lt;$DEVICE&amp;gt; und dann &amp;lt;$DEVICE&amp;gt;.&amp;lt;$READING&amp;gt; und dann unter &amp;lt;$READING&amp;gt;.&amp;lt;$VALUE&amp;gt; gesucht.&lt;br /&gt;
&lt;br /&gt;
===Lesbar machen===&lt;br /&gt;
Für die meisten Attribute gilt:&lt;br /&gt;
&lt;br /&gt;
*Wenn es komplexer wird ist es einfacher den Code in eine sub in 99_myUtils auszulagern und diese aufzurufen:&lt;br /&gt;
 &amp;lt;code&amp;gt; attr &amp;lt;name&amp;gt; valueStyle {myValueToFormat($READING,$VALUE)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*code für unterschiedliche readings kann man auch im mapping schon aufteilen:&lt;br /&gt;
 &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; valueStyle { SuperE5 =&amp;gt; &#039;{perl code}&#039;, Diesel =&amp;gt; &#039;{perl code}&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:&lt;br /&gt;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
===group===&lt;br /&gt;
Wenn der doppelte Rahmen um eine readingsGroup in eine group  stört, lässt er sich mit dem passenden style entfernen: &lt;br /&gt;
 &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; style style=&amp;quot;border:0px;background:none;box-shadow:none&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ZHK&amp;diff=7264</id>
		<title>ZHK</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ZHK&amp;diff=7264"/>
		<updated>2014-08-12T21:01:35Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- {{SEITENTITEL:ZentralHeizKessel}}  --&amp;gt;&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Dieses Modul ist noch Entwicklung&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef= ---- noch nicht Teil von FHEM ----&lt;br /&gt;
|ModTechName=98_ZHK.pm&lt;br /&gt;
|ModOwner=epsrw1}}&lt;br /&gt;
&lt;br /&gt;
Das Fhem-Modul [[ZHK|ZentralHeizKessel (ZHK)]] bietet die Möglichkeit, einen Zentralheizkessel mit Vorlauf, Vorlaufmischer/Rücklaufanhebung, Warmwasserspeicher+Ladepumpe zu steuern. &lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039; &amp;lt;u&amp;gt;umfassende Parametereinstellung&amp;lt;/u&amp;gt; &#039;&#039;&#039; &lt;br /&gt;
* alle Modulteile können einzeln eingestellt oder deaktiviert werden&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039; &amp;lt;u&amp;gt;derzeit enthaltene interne Module&amp;lt;/u&amp;gt; &#039;&#039;&#039; &lt;br /&gt;
* VorlaufRegler: Heizkurvenberechnung und/oder Zusatzmodule berücksichtigen&lt;br /&gt;
* VorlaufZeitschaltplan: Wochenplaner für VL-Absenkung nach Zeiten&lt;br /&gt;
* AussentempRegler: zuschaltbare Aussentemp.Option&lt;br /&gt;
* HolzofenRegler: Temperatursprung-Erkennung für Kaminofen um VL frühzeitig anzupassen&lt;br /&gt;
* automatische Vorlauf-Totalabschaltung&lt;br /&gt;
* WarmWasserRegler: Temperatursturzerkennung (sofortiges Nachheizen bei großer Entnahme)&lt;br /&gt;
* WwZeitschaltplan: Wochenplaner für die Temp.-Voreinstellung nach Zeiten&lt;br /&gt;
* Warmwasser: manuelle Einstellung Eco/Confort/Gradzahl&lt;br /&gt;
* WarmWasser Kochprogramm über Wochenplaner &lt;br /&gt;
* KesselRegler: Einstellen der optimalen Kesseltemp. nach WarmWasser, Vorlauf, Brennertakt, VL/RL-Differenztemperatur&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;u&amp;gt;Global&amp;lt;/u&amp;gt;&lt;br /&gt;
 * jedes Untermodul kann mit attr abgeschaltet bzw. deaktiviert bzw. auf null gesetzte werden&lt;br /&gt;
 * Timer-Einstellung für Zeitspanne bis zur nächsten periodischen Neuberechnung der Werte&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;u&amp;gt;Vorlauf&amp;lt;/u&amp;gt;&lt;br /&gt;
* Vorlauf(allgemein) führt Vorlauf-Untermodule zusammen&lt;br /&gt;
* komplett frei konfigurierbare Parameter für lineare Heizkurve (über attr)&lt;br /&gt;
* Vorlauf: Heizkurve nach Außentemperatur&lt;br /&gt;
* Vorlauf: Nachjustierung nach Mischerposition&lt;br /&gt;
* Vorlauf: Nachjustierung nach VL/RL-Differenz&lt;br /&gt;
* Vorlauf: Nachregulierung über valvePosition falls Thermostat-Daten vorhanden&lt;br /&gt;
* Vorlauf: Abschaltung nach Außentemperatur-Limit&lt;br /&gt;
* Vorlauf: Abschaltung wenn Temperatursprung durch Holzofen erkannt&lt;br /&gt;
* integrierter Wochenzeitplan für timergesteuerte Erhöhung/Absenkung&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;u&amp;gt;Kessel&amp;lt;/u&amp;gt;&lt;br /&gt;
* Grundeinstellung mit klassischer Heizkurve nach aktueller Außentemperatur (kann abgeschaltet werden)&lt;br /&gt;
* Totalabschaltung nach aktueller Außentemperatur&lt;br /&gt;
* Mindest-Temp nach Diff zu aktueller Warmwasser-Temperatur&lt;br /&gt;
* Mindest-Temp nach Diff zu aktueller Vorlauf-Temperatur&lt;br /&gt;
* Anpassung mit Rechenfaktor zu aktueller Vorlauf-Rücklauf Differenztemperatur&lt;br /&gt;
* Anpassung mit Rechenfaktor zu aktueller Mischer-Position&lt;br /&gt;
* Schlußkontrolle Sicherheitseinstellungen (attr) absoluteMax und absoluteMin &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;u&amp;gt;Warmwasser&amp;lt;/u&amp;gt;&lt;br /&gt;
* vordefinierte Temperaturen für Eco und Confort Modus&lt;br /&gt;
* manuelle Temp.Einstellung über fhem jederzeit möglich&lt;br /&gt;
* manuelle Temp.Einstellung wird beim nächsten Zeitschaltplan automatisch auf Auto zurückgesetzt&lt;br /&gt;
* integrierter Wochenzeitplan für timergesteuerte Temperatureinstellung&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;u&amp;gt;Valvepositions&amp;lt;/u&amp;gt;&lt;br /&gt;
* Nachregulierung Vorlauf über valvePositions&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;u&amp;gt;TaktOpt&amp;lt;/u&amp;gt;&lt;br /&gt;
* Auswertung Brennertakt, häufige Starts vermeiden durch dynamische Nachregelung des Kesseltemp-Thresholds&lt;br /&gt;
* zhkBrennerAlwasTriggerWw: attr um automatisch bei Brennerstart die Ww-Ladepumpe zu starten&lt;br /&gt;
&lt;br /&gt;
== Zeitpläne ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Zeitplan-Syntax&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;einzelner Wochentag oder * für alle&amp;gt; &amp;lt;Zeitplan in text kodiert&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiele&amp;lt;/u&amp;gt;&lt;br /&gt;
* für den Warmwasser-Timer werden feste Temperatureinstellungen angegeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;Fr 00:00=30|05:00=35|08:00=30|17:00=35|22:00=30|23:00=20&amp;lt;/code&amp;gt;&lt;br /&gt;
* zur programmierten Uhrzeit wird die Ww-Temp- automatisch eingestellt.&lt;br /&gt;
 &lt;br /&gt;
* für den Vorlauf-Timer werden Diff.Temperaturen angegeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;* 01:00=-3|04:00=2|07:00=-1|17:00=1|22:00=-1|23:00=-2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Elektrische Anschlüsse ==&lt;br /&gt;
&lt;br /&gt;
die von FHEM mit dem modul ZHK gesteuerten Lastrelais werden in Reihe mit den sicherheitsrelevanten Teilen der Heizung geschaltet (zB. Sicherheitsabschaltung Überhitzung). Dabei sind die Anschlüsse so vorgesehen, dass die Relais im Ruhezustand durchleiten. Falls FHEM einmal nicht laufen sollte, läuft der Heizkessel mit Maximaltemperatur weiter bis die Steuerung neugestartet wurde.&lt;br /&gt;
Im aktuellen Modulumfang sind folgende Elektrischen Anschlussmöglichkeiten an der Heizung enthalten:&lt;br /&gt;
&lt;br /&gt;
* BrennerStop&lt;br /&gt;
* Warmwasser-Ladepumpe&lt;br /&gt;
* Warmwasser-Boost (übergehen der Max.Temp.)&lt;br /&gt;
* VorlaufPumpe Aus/An&lt;br /&gt;
* Mischermotor zB.: [http://www.fhemwiki.de/wiki/Mischersteuerung]&lt;br /&gt;
* Thermometer Kessel&lt;br /&gt;
* Thermometer Kessel(2nd backup)&lt;br /&gt;
* Thermometer Warmwasser&lt;br /&gt;
* Thermometer Vorlauf&lt;br /&gt;
* Thermometer Rücklauf&lt;br /&gt;
* Thermometer Referenzraum Holzofen&lt;br /&gt;
* Thermometer Außentemperatur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Elektrische Anschlüsse am Kessel dürfen nur von Fachleuten durchgeführt werden. Lebensgefahr durch Stromschlag!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; ZHK &amp;lt;startverzögerung&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
der wert &amp;lt;startverzögerung&amp;gt; gibt an, wie viele Sekunden ZHK wartet bevor die Berechnung startet. Empfohlen sind ca.120 Sekunden; damit auch langsame devices wie zb. OW thermometer über Ethernet genug Zeit haben, werte zu liefern.&lt;br /&gt;
&lt;br /&gt;
Um die Wirkung und Funktionsweise des Moduls auszuprobieren, bietet sich an, mehrere &#039;&#039;&#039;Dummys&#039;&#039;&#039; zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define zhkBrennerFhemDev dummy&lt;br /&gt;
&lt;br /&gt;
define zhkWwPumpFhemDev dummy&lt;br /&gt;
&lt;br /&gt;
define zhkWwBoostFhemDev dummy&lt;br /&gt;
&lt;br /&gt;
define zhkVorlaufPumpOffFhemDev dummy&lt;br /&gt;
&lt;br /&gt;
define zhkVorlaufMischerFhemDev dummy&lt;br /&gt;
&lt;br /&gt;
define zhkVorlaufTempTriggerFhemDev dummy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* zhkVorlaufTempTriggerFhemDev ist bewusst ausgelagert als FhemDev, hier kann entweder ein notify oder eigenes dev oder zB PID20 oder eine bereits bestehende Hardware-Temperaturregelung eingebunden werden&lt;br /&gt;
&lt;br /&gt;
* Um alle Einstellmöglichkeiten auf Standardwerte Grundeinzustellen kann das Kommando SetAttribs verwendet werden. Bereits bestehende Einstellungen werden dabei nicht überschrieben.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; SetAttribs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Der Wochenplan für die Vorlaufabsenkung kann mit dem befehl vltimer eingestellt werden. Die Syntax ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; vltimer &amp;lt;Mo|Di|Mi|Do|Fr|Sa|So|*&amp;gt; &amp;lt;04:00=0|08:30=-3|17:00=0|22:00=-3&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Achtung: bei set &amp;quot;*&amp;quot; werden alle Tage auf einmal überschrieben!&lt;br /&gt;
&lt;br /&gt;
* Der Wochenplan für die Warmwassertemperatur kann mit dem befehl wwtimer eingestellt werden. Die Syntax ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; wwtimer &amp;lt;Mo|Di|Mi|Do|Fr|Sa|So|*&amp;gt; &amp;lt;04:00=45|08:30=30|17:00=45|22:00=30&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Achtung: bei set &amp;quot;*&amp;quot; werden alle Tage auf einmal überschrieben!&lt;br /&gt;
&lt;br /&gt;
* Die Warmwassertemperatur kann jederzeit mit FHEM manuell eingestellt werden. Beim nächsten Zeitplan-Punkt geht die Temperatur automatisch wieder auf den vorprogrammierten Wert.&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; zhkWwSollTemp &amp;lt;Eco|Confort| gradzahl &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Eco und Confort sind Standardtemperaturen die über Attr voreingestellt werden können.&lt;br /&gt;
&lt;br /&gt;
== Set ==&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; &amp;lt;command&amp;gt; &amp;lt;option&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* zhkWwSollTemp: 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,Eco,Confort &lt;br /&gt;
* SetAttribs &lt;br /&gt;
* vorlauf: 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,auto &lt;br /&gt;
* vltimer +string&lt;br /&gt;
* wwtimer +string&lt;br /&gt;
&lt;br /&gt;
== Get ==&lt;br /&gt;
:&amp;lt;code&amp;gt;get &amp;lt;name&amp;gt; &amp;lt;command&amp;gt; &amp;lt;option&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extracted usage of get command: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* zhkHolzofenTempSensorTimestamp &lt;br /&gt;
* zhkWwPriorityOn &lt;br /&gt;
* zhkBrennerActualState &lt;br /&gt;
* autocontrol &lt;br /&gt;
* zhkAussenTempYesterday &lt;br /&gt;
* state &lt;br /&gt;
* zhkKesselActualMischerAnhebung &lt;br /&gt;
* zhkWwBetriebsmodus &lt;br /&gt;
* zhkAussenTempAlarmThreshold &lt;br /&gt;
* zhkAussenTempAlarmTempLimit &lt;br /&gt;
* zhkWwBoostStatus &lt;br /&gt;
* zhkWwIstTempVal &lt;br /&gt;
* zhkAussenTempIsWarmState &lt;br /&gt;
* zhkWwSollTemp &lt;br /&gt;
* zhkHolzofenState &lt;br /&gt;
* zhkKesselActualVLRLAnhebung &lt;br /&gt;
* zhkAussenTempYesterdayMax &lt;br /&gt;
* zhkVorlaufTotalOnOffState &lt;br /&gt;
* zhkAussenTempDelayCache &lt;br /&gt;
* zhkWwAlphaActualVal &lt;br /&gt;
* zhkVorlaufActualTempVL &lt;br /&gt;
* looptime &lt;br /&gt;
* zhkWwPumpStopStatus &lt;br /&gt;
* zhkKesselDesiredTemp &lt;br /&gt;
* zhkKesselState &lt;br /&gt;
* zhkBrennerLogLastStateChange &lt;br /&gt;
* zhkWwIstLastReading &lt;br /&gt;
* zhkBrennerLaststart &lt;br /&gt;
* zhkVorlaufState &lt;br /&gt;
* zhkKesselActualVLRLdiff &lt;br /&gt;
* zhkWwIstTempTimestamp &lt;br /&gt;
* zhkAussenTempYesterdayMin &lt;br /&gt;
* zhkHolzofenTempHistoryCache &lt;br /&gt;
* zhkWwTimerLastSetValue &lt;br /&gt;
* zhkWwPumpLaststart &lt;br /&gt;
* zhkVorlaufDesiredTemp &lt;br /&gt;
* zhkVorlaufMischerPosActualPosition &lt;br /&gt;
* zhkKesselActualTemp &lt;br /&gt;
* zhkHolzofenAlphaActualVal &lt;br /&gt;
* zhkBrennerLogLastStopDauer &lt;br /&gt;
* zhkHolzofenTempSensorActValue &lt;br /&gt;
* zhkAussenTempActualVal &lt;br /&gt;
* zhkHolzofenResetLowTemp &lt;br /&gt;
* zhkVorlaufTimerTempAdjust &lt;br /&gt;
* zhkAussenTempTodayMax &lt;br /&gt;
* zhkVorlaufActualTempRL &lt;br /&gt;
* attrHelp: zhkBrennerTaktMinOnSec,zhkAussenTempMaxAge,zhkVorlaufTempTriggerFhemDevReading,zhkVorlaufHkurveAussenMax_TH,zhkWwTaktMinOnSec,zhkGlobalIncludeWwZeischaltplan,autocontrol,zhkBrennerTaktMinOffSec,zhkGlobalIncludeVorlauf,zhkGlobalPollInterval,zhkGlobalIncludeAussentemp,zhkKesselAbsoluteMaxTemp,zhkKesselTempMaxReadingAge,zhkAussenTempFhemDevReadingFallback,zhkWwTimerScheduleSo,zhkVorlaufPumpOffFhemDev,zhkHolzofenAlphaUpAlarmDiffDeg,zhkAussenTempFhemDevFallback,zhkAussenTempIgnoreIfFhemDev,zhkWwAlphaThreshold,zhkHolzofenIgnoreTempIfFhemDev,zhkVorlaufTimerScheduleSo,zhkKesselTempSecondFhemDevReading,zhkAussenTempAlarmThreshold,zhkHolzofenTempSensorMinAge,zhkVorlaufTimerScheduleDo,zhkAussenTempAlarmTempLimit,zhkWwTimerScheduleMi,zhkVorlaufMischerPosFhemDevReading,zhkWwTimerScheduleMo,zhkVorlaufMischerPosFhemDev,zhkVorlaufHkurveVorlaufMin_TL,zhkGlobalIncludeKessel,zhkWwTempSensorMaxAge,zhkVorlaufHkurveAussenMin_TL,zhkWwTempSensorFhemDev,zhkHolzofenResetLowFhemDev,zhkWwBoostStartTemp,zhkHolzofenTempSensorFhemDev,zhkAussenTempFhemDevReading,zhkGlobalIncludeVorlaufZeischaltplan,zhkKesselTempFhemDev,zhkHolzofenTempSensorReading,zhkWwTimerScheduleDi,zhkWwTempSensorDefaultOnFailure,zhkWwAlphaUpAlarmDiffDeg,zhkGlobalIncludeValvePositions,zhkWwTimerScheduleFr,zhkVorlaufTimerScheduleMo,zhkHolzofenTempSensorDefaultOnFailure,zhkHolzofenResetLowFhemDevreading,zhkKesselVLRLdiffErhFaktor,zhkAussenTempAlarmDelay,zhkWwBoostFhemDev,zhkKesselTempSecondFhemDev,zhkKesselMinDiffVorlauf,zhkHolzofenAlphaThreshold,zhkGlobalIncludeHolzofen,zhkVorlaufTimerScheduleSa,zhkVorlaufTimerScheduleFr,zhkKesselThreshold,zhkVorlaufTotalOnOffMischerDelay,zhkAussenTempIsWarmState,zhkVorlaufRLTempFhemDevReading,zhkKesselTempFhemDevReading,zhkWwTimerScheduleDo,zhkVorlaufTimerScheduleDi,zhkVorlaufVLTempFhemDevReading,zhkVorlaufRLTempFhemDev,zhkKesselMinDiffWw,zhkVorlaufTempTriggerFhemDevSetting,zhkWwAlphaDownAlarmDiffDeg,zhkBrennerFhemDev,zhkVorlaufTimerScheduleMi,zhkKesselAbsoluteMinTemp,zhkWwTempSensorReading,zhkWwEcoTemp,zhkKesselMischerErhFaktor,zhkGlobalIncludeWarmwasser,zhkVorlaufMischerFhemDev,zhkVorlaufTempTriggerFhemDev,zhkAussenTempFhemDev,zhkWwPumpFhemDev,zhkVorlaufVLTempFhemDev,zhkVorlaufHkurveVorlaufMax_TH,zhkWwTimerScheduleSa,zhkVorlaufIgnoreIfFhemDev,zhkHolzofenResetLowTemp,zhkWwConfortTemp,autocontrol &lt;br /&gt;
* readingsHelp: zhkHolzofenTempSensorTimestamp,zhkWwPriorityOn,zhkBrennerActualState,autocontrol,zhkAussenTempYesterday,zhkVorlaufHkurveCalcFaktor,zhkKesselActualMischerAnhebung,zhkWwBetriebsmodus,zhkBrennerLogLastStartDauer,zhkWwBoostStatus,zhkWwIstTempVal,zhkAussenTempTodayMin,zhkWwSollTemp,zhkHolzofenState,zhkKesselActualVLRLAnhebung,zhkAussenTempYesterdayMax,zhkVorlaufTotalOnOffState,zhkAussenTempDelayCache,zhkWwAlphaActualVal,zhkVorlaufActualTempVL,zhkWwPumpStopStatus,zhkKesselDesiredTemp,zhkKesselState,zhkVorlaufTotalOnOffReqTimeOff,zhkWwIstLastReading,zhkBrennerLogLastStateChange,zhkVorlaufState,zhkBrennerLaststart,zhkGlobalAutoGeneratedReadings,zhkWwIstTempTimestamp,zhkKesselActualVLRLdiff,zhkAussenTempYesterdayMin,zhkHolzofenTempHistoryCache,zhkWwTimerLastSetValue,zhkVorlaufManual,zhkWwPumpLaststart,zhkVorlaufDesiredTemp,zhkVorlaufMischerPosActualPosition,zhkKesselActualTemp,zhkAussenTempActualTimestamp,zhkHolzofenAlphaActualVal,zhkBrennerLogLastStopDauer,zhkHolzofenTempSensorActValue,zhkVorlaufTimerTempAdjust,zhkAussenTempActualVal,zhkAussenTempTodayMax,zhkVorlaufActualTempRL, &lt;br /&gt;
* all: ,Aussen,Brenner,Global,Holzofen,Kessel,Vorlauf,VorlaufTimer,Ww,WwTimer &lt;br /&gt;
* zhkWwiki: get,set,readings,attr &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Readings == &lt;br /&gt;
Alle Readings sind auch in fhem durch das Kommando get readingsHelp &amp;lt;varname&amp;gt; erklärt, für das &amp;quot;schnelle nachschauen zwischendurch&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|- &lt;br /&gt;
! Reading !! (Typ) Default !! Beschreibung &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenTempSensorTimestamp|| (string) 0 || timestamp last OW update &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwPriorityOn|| (int) 0 || wenn 1, dann brenner sofort starten &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerActualState|| (int) 0 || burner state 0=off 1=on &lt;br /&gt;
|- &lt;br /&gt;
| autocontrol|| (int) 30 || initial delay after fhem start before ZHK starts running, needed to wait for temp sensors or other slow devices &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempYesterday|| (float) 0 || cache of yesterday&#039;s date &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufHkurveCalcFaktor|| (float) 1.16 || erhöhungsfaktor heizkurve &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselActualMischerAnhebung|| (float) 0 || cached actual kessel temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwBetriebsmodus|| (string) Unbekannt || wird über SET eingestellt: Eco | Confort (zb. mit at plan) &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerLogLastStartDauer|| (int) 0 || cache zeitstempel für log betriebsstunden &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwBoostStatus|| (string) off || zeigt aktuellen status 1=warmwasser temperaturbegrenzer überbrückt &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwIstTempVal|| (float) 0 || OW lesen, wenn fehler dann default MAX &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempTodayMin|| (float) 0 || aussentemp today&#039;s minimum temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwSollTemp|| (int) 30 || einstellung User (zeitplan mit at möglich) &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenState|| (int) 0 || actual calc result 0|1 &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselActualVLRLAnhebung|| (float) 0 || cached actual kessel temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempYesterdayMax|| (float) 0 || aussentemp yesterday&#039;s maximum temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTotalOnOffState|| (int) 1 || status VL totalabschaltung 1=pump on   0=all off &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempDelayCache|| (string) 0=22334455 || cache für trägheit aussentemp last-temp=timestamp &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwAlphaActualVal|| (float) 0 || zuletzt berechneter wert für alpha &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufActualTempVL|| (float) 0 | VL readErr || cached actual vorlauf temperature &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwPumpStopStatus|| (string) off || zeigt aktuellen status 1=warmwasser ladepumpe gestoppt 0=aufheizen &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselDesiredTemp|| (int) 35 || aktuelle soll-temp kessel &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselState|| (string) 0 || actual kessel State (BURN=brenner an, hot=max.temp erreicht idle=innerh.threshold) xx °C) &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTotalOnOffReqTimeOff|| (float) 0 || internal cache for zhkVorlaufTotalOnOffMischerDelay &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwIstLastReading|| (string) 0 || cached last OW temp for alpha-calc &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerLogLastStateChange|| (int) 0 || cache zeitstempel für log betriebsstunden &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufState|| (int) 0 || actual vorlauf state (auto manual disabled off °C) &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerLaststart|| (int) 0 || brenner cached last start timestamp &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalAutoGeneratedReadings|| (string) 0 || alert if readings were not present in statefile at start &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwIstTempTimestamp|| (string) 0 || timestamp last OW update &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselActualVLRLdiff|| (float) 0 || cached actual kessel temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempYesterdayMin|| (float) 0 || aussentemp yesterday&#039;s minimum temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenTempHistoryCache|| (string) 20=11223344 20=11225566 || cached last 2 temp readings &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerLastSetValue|| (int) 0 || last Ww desired temp set by timer function &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufManual|| (int) 0 || cached manual setting fixed temp if &amp;gt;0 &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwPumpLaststart|| (int) 0 || zeitstempel lester start warmwasser ladepumpe &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufDesiredTemp|| (float) 20 || calculated desired vorlauf temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufMischerPosActualPosition|| (int) 0 || heizkreis-mischer actual position &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselActualTemp|| (float) 0 || cached actual kessel temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempActualTimestamp|| (float) 0 || timestamp of last aussentemp value &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenAlphaActualVal|| (float) 0 || zuletzt berechneter wert für alpha (./zhkHolzofenTempSensorMinAge &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerLogLastStopDauer|| (int) 0 || cache zeitstempel für log betriebsstunden &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenTempSensorActValue|| (float) 0 || actual temp of sensor in holzofen room &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerTempAdjust|| (int) 0 || wird in VL zu desired-t addiert &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempActualVal|| (float) 0 || actual aussentemp sensor temperature value &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempTodayMax|| (float) 0 || aussentemp today&#039;s maximum temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufActualTempRL|| (float) 0 | RL readErr || cached actual rücklauf temperature &lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes == &lt;br /&gt;
Alle Attributes sind auch in fhem durch das Kommando get attrHelp &amp;lt;varname&amp;gt; erklärt, für&#039;s &amp;quot;schnelle nachschauen zwischendurch&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|- &lt;br /&gt;
! Attribute !! (Typ) Default !! Beschreibung &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerTaktMinOnSec|| (int) 300 || brenner delay before set off after on-command &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerAlwasTriggerWw|| (int) 1 || 1= always trigger Ww pump when burn starts &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempMaxAge|| (int) 1200 || max age of out-temp reading timestamp before ignore &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTempTriggerFhemDevReading|| (string) desired || evtl.PID20 oder Notify-FhemDev für Mischeransteuerung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufHkurveAussenMax_TH|| (int) 15 || max.wert für heizkurvenberechnung &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTaktMinOnSec|| (int) 60 || delay before off when WwPump started &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeWwZeischaltplan|| (int) 1 || enable warmwasser timer module &lt;br /&gt;
|- &lt;br /&gt;
| autocontrol|| (int) 30 || initial delay after fhem start before ZHK starts running, needed to wait for temp sensors or other slow devices &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerTaktMinOffSec|| (int) 30 || delay before set on &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeVorlauf|| (int) 1 || enable vorlauf (general) module &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalPollInterval|| (int) 10 || internal loop interval for recalc, increase if cpu load is too high &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeAussentemp|| (int) 1 || enable aussentemp module &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselAbsoluteMaxTemp|| (int) 70 || sicherheit falls rechenprobleme &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselTempMaxReadingAge|| (int) 600 || max age of kessel temp reading, if too old device is not present or has error -&amp;gt;log alert &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempFhemDevReadingFallback|| (string) state || fhem dev reading aussentemp second (fallback or dummy) &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerScheduleSo|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufPumpOffFhemDev|| (string) P6_PumpOff || FhemDev das Vorlauf stromzufuhr pumpe kappt &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenAlphaUpAlarmDiffDeg|| (float) 3 || min.diff für abschaltung hot &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempFhemDevFallback|| (string) dummyOnlineWeatherTemp || fhem device aussentemp second (fallback or dummy) &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempIgnoreIfFhemDev|| (string) dummyDisableAussentemp || while state if this fhem device is true, disable aussentemp-calc temporarily &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwAlphaThreshold|| (float) 0.42 || Meßtoleranz ww-temp °C &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenIgnoreTempIfFhemDev|| (string) dummyDisableHolzofen || zb. Window shutter, do not trigger if FhemDev state is true &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerScheduleSo|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselTempSecondFhemDevReading|| (string) temperature || device reading kesseltemperatur backup-device &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempAlarmThreshold|| (float) 1 || Mindestabweichung vom schaltpunkt für umschaltung &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenTempSensorMinAge|| (int) 300 || recalc alpha after seconds &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerScheduleDo|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempAlarmTempLimit|| (float) 16 || grundeinstellung AT schaltpunkt °C &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerScheduleMi|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufMischerPosFhemDevReading|| (string) position || heizkreis-mischer device reading für position &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerScheduleMo|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufMischerPosFhemDev|| (string) MischerPosition || heizkreis-mischer fhem device &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufHkurveVorlaufMin_TL|| (int) 20 || min.wert für heizkurvenberechnung &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeKessel|| (int) 1 || enable kessel regler module &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTempSensorMaxAge|| (int) 300 || sensor ignorieren wenn state-age &amp;gt; x seconds &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufHkurveAussenMin_TL|| (int) -20 || min.wert für heizkurvenberechnung &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTempSensorFhemDev|| (string) 5_15_WarmWasser_EB6F98050000 || fhem device to read the temperature from &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenResetLowFhemDev|| (string) Heizg_Wohnzimmer1 || fhem device to read reset-low temp from &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwBoostStartTemp|| (int) 45 || temp. ab der die umgehung notwendig ist &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenTempSensorFhemDev|| (string) 83_WohnZi_9554CD040000 || fhem device to read the temperature from &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempFhemDevReading|| (string) temperature || fhem dev reading aussentemp &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeVorlaufZeischaltplan|| (int) 1 || enable vorlauf timer module &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselTempFhemDev|| (string) 4_14_Kessel_E3CD97050000 || fhem device kesseltemperatur &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenTempSensorReading|| (string) temperature || name of reading with float temp value &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerScheduleDi|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTempSensorDefaultOnFailure|| (int) 70 || default temp to assume if temp-sensor fails &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwAlphaUpAlarmDiffDeg|| (float) 5 || min.diff zu abschaltung hot für AlphaUp &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeValvePositions|| (int) 1 || enable valve position correction module &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerScheduleFr|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerScheduleMo|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenTempSensorDefaultOnFailure|| (int) 20 || temp.default if sensor fail &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenResetLowFhemDevreading|| (string) desiredTemperature || fhem device reading to read reset-low temp from &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselVLRLdiffErhFaktor|| (float) 0 || erhöhungsfaktor: gewichtung VL-RL-diff für kesseltemp.einstellung &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempAlarmDelay|| (int) 600 || Trägheit AT schaltung seconds &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwBoostFhemDev|| (string) P2_WwBoost || relais um analoge temperaturbegrenzug zu übergehen &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselTempSecondFhemDev|| (string) 0 || fhem device kesseltemperatur backup-device &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselMinDiffVorlauf|| (int) 10 || min.diff Vorlauf-Soll/Kessel-Min-Soll &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenAlphaThreshold|| (float) 0.07 || Meßtoleranz temp °C &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeHolzofen|| (int) 1 || enable holzofen detection module &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerScheduleSa|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerScheduleFr|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselThreshold|| (int) 5 || zulässige temp.schwankung kessel &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTotalOnOffMischerDelay|| (string) 150 || delay to wait for mischer calibrate before VL off &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempIsWarmState|| (int) 0 || actual state, 1=warm 0=cold &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufRLTempFhemDevReading|| (string) temperature || fhem device reading, rücklauf temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselTempFhemDevReading|| (string) temperature || device reading kesseltemperatur &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerScheduleDo|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerScheduleDi|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufVLTempFhemDevReading|| (string) temperature || fhem device reading, vorlauf temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufRLTempFhemDev|| (string) 2_12_Ruecklauf_56B897050000 || fhem device name, rücklauf temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselMinDiffWw|| (int) 8 || min.diff Ww-Soll/Kessel-Min-Soll &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTempTriggerFhemDevSetting|| (string) desired || evtl.PID20 oder Notify-FhemDev für Mischeransteuerung &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwAlphaDownAlarmDiffDeg|| (float) 0.8 || mindest-temp-diff für sofort-aufheizung &lt;br /&gt;
|- &lt;br /&gt;
| zhkBrennerFhemDev|| (string) P3_BrennerStop || brennerschalter, 0=burn 1=off &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTimerScheduleMi|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselAbsoluteMinTemp|| (int) 30 || sicherheit falls rechenprobleme &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTempSensorReading|| (string) temperature || name of reading with float temp value &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwEcoTemp|| (float) 37 || tempvoreinstellung Eco-Modus &lt;br /&gt;
|- &lt;br /&gt;
| zhkKesselMischerErhFaktor|| (float) 0 || erhöhungsfaktor: gewichtung mischerposition für kesseltemp.einstellung &lt;br /&gt;
|- &lt;br /&gt;
| zhkGlobalIncludeWarmwasser|| (int) 1 || enable warmwasser module &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufMischerFhemDev|| (string) VorlaufMischer || zb STELLMOTOR FhemDev oder anderes Ventil &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufTempTriggerFhemDev|| (string) VorlaufRegler || evtl.PID20 oder Notify-FhemDev für Mischeransteuerung &lt;br /&gt;
|- &lt;br /&gt;
| zhkAussenTempFhemDev|| (string) 81_Aussen_D745CE040000 || fhem device aussentemp &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwPumpFhemDev|| (string) P7_WwStop || WW pumpe, 0=on / 1=off &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufVLTempFhemDev|| (string) 1_17_Vorlauf_D1F798050000 || fhem device name, vorlauf temp &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufHkurveVorlaufMax_TH|| (int) 50 || max.wert für heizkurvenberechnung &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwTimerScheduleSa|| (string) 0 || schaltpunkte für wochentagsplanung &lt;br /&gt;
|- &lt;br /&gt;
| zhkVorlaufIgnoreIfFhemDev|| (string) dummyDisableVorlauf || while state if this fhem device is true, disable vorlauf(general)-calc temporarily &lt;br /&gt;
|- &lt;br /&gt;
| zhkHolzofenResetLowTemp|| (float) 18 || temp für reset des state auf 0 (if no FhemDev) &lt;br /&gt;
|- &lt;br /&gt;
| zhkWwConfortTemp|| (int) 31 || tempvoreinstellung Confort-Modus &lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,24021.0.html Thread im Forum], in dem dieses Modul vorgestellt wurde&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
== Request for Help ==&lt;br /&gt;
Jegliche zusätzliche Erklärung die über die - zugegeben etwas technisch orientierte- Grundfassung dieses Artikels hinausgeht, ist herzlich willkommen. &lt;br /&gt;
Bitte einfach den &amp;quot;Bearbeiten&amp;quot; Link oben anklicken und eigene Texte ungefragt einfügen. Dankeschön!&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_und_FritzBox_7490&amp;diff=7263</id>
		<title>FHEM und FritzBox 7490</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_und_FritzBox_7490&amp;diff=7263"/>
		<updated>2014-08-12T20:57:07Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FHEM auf der Fritz!Box 7490 wird von AVM mit Firmware-Version 113.06.05 unterstützt. Es werden damit die Treiber (Kernelmodule) für USB Geräte wie CUL und EUL sowie verschiedene Dienste bereitgestellt, die FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
== AVM Firmware mit FHEM ==&lt;br /&gt;
FHEM selbst ist als so genannte Labor-Firmware von AVM &#039;&#039;zusätzlich&#039;&#039;zur Basis-Firmware zu installieren und verändert die Versionsnummer nicht. Die AVM Variante kann über updatefhem auf den aktuellen Stand nachgerüstet werden. Sie hat allerdings den Nachteil, dass FHEM in einer chroot Umgebung läuft, damit sind die Funktionen der Fritz!Box nicht direkt zugreifbar. &lt;br /&gt;
&lt;br /&gt;
Die aktuellen Labor-Images können [http://www.avm.de/de/Service/Service-Portale/Labor/index.php hier] bezogen werden.&lt;br /&gt;
&lt;br /&gt;
== Community Firmware mit FHEM  ==&lt;br /&gt;
Eine etwas schlankere Variante von FHEM mit der Möglichkeit des direkten Zugriffs auf die Fritz!Box Funktionen steht unter [http://fhem.de/fhem-5.5-fb7390.image] zur Verfügung. Das IMAGE ist zwar für die FB 7390 gedacht, kann aber auch für die aktuellste FritzBox genutzt werden. (Alternative Images unter www.fhem.de/Download)&lt;br /&gt;
&lt;br /&gt;
Auch diese Firmware-Image lässt sich über die Funktion &amp;quot;Firmware-Update&amp;quot; der Fritz!Box installieren:&lt;br /&gt;
&lt;br /&gt;
* Menüpunkt System/Firmware-Update, dort den Reiter Firmware-Datei auswählen.&lt;br /&gt;
* Die passende Datei auswählen und mit &amp;quot;Update starten&amp;quot; bestätigen.&lt;br /&gt;
* Nach kurzer Zeit meldet sich die Fritz!Box mit der Warnung: &amp;quot;Die angegebene Datei enthält keine von AVM für dieses Gerät freigegebene Firmware.&amp;quot;&lt;br /&gt;
* Hier mit &amp;quot;Update fortsetzen&amp;quot; bestätigen. Die Firmware wird installiert, der Vorgang schließt mit dem Neustart der Fritz!Box ab.&lt;br /&gt;
* Anschließend steht FHEM im Webbrowser unter &amp;quot;fritz.box:8083/fhem&amp;quot;, und im Telnet Fenster unter &amp;quot;telnet fritz.box 7072&amp;quot; (Vorausgesetzt ist das Telenet zuvor aktiviert wurde) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
* [http://service.avm.de/support/de/SKB/FRITZ-Box-7490 AVM Support FAQ]&lt;br /&gt;
* [ftp://ftp.avm.de/fritz.box/fritzbox.7490/ AVM Firmware Repository]&lt;br /&gt;
&lt;br /&gt;
== FB7490 einrichten - detaillierte Schritte ==&lt;br /&gt;
Sollten die o.g. Beschreibungen nicht ausreichen, hier eine detaillierte Beschreibung von Dirk070 aus dem Forum für die FB 7290 (siehe&lt;br /&gt;
[http://forum.fhem.de/index.php/topic,13337.msg82461.html#msg82461 hier])&lt;br /&gt;
&lt;br /&gt;
== FB7390 fhem als root ==&lt;br /&gt;
Im fhem Verzeichnis startfhem in startfhem_orig oder ähnlich umbenennen. Dann die Datei startfhemAsRoot in startfhem umbenennen, Fritzbox neu starten und schon startet fhem als Root.&amp;lt;br&amp;gt;&lt;br /&gt;
Sollten diese Schritte nicht reichen, dann nach [[FritzBox Parameter in fhem anzeigen#Wichtig|dieser Anleitung]] vorgehen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FritzBox]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=PID20_-_Der_PID-Regler&amp;diff=7262</id>
		<title>PID20 - Der PID-Regler</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=PID20_-_Der_PID-Regler&amp;diff=7262"/>
		<updated>2014-08-12T20:56:01Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;PID20&#039;&#039;&#039; ist ein Modul, das nach dem P-I-D Algorithmus einen Regler realisiert.&lt;br /&gt;
&lt;br /&gt;
== Projekt-Status ==&lt;br /&gt;
&lt;br /&gt;
Das Modul ist seit dem 26.03.2014 Bestandteil von FHEM.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* einstellbarer Bewertungs-/Berechnungszyklus&lt;br /&gt;
* Überwachung des Istwert-Gebers über dessen Zeitstempel (Sensorausfall)&lt;br /&gt;
* Skalierbarkeit der Ausgabehäufigkeit an das Stellglied über Zeit und Mindeständerung&lt;br /&gt;
* Zwangsausgabe an das Stellglied nach Ablauf eines einstellbaren Zeitintervalls&lt;br /&gt;
* Notstellung des Stellgliedes, falls Istwert-Geber ausgefallen ist&lt;br /&gt;
* Begrenzung des Stellbereichs nach oben und unten&lt;br /&gt;
* Festlegung der Nachkommastellen (0..5) des Ausgabewertes zum Stellglied&lt;br /&gt;
* Festlegen einer minimalen Regelabweichung, ab der der Regler aktiv wird&lt;br /&gt;
* Festlegen des Reading-Namens für den Sollwert&lt;br /&gt;
* Festlegen des Reading-Namens für den Istwert&lt;br /&gt;
* Invertierung des Reglerwirksinns&lt;br /&gt;
* Festlegen der minimalen Aktualisierungsrate der Readings&lt;br /&gt;
* Festlegen der Proportionalitätskonstanten P,I,D&lt;br /&gt;
== Thread im Forum ==&lt;br /&gt;
[http://forum.fhem.de/index.php/topic,17067.msg111615.html#msg111615 Diskussion zu PID20 im Forum]&lt;br /&gt;
&lt;br /&gt;
=== Define ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  define &amp;lt;name&amp;gt; PID20 sensor[:reading[:regexp]] actor:cmd &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Wertebereich !! Default !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|pidActorValueDecPlaces||[0..5]||0||Anzahl der Nachkommastellen für Ausgabewert zu Aktor&lt;br /&gt;
|-&lt;br /&gt;
|pidActorInterval||uint||180||minimale Wartezeit in Sekunden, bis eine neue Ausgabe an das Stellglied erfolgen kann&lt;br /&gt;
|-&lt;br /&gt;
|pidActorThreshold||uint||1||Notwendige minimale Änderung zum Altwert der Stellgliedausgabe, damit diese erneut erfolgt&lt;br /&gt;
|-&lt;br /&gt;
|pidActorErrorAction||[freeze, errorPos]||freeze||legt das Verhalten der Ausgabe zum Stellglied fest, wenn der Istwert nicht innerhalb von &amp;lt;pidSensorTimeout&amp;gt; aktualisiert wurde (Sensor-Ausfall) &amp;lt;br /&amp;gt;&lt;br /&gt;
freeze: Position des Stellgliedes beibehalten&amp;lt;br /&amp;gt;&lt;br /&gt;
ErrorPos: Position anfahren, die unter Attribut &amp;lt;pidActorErrorPos&amp;gt; angegeben ist.&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|pidActorErrorPos||int||0||Diese Position ist einzunehmen, wenn pidActorErrorAction auf errorPos steht und der Istwert-Geber ausgefallen ist.&lt;br /&gt;
|-&lt;br /&gt;
|pidActorKeepAlive||uint||1800||Spätestens nach dieser Zeit erfolgt eine Zwangsausgabe an das Stellglied&lt;br /&gt;
(wenn PID nicht disabled und nicht stopped)&lt;br /&gt;
|-&lt;br /&gt;
|pidActorLimitLower||float||0||untere Begrenzung für das Stellglied&lt;br /&gt;
|-&lt;br /&gt;
|pidActorLimitUpper||float||100||obere Begrenzung für das Stellglied&lt;br /&gt;
|-&lt;br /&gt;
|pidCalcInterval||uint||60||Berechnungszyklus in Sekunden, nach dem die PID-Berechnung durchgeführt wird.&lt;br /&gt;
|-&lt;br /&gt;
|pidDeltaTreshold||pos. float||0||wenn die Regeldifferenz(delta) kleiner als pidDeltaThreshold, dann wird der Regler eingefroren (state=idle)&lt;br /&gt;
|-&lt;br /&gt;
|pidDesiredName||string||desired||Name für das Reading, das den Sollwert für den Regler aufnehmen soll&lt;br /&gt;
|-&lt;br /&gt;
|pidMeasuredName||string||measured||Name für das Reading, das den Istwert für den Regler aufnehmen soll&lt;br /&gt;
|-&lt;br /&gt;
|pidSensorTimeout||uint||3600||Zeitlimit in Sekunden, nach dessen Überschreitung der Ausfall des Istwert-Gebers anzunehmen ist&lt;br /&gt;
|-&lt;br /&gt;
|pidReverseAction||[0,1]||0||Umgekehrter Wirksinn des Reglers&lt;br /&gt;
|-&lt;br /&gt;
|pidUpdateInterval||uint||300||Zeitlimit in Sekunden, nach der ein Zwangsupdate der Readings erfolgen muss (Kurvendarstellung).&lt;br /&gt;
|-&lt;br /&gt;
|pidFactor_P||pos. float||25||Proportionalitätskonstante für P-Anteil&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|pidFactor_I||pos. float||0.25||Proportionalitätskonstante für I-Anteil&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|pidFactor_D||pos. float||0||Proportionalitätskonstante für D-Anteil&lt;br /&gt;
|-&lt;br /&gt;
|disable||[0,1]||0||Freigabe/Sperren des Reglers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Setter ===&lt;br /&gt;
&#039;&#039;&#039;desired&#039;&#039;&#039;&lt;br /&gt;
* Funktion: Sollwert einstellen&lt;br /&gt;
* Name des Setters kann vom Anwender über das Attribute &amp;quot;pidDesiredName&amp;quot; definiert werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;start&#039;&#039;&#039;&lt;br /&gt;
* PID nimmt den Betrieb wieder auf, es werden P-, I- und D-Anteil vor dem Stop übernommen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;stop&#039;&#039;&#039;&lt;br /&gt;
* PID geht in den Zustand stopped; alles wird praktisch eingefroren&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;restart&#039;&#039;&#039;&lt;br /&gt;
* arbeitet zunächst wie Start, jedoch gibt man an, mit welchen Prozentwert der Stellausgang anfangs stehen soll&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
[[Datei:13 10 20 Pid readings.png]]&lt;br /&gt;
* actuation liefert den tatsächlichen Ausgabewert an das Stellglied&lt;br /&gt;
* actuationCalc liefert den internen Rechenwert des Ausgabewertes für das Stellglied(ohne Begrenzung)&lt;br /&gt;
* delta, die aktuelle Regeldifferenz&lt;br /&gt;
* desired (Name ist variabel), der Sollwert&lt;br /&gt;
* measured (Name ist variabel), der aktuelle Wert vom Istwert-geber&lt;br /&gt;
* p_p, der P-Anteil des Ausgabewertes für das Stellglied&lt;br /&gt;
* p_i, der I-Anteil des Ausgabewertes für das Stellglied&lt;br /&gt;
* p_d, der D-Anteil des Ausgabewertes für das Stellglied&lt;br /&gt;
* state, der Betriebszustand des Reglers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;delta&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   delta = desired - measured (also Sollwert-Istwert)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;actuation&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 actuation = actuationCalc&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
jedoch begrenzt durch pidActorLimitLower und pidActorLimitUpper &lt;br /&gt;
und formatiert via pidActorValueDecPlaces&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;actuationCalc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausgabewert für das Stellglied wird wie folgt berechnet&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   actuationCalc = p_p + p_i + p_d&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;state&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! state !! Erläuterung&lt;br /&gt;
|-&lt;br /&gt;
| disabled || PID-Instanz ist inaktiv&lt;br /&gt;
|-&lt;br /&gt;
| initializing || Modul wurde initialisiert&lt;br /&gt;
|-&lt;br /&gt;
| idle || Berechnung ist inaktiv&lt;br /&gt;
|-&lt;br /&gt;
| processing || Berechnung ist aktiv, Normalbetrieb&lt;br /&gt;
|-&lt;br /&gt;
| alarm || Ausnahmezustand, z.B. Timout des Istwert-Gebers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
* PID20 definieren, hier mit HMS100TF als Istwert-Geber für die Temperatur und ein MAX-Thermostat als Stellglied; Auslegung für eine Fußbodenheizung (sehr träge)&lt;br /&gt;
&amp;lt;pre&amp;gt;define PID.FUBO PID20 DG.BAD.TF:temperature HT.FUBO:maxValveSetting&amp;lt;/pre&amp;gt;&lt;br /&gt;
:* &amp;lt;sensor&amp;gt; = &amp;quot;DG.BAD.TF&amp;quot;: Name des Istwert-Geber s (HMS100TF)&lt;br /&gt;
:* &amp;lt;reading&amp;gt; = &amp;quot;temperature&amp;quot;: das Reading vom HMS100TF, das die Temperatur liefert&lt;br /&gt;
:* &amp;lt;regexp&amp;gt; = nicht definiert, wir können also direkt den Wert des Readings verwenden&lt;br /&gt;
:* &amp;lt;actor&amp;gt; = &amp;quot;HT.FUBO&amp;quot; : Name des MAX-Thermostats, das als Stellglied verwendet wird&lt;br /&gt;
:* &amp;lt;cmd&amp;gt; = &amp;quot;maxValveSetting&amp;quot; : Das Kommando mit dem PID20 die Stellausgabe realisieren soll&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Letztlich wird mit &amp;lt;actor&amp;gt; und &amp;lt;cmd&amp;gt; Folgendes ausgeführt&lt;br /&gt;
&amp;lt;pre&amp;gt;set &amp;lt;actor&amp;gt; &amp;lt;cmd&amp;gt; &amp;lt;setting-value&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;zusätzlich noch einige Attribute anpassen&#039;&#039;&#039;&lt;br /&gt;
* die Ausgabehäufigkeit an das Stellglied auf 15 Minuten begrenzen&lt;br /&gt;
&amp;lt;pre&amp;gt;attr PID.FUBO pidActorInterval 900&amp;lt;/pre&amp;gt;&lt;br /&gt;
* nur dann einen Wert an das Stellglied ausgeben, wenn die Differenz zum Altwert &amp;gt;= 5% &lt;br /&gt;
&amp;lt;pre&amp;gt;attr PID.FUBO pidActorTreshold 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Nachommastellen für das Stellglied festlegen; MAX-Thermostate erlauben nur Werte ohne Nachkommastellen&lt;br /&gt;
&amp;lt;pre&amp;gt;attr PID.FUBO pidActorValueDecPlaces 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
* I-Faktor festlegen; Überlegung: bei einer Regelabweichung von 1 Grad, soll der I-Anteil um 0.2% pro Minute inkrementieren/dekrementieren &lt;br /&gt;
&amp;lt;pre&amp;gt;attr PID.FUBO pidFactor_I 0.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
* P-Faktor festlegen; Überlegung:Bei einer Regel-Abweichung von 1 Grad, soll der P-Anteil +/-50% betragen&lt;br /&gt;
&amp;lt;pre&amp;gt;attr PID.FUBO pidFactor_P 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Chart einrichten&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Es ist für das Einstellen der Regel-Faktoren (P,I,D) überaus hilfreich, das Verhalten über die Zeit aufzuzeichnen, um das Verhalten objektiv beurteilen zu können.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Zunächst ein Filelog einrichten&amp;lt;br/&amp;gt;&lt;br /&gt;
:define PID.PID.File FileLog ./log/PID.PID-%Y.log PID\.PID&lt;br /&gt;
:attr PID.PID.File logtype text&lt;br /&gt;
&lt;br /&gt;
Danach ein Chart definieren, angelehnt an folgendem Beispiel:&lt;br /&gt;
&lt;br /&gt;
[[Datei:13_12_03_PID_ChartDef.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anbei ein Vorschlag für au&lt;br /&gt;
&lt;br /&gt;
== Hintergrund-Informationen ==&lt;br /&gt;
=== list &amp;lt;pid-name&amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Internals:&lt;br /&gt;
   DEF        DG.BAD.TF PID.Actor:state&lt;br /&gt;
   NAME       PID.PID&lt;br /&gt;
   NR         616&lt;br /&gt;
   NTFY_ORDER 50-PID.PID&lt;br /&gt;
   STATE      processing&lt;br /&gt;
   TYPE       PID&lt;br /&gt;
   Readings:&lt;br /&gt;
     2013-10-20 17:13:41   actuation       97&lt;br /&gt;
     2013-10-20 17:21:42   actuationCalc   97.2079999999999&lt;br /&gt;
     2013-10-20 17:21:42   delta           0.199999999999999&lt;br /&gt;
     2013-10-20 17:13:41   desired         22&lt;br /&gt;
     2013-10-20 17:13:41   measured        21.8&lt;br /&gt;
     2013-10-20 17:21:42   p_d             0&lt;br /&gt;
     2013-10-20 17:21:42   p_i             92.2079999999999&lt;br /&gt;
     2013-10-20 17:21:42   p_p             4.99999999999998&lt;br /&gt;
     2013-10-20 17:21:42   state           processing&lt;br /&gt;
   Helper:&lt;br /&gt;
     actor      PID.Actor&lt;br /&gt;
     actorCommand state&lt;br /&gt;
     actorErrorAction freeze&lt;br /&gt;
     actorErrorPos 0&lt;br /&gt;
     actorInterval 300&lt;br /&gt;
     actorKeepAlive 1800&lt;br /&gt;
     actorLimitLower 0&lt;br /&gt;
     actorLimitUpper 100&lt;br /&gt;
     actorThreshold 4&lt;br /&gt;
     actorTimestamp 2013-10-20 17:13:41&lt;br /&gt;
     actorValueDecPlaces 0&lt;br /&gt;
     calcInterval 60&lt;br /&gt;
     deltaGradient 0&lt;br /&gt;
     deltaOld   0.199999999999999&lt;br /&gt;
     deltaOldTS 2013-10-20 17:18:07&lt;br /&gt;
     deltaTreshold 0&lt;br /&gt;
     desiredName desired&lt;br /&gt;
     disable    0&lt;br /&gt;
     factor_D   0&lt;br /&gt;
     factor_I   0.25&lt;br /&gt;
     factor_P   25&lt;br /&gt;
     isWindUP   0&lt;br /&gt;
     measuredName measured&lt;br /&gt;
     reading    temperature&lt;br /&gt;
     regexp     ([\d\.]*)&lt;br /&gt;
     reverseAction 0&lt;br /&gt;
     sensor     DG.BAD.TF&lt;br /&gt;
     sensorTimeout 3600&lt;br /&gt;
     updateInterval 600&lt;br /&gt;
  Attributes:&lt;br /&gt;
   pidActorInterval 300&lt;br /&gt;
   pidActorTreshold 4&lt;br /&gt;
   pidActorValueDecPlaces 0&lt;br /&gt;
   room       PID&lt;br /&gt;
   verbose    4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anti-WindUp-Strategie ===&lt;br /&gt;
Der integrale Anteil des PID-Reglers wird ohne Gegenmassnahmen auch dann weiter integriert,&lt;br /&gt;
wenn das Stellglied bereits an seine Grenzen gestossen ist.&lt;br /&gt;
Dies hat den Nachteil, dass nach einer Reduzierung der Regeldifferenz lange Wartezeiten entstehen können, bis das&lt;br /&gt;
Stellglied reagiert.&lt;br /&gt;
Dies nennt man den WindUP-Effekt.&lt;br /&gt;
Hierzu wurde die folgende Strategie entwickelt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:13 10 20 PID Windup.png|WindUP]]&lt;br /&gt;
&lt;br /&gt;
Sobald das rechnerische Stellsignal (Ventilstellung Calc=actuationCalc) die obere Grenze des Stellgliedes überschreitet (pidActorLimitUpper) oder die untere Grenze unterschreitet (pidActorLimitLower), wird die Integration des I-Anteils eingefroren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Am Beispiel:&#039;&#039;&#039;&lt;br /&gt;
An Position L1 überschreitet der rechnerische Ausgabewert des Stellgliedes die obere Grenze (100%).&lt;br /&gt;
Der I-Anteil verändert sich nicht mehr bis zur Position L2. Hier unterschreitet der Ausgabewert die &lt;br /&gt;
obere Grenze, der I-Anteil kann wieder verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Fragen und Antworten ==&lt;br /&gt;
=== Temperatur im Raum steigt nicht oder stark verzögert, was kann ich tun ? ===&lt;br /&gt;
&lt;br /&gt;
==== 1.Fehlerquelle : Heizsystem ist nicht ausreichend entlüftet ====&lt;br /&gt;
In diesem Fall behindern die Luftblasen im System den Durchfluss des Heizmediums.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Heizkörper erwärmt sich nur teilweise oder &amp;quot;gluckert&amp;quot;.&lt;br /&gt;
Hier ist das Entlüften der Heizkörper angesagt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Natürlich können sich die Gasblasen an anderer Stelle befinden. &lt;br /&gt;
Normalerweise sorgen automatische Entlüfter, dass das Gas entweichen kann.&amp;lt;br/&amp;gt;&lt;br /&gt;
Aber auch diese &amp;quot;verkalken&amp;quot; im Lauf der Zeit.&lt;br /&gt;
&lt;br /&gt;
==== 2.Fehlerquelle : Totzone beim Stellglied ====&lt;br /&gt;
Der Temperaturanstieg erfolgt erst ab einer bestimmten Ventilöffnung von xy%.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PID-Regler geht davon aus, dass jede Änderung des Stellausgangs auf die Regelgröße wirkt&amp;lt;br/&amp;gt;&lt;br /&gt;
(also bei Ventil weiter öffnen, wird mehr Wärme abgegeben)&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ist dies nicht der Fall, wird der PID über die Zeit (I-Anteil) das Ventil weiter öffnen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Allerdings vergeht hierbei Zeit und damit leidet die Regelgüte.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist also wichtig die Totzone zu ermitteln und im Attribut pidActorLimitLower zu hinterlegen.&lt;br /&gt;
&lt;br /&gt;
==== 3.Fehlerquelle : Hydraulische Fehlanpassung ====&lt;br /&gt;
Wenn einzelnen Heizkreise einen sehr kleinen hydraulischen Widerstand aufweisen, kann es passieren&lt;br /&gt;
das Heizkreise mit höherem Widerstand zeitweise unterversorgt sind.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Erst wenn die gut versorgten Heizkreise die Ventile schließen (Soll-Temperatur ist erreicht),&lt;br /&gt;
werden die Heizkreise mit hohem Widerstand ausreichend versorgt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Dies kann man dank FHEM sehr gut über die Charts nachvollziehen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Es ist regelungstechnisch, ökologisch und energetisch absolut sinnvoll geregelte Hocheffizienz-Pumpen&lt;br /&gt;
im Heizkreis einzusetzen. Diese sorgen für konstanten Druck im Hauptstrang bei sehr geringen Energiebedarf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann gezielt den hydraulischen Widerstand einzelner Thermostate erhöhen, indem man deren maximale Ventilöffnung begrenzt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies erreicht man durch Reduzieren des Wertes pidActorLimitUpper.&amp;lt;br/&amp;gt;&lt;br /&gt;
Dies ist gleichbedeutend mit der Erhöhung der hydraulischen Widerstandes durch voreinstellbare Heizungsventile beim hydraulischen Abgleich.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,15060.0.html Initialer Forumseintrag zur Überarbeitung des PID-Moduls]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Regler Wikipedia Regler]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:Regelungstechnik]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=7261</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=7261"/>
		<updated>2014-08-12T20:49:53Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:readingsGroup}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache zusammenfassende Darstellung von Informationen über mehrere Geräte&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=readingsGroup&lt;br /&gt;
|ModTechName=33_readingsGroup.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=430 Andre / justme1968]}}&lt;br /&gt;
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsGroup]] bietet eine einfache Möglichkeit, &#039;&#039;readings&#039;&#039; und &#039;&#039;internal values&#039;&#039; von einem oder mehreren &#039;&#039;Devices&#039;&#039; darzustellen und flexibel zu formatieren. &lt;br /&gt;
&lt;br /&gt;
Hier soll eine Sammlung von Beispielen zur Verwendung der &#039;&#039;readingsGroup&#039;&#039; mitsamt der zugehörigen Screenshots entstehen.&lt;br /&gt;
&lt;br /&gt;
== Definition == &lt;br /&gt;
Siehe commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&lt;br /&gt;
&lt;br /&gt;
=== noheading ===&lt;br /&gt;
[[Datei:ReadingsGroup_noheading.png|mini|rechts|400px|ReadingsGroup: rechts mit &amp;quot;noheading&amp;quot; Attribut, links der anklickbare Titel]]&lt;br /&gt;
Das Attribut &amp;lt;code&amp;gt;noheading&amp;lt;/code&amp;gt; führt dazu, dass der Alias der ReadingsGroup nicht mehr als Titel angezeigt wird. Das kann wünschenswert sein, wenn die ReadingsGroup auf einer [[Dashboard]]-Seite angezeigt werden soll, hat allerdings den Nachteil, dass die Detail-Ansicht der ReadingsGroup nicht mehr über einen Klick auf den Titel aufgerufen werden kann. Der Einstellungsdialog der ReadingsGroup ist dann nur noch (z.&amp;amp;nbsp;B.) über&lt;br /&gt;
* einen &amp;quot;Probably associated with&amp;quot;-Link eines anderen Objekts oder über&lt;br /&gt;
* manuelle Modifikation der URL eines anderen Objekts (&amp;lt;code&amp;gt;http:.../fhem?detail=&amp;lt;objektname&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
erreichbar.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie in Fhemweb, in der command box oder nach Klick auf DEF eingegeben werden. Beim manuellen Einfügen in eine [[Konfiguration|Konfigurationsdatei]] sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
=== Einfache Auswahl über Reading-Namen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define battStatus readingsGroup .*:[Bb]attery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;Battery&#039;&#039;&#039; oder &#039;&#039;&#039;battery&#039;&#039;&#039; von allen Devices. &lt;br /&gt;
| rowspan=3 | [[Datei:rgBattery.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr battStatus alias FHT Batteriestatus &amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias wird als Zeilentitel verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr battStatus mapping %ROOM &amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;Mapping %ROOM&#039;&#039; führt dazu, dass der Raumname als Zeilentitel angezeigt wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Auswahl über Reading-Namen, Status als Symbol dargestellt ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_battery readingsGroup .*:battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;battery&#039;&#039;&#039; von allen Devices. &lt;br /&gt;
| rowspan=4 | [[Datei:rgBattery2.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery alias Batteriestatus &amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias wird als Überschrift verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Statt der reading Werte &amp;quot;ok&amp;quot; und &amp;quot;low&amp;quot; soll ein Icon angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr rg_battery commands { &amp;quot;battery.low&amp;quot; =&amp;gt; &amp;quot;set %DEVICE replaceBatteryForSec 60&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für LaCrosse devices kann man beim Klick auf ein rotes &amp;quot;battery low icon&amp;quot; direkt replaceBatteryForSec setzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reading-Werte zuordnen (Icon / Text) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg readingsGroup Contact.Dachboden_gross:sensed.*&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle sensedreadings des Contact.Dachboden_gross device. &lt;br /&gt;
| rowspan=4 | [[Datei:rgFenster.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg mapping { &#039;sensed.A&#039; =&amp;gt; &#039;links&#039;, &#039;sensed.B&#039; =&amp;gt; &#039;rechts&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung rechts/links&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg valueFormat {($VALUE eq &#039;1&#039;)?&amp;quot;fts_window_roof&amp;quot;:&amp;quot;fts_window_roof_open_2&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung von reading Wert zu Icon Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery valueIcon %VALUE &amp;lt;/code&amp;gt;&lt;br /&gt;
| Statt des reading Werts soll ein Icon angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Formatvorgabe für Ausgabewerte ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define TempHygro readingsGroup TYPE=CUL_WS:temperature,humidity,dewpoint&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039;, &#039;&#039;&#039;dewpoint&#039;&#039;&#039; von allen Devices des Typs &#039;&#039;&#039;CUL_WS&#039;&#039;&#039;&lt;br /&gt;
| rowspan=4 | [[Datei:rgTemperatur.png|thumb|[[S300TH]]-Werte in einer readingsGroup]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro alias Temperatur / rel. Feuchte / Taupunkt&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias der readingsGroup wird als Überschrift verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro mapping %ALIAS&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;Mapping %ALIAS&#039;&#039; führt dazu, dass der Alias des Geräts als Zeilentitel angezeigt wird.&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro valueFormat { temperature =&amp;gt; &amp;quot;%.1f&amp;amp;amp;deg;C&amp;quot;, humidity =&amp;gt; &amp;quot;%.1f %%&amp;quot;, dewpoint =&amp;gt; &amp;quot;%.1f&amp;amp;amp;deg;C&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Formatierung der Ausgabewerte. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; &amp;quot;%&amp;quot; die in der Ausgabe erscheinen sollen, müssen verdoppelt werden!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ausgabestil (hier rechtsbündig) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Wetter readingsGroup WetterXXX:&amp;lt;%temp_temperature&amp;gt;,&amp;lt;Temperatur&amp;gt;,temperature WetterXXX:&amp;lt;%weather_humidity&amp;gt;,&amp;lt;Luftfeuchte&amp;gt;,humidity WetterXXX:&amp;lt;%weather_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den cul_RSSI Wert aller Devices die einen solchen haben anzeigen.&amp;lt;br&amp;gt; &#039;&#039;&#039;Achtung&#039;&#039;&#039;: &amp;quot;internal values&amp;quot; werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.&lt;br /&gt;
| rowspan=1 | [[Datei:rgculRSSI.png|thumb]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Values ausgeben ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI,+cul_TIME&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den cul_RSSI Wert mit der zugehörigen Zeit aller Devices die einen solchen haben anzeigen.&amp;lt;br&amp;gt; &#039;&#039;&#039;Achtung&#039;&#039;&#039;: &amp;quot;internal values&amp;quot; werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.&amp;lt;br&amp;gt;&amp;quot;Internal Values&amp;quot; werden durch das vorangestellte &#039;&#039;&#039;+&#039;&#039;&#039; (Pluszeichen) identifiziert.&lt;br /&gt;
| rowspan=1 | [[Datei:rgculRSSI2.png|thumb]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Alle Readings eines Gerätes, mit Ausnahme von... ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Systemstatus readingsGroup sysstat&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings des sysstat Device&lt;br /&gt;
| rowspan=4 | [[Datei:rgSysstat.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne state&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne readings timestamp&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus mapping {&#039;load&#039; =&amp;gt; &#039;Systemauslastung&#039;, &#039;temperature&#039; =&amp;gt; &#039;Systemtemperatur in &amp;amp;amp;deg;C&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung der reading Namen zu den Zeilentiteln&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Anzeige auf einem Floorplan ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizung readingsGroup t(1|2|3):temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Temperatur readings der Devices t1, t2 und t3&lt;br /&gt;
| rowspan=6 | [[Datei:rgHeizung.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung mapping {&#039;t1.temperature&#039; =&amp;gt; &#039;Vorlauf&#039;, &#039;t2.temperature&#039; =&amp;gt; &#039;R&amp;amp;amp;&amp;amp;uuml;cklauf&#039;, &#039;t3.temperature&#039; =&amp;gt; &#039;Zirkulation&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung der reading Namen zu den Zeilentiteln&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung nameStyle style=&amp;quot;text-align:left&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Zeilentitel linksbündig wegen floorplan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung style style=&amp;quot;font-size:20px;color:lightgray&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Großer Font und Farbe passend für den floorplan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne readings timestamp&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung valueFormat : %.1f &amp;amp;amp;deg;C&amp;lt;/code&amp;gt;&lt;br /&gt;
| Doppelpunkt zwischen Zeilentitel und Wert, eine Nachkommastelle plus Einheit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Schriftgrößen, Farben, Icons ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgVerbrauchPCA301.png|links|mini|400px|Schriftgröße, Farbe, Icons...]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Verbrauch readingsGroup TYPE=PCA301:state,power,consumption&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings state, power und consumption aller [[PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung|PCA301]] Devices mit einer Zeile pro Device. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch mapping %ROOM %ALIAS&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Raumname und der Alias werden als Zeilentitel verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch nameStyle style=&amp;quot;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Zeilentitel soll fett sein&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch style style=&amp;quot;font-size:20px&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alles in einem größeren Font&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch valueFormat {power =&amp;gt; &amp;quot;%.1f W&amp;quot;, consumption =&amp;gt; &amp;quot;%.2f kWh&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung für die power und consumption readings: eine Nachkommastelle plus Einheit.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr Verbrauch valueIcon { state =&amp;gt; &#039;%devStateIcon&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für die Dosen, die schaltbar sind, soll das anklickbare device icon gezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr Verbrauch valueStyle {($READING eq &amp;quot;power&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 40)?&#039;style=&amp;quot;color:red&amp;quot;&#039;:&#039;style=&amp;quot;color:green&amp;quot;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Wenn das power reading &amp;gt;40 ist, soll es in rot angezeigt werden, alle anderen Werte und readings in grün&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wertabhängige Farbgebung ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:TemperaturenRG.png|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
[[Datei:TemperaturenRG2.png|600px|mini|links|Andere Werte - andere Farben]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define wzTemperaturenRG readingsGroup Aussen:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity Wohnzimmer:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity Kasten_E_Geraete:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings temperatur und humidity der Devices Aussen, Wohnzimmer und Kasten_E_Geraete in einer Zeile pro Device. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG group 3. Temperaturen&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readingsGroup kommt in eine Gruppe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG noheading 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| noheading&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| nostate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| notime&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG valueFormat {temperature =&amp;gt; &amp;quot;%.1f °C&amp;quot;, humidity =&amp;gt;&amp;quot;%.1f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung für die temperatur und humidity readings: eine Nachkommastelle plus Einheit.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr wzTemperaturenRG valueStyle { if($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 30) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 20) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 5) { &#039;style=&amp;quot;color:blue&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 23) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 21) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 20) { &#039;style=&amp;quot;color:blue&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Kasten_E_Geraete&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 30) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Kasten_E_Geraete&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 28) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($READING eq &amp;quot;humidity&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 65) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($READING eq &amp;quot;humidity&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 60) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}else{&#039;style=&amp;quot;color:green&amp;quot;&#039;} }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Farbkombinationen sind möglich&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Enigma Receiver ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:ReceiverRG.jpg|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
[[Datei:ReceiverRGmute.jpg|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define wzReceiverRG readingsGroup wzReceiver:,&amp;lt;Aktuell&amp;gt;,eventtitle,&amp;lt;Rest&amp;gt;,eventremaining_hr,&amp;lt;Dauer&amp;gt;,eventduration_hr wzReceiver:&amp;lt;Beschreibung&amp;gt;,eventdescription wzReceiver:,&amp;lt;Nächste&amp;gt;,eventtitle_next,&amp;lt;Start&amp;gt;,eventstart_next_hr,&amp;lt;Dauer&amp;gt;,eventduration_next_hr wzReceiver:,&amp;lt;HDD Kapazität&amp;gt;,hdd1_capacity,&amp;lt;Frei&amp;gt;,wzReceiver:hdd1_free wzReceiver:,&amp;lt;Lautstärke&amp;gt;,volume,&amp;lt;HDD&amp;gt;,hdd1_capacity,&amp;lt;Frei&amp;gt;,hdd1_free&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mehrere readings des Device wzReceiver in mehreren Zeilen. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke, mute angezeigt. Farbige Anzeige des freien Speicherplatzes&lt;br /&gt;
&#039;&#039;&#039;Benötigt:&#039;&#039;&#039; ENIGMA2 Receiver, 70_ENIGMA2.pm - Siehe: [[Enigma2 Receiver (Dreambox, VUplus etc.) steuern]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG group Fernseher Receiver&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readingsGroup kommt in eine Gruppe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG mapping &amp;amp;amp;nbsp;&amp;lt;/code&amp;gt;&lt;br /&gt;
| mapping wird auf &amp;amp;amp;nbsp; (Leerzeichen) gesetzt, damit der Device Name nicht angezeigt wird&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG noheading 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| noheading&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| nostate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| notime&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG valueColumns { eventdescription =&amp;gt; &#039;colspan=&amp;quot;4&amp;quot;&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Beschreibung soll über 4 Spalten gehen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG valueFormat { wzReceiverRGvalueFormat($DEVICE,$READING,$VALUE);; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung wird in die 99_myUtils.pm ausgelagert. Siehe: [[99 myUtils anlegen]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr wzReceiverRG valueStyle { if($READING eq &amp;quot;hdd1_free&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 200){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }elsif( $READING eq &amp;quot;hdd1_free&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 500 ){ &#039;style=&amp;quot;color:orange&amp;quot;&#039; }elsif( $READING eq &amp;quot;volume&amp;quot; &amp;amp;&amp;amp; ReadingsVal($DEVICE, &amp;quot;mute&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot; ){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }else{ &#039;style=&amp;quot;color:green&amp;quot;&#039; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Farbkombinationen sind möglich. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;mute&amp;lt;/span&amp;gt; angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 sub wzReceiverRGvalueFormat($$$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING,$VALUE) = @_;&lt;br /&gt;
 &lt;br /&gt;
   if($READING eq &#039;hdd1_capacity&#039;) { &lt;br /&gt;
     return &amp;quot;%.2f MB&amp;quot;;&lt;br /&gt;
   } elsif( $READING eq &#039;hdd1_free&#039;) {&lt;br /&gt;
     return &amp;quot;%.2f MB&amp;quot;;&lt;br /&gt;
   } elsif( $READING eq &#039;volume&#039; ) {&lt;br /&gt;
     if( ReadingsVal($DEVICE, &amp;quot;mute&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
       return &amp;quot;mute&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       return &amp;quot;%i %%&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte inklusive Batterie- und Fensterstatus ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung3.png|thumb|links|500px|Heizungswerte inklusive Batterie- und Fensterstatus]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt; &amp;gt;,&amp;lt;Act&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt; TYPE=FHT:actuator,desired-temp,measured-temp,&amp;lt;%18&amp;gt;,&amp;lt;%20&amp;gt;,&amp;lt;%22&amp;gt;,window,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;FHT&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte commands { &#039;Heizungswerte.18&#039; =&amp;gt; &#039;set $DEVICE desired-temp 18&#039;, &#039;Heizungswerte.20&#039; =&amp;gt; &#039;set $DEVICE desired-temp 20&#039;, &#039;Heizungswerte.22&#039; =&amp;gt; &#039;set $DEVICE desired-temp 22&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Links/Kommandos die hinter den 18, 20 und 22 liegen sollen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte inklusive Ventilposition ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:Rg_Heizung_Valveposition.png|thumb|links|500px|Heizungswerte inklusive Statusinformationen (MAX!)]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt;Ventil&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt;,&amp;lt;MaxV&amp;gt;,&amp;lt;GID&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Batterie&amp;gt; type=CUL_HM:ValvePosition,desired-tempe,measured-temp,R-valveMaxPos,groupid,mode,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;MAX&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte mapping %ROOM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Raumnamen werden angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb (fett) sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte room Heizung&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die &amp;quot;readingsgroup&amp;quot; wird dem Raum &amp;quot;Heizung&amp;quot; zugeordnet.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueFormat {temperature =&amp;gt; &amp;quot;%.0f °C&amp;quot;, desiredTemperature =&amp;gt; &amp;quot;%.0f °C&amp;quot;, valveposition =&amp;gt;&amp;quot;%.0f %%&amp;quot;,maxValveSetting =&amp;gt;&amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Es wird noch die Einheit °C hinter den Temperaturwerten angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriezustand werden Icons anstatt Klartextwerte genommen!&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueStyle { if($READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 20){ &#039;style=&amp;quot;color:green;;font-weight:bold&amp;quot;&#039; }elsif( $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 20 ){ &#039;style=&amp;quot;color:blue&amp;quot;&#039; }elsif( $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 23 ){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }else{ &#039;style=&amp;quot;color:gray&amp;quot;&#039; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Temperaturwerte werden abhängig vom Wert farbig dargestellt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte, Status und Regelmöglichkeit ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung2.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte2 readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt; &amp;gt;,&amp;lt;Act&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt; TYPE=FHT:actuator,desired-temp,measured-temp,&amp;lt;{myUtils_HeizungUpDown($DEVICE,&amp;quot;up&amp;quot;)}@desired-temp&amp;gt;,desired-new,&amp;lt;{myUtils_HeizungUpDown($DEVICE,&amp;quot;down&amp;quot;)}@desired-temp&amp;gt;,window,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;FHT&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 valueStyle {($VALUE eq &amp;quot;00&amp;quot;)?&#039;style=&amp;quot;visibility:hidden&amp;quot;&#039;:&#039;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nach dem Einstellen den Wert wieder ausblenden. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings aus zusätzlichen Devices ===&lt;br /&gt;
Im folgenden Beispiel wird gezeigt wie sich Readings zusätzlicher Devices zu einer Zeile mit mehreren Readings hinzufügen lassen. Diese zusätzlichen Devices können z.b. die unterschiedlichen Channel eines HomeMatic Gerätes sein. Im folgenden Beispiel wird der Name des zugehörigen Geräts dynamisch bestimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung4.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilantriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, daß der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, dass der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
[[Datei:rgPCA-detail.png|mini|400px|readingsGroup mit Link]]&lt;br /&gt;
Das PCA301 Beispiel oben lässt sich mit einem ans Ende des define angehängten &lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;{appendTrigger($DEVICE,&amp;quot;clear&amp;quot;,&amp;quot;Alle löschen&amp;quot;)}&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
und der folgenden appendTrigger Definition in 99_myUtils.pm um einen Link erweitern, der ein Event auslöst, an das z.B. ein notify gehängt werden kann, um die Verbrauchszähler der PCA301 Dosen zurückzusetzen. &lt;br /&gt;
:&amp;lt;code&amp;gt;define clearVerbrauch notify Verbrauch:clear set TYPE=PCA301 clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;use vars qw($FW_ME);&lt;br /&gt;
use vars qw($FW_subdir);&lt;br /&gt;
sub&lt;br /&gt;
appendTrigger($$$)&lt;br /&gt;
{&lt;br /&gt;
  my ($name,$trigger,$label) = @_; &lt;br /&gt;
&lt;br /&gt;
  my $ret .= &amp;quot;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $link = &amp;quot;cmd=trigger $name $trigger&amp;quot;;&lt;br /&gt;
  my $txt = &amp;quot;&amp;lt;a onClick=\&amp;quot;FW_cmd(&#039;$FW_ME$FW_subdir?XHR=1&amp;amp;$link&#039;)\&amp;quot;&amp;gt;$label&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  $ret .= &amp;quot;&amp;lt;td colspan=\&amp;quot;99\&amp;quot;&amp;gt;&amp;lt;div style=\&amp;quot;cursor:pointer;color:#888888;text-align:right\&amp;quot;&amp;gt;$txt&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return ($ret,0);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für &#039;custom links und trigger&#039; findet sich im  [http://forum.fhem.de/index.php/topic,14425.msg109383.html#msg109383 Forum]: dort wird damit eine readingsGroup dynamisch umgeschaltet, um nur die eingeschalteten, nur die ausgeschalteten oder alle Lampen anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
In der Regel werden die Parameter zu einem reading in den mappings unter &amp;lt;$DEVICE&amp;gt; und dann &amp;lt;$DEVICE&amp;gt;.&amp;lt;$READING&amp;gt; und dann unter &amp;lt;$READING&amp;gt;.&amp;lt;$VALUE&amp;gt; gesucht.&lt;br /&gt;
&lt;br /&gt;
===Lesbar machen===&lt;br /&gt;
Für die meisten Attribute gilt:&lt;br /&gt;
&lt;br /&gt;
*Wenn es komplexer wird ist es einfacher den Code in eine sub in 99_myUtils auszulagern und diese aufzurufen:&lt;br /&gt;
 &amp;lt;code&amp;gt; attr &amp;lt;name&amp;gt; valueStyle {myValueToFormat($READING,$VALUE)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*code für unterschiedliche readings kann man auch im mapping schon aufteilen:&lt;br /&gt;
 &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; valueStyle { SuperE5 =&amp;gt; &#039;{perl code}&#039;, Diesel =&amp;gt; &#039;{perl code}&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:&lt;br /&gt;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
===group===&lt;br /&gt;
Wenn der doppelte Rahmen um eine readingsGroup in eine group  stört, lässt er sich mit dem passenden style entfernen: &lt;br /&gt;
 &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; style style=&amp;quot;border:0px;background:none;box-shadow:none&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=CUL_ueber_Netz&amp;diff=7259</id>
		<title>CUL ueber Netz</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=CUL_ueber_Netz&amp;diff=7259"/>
		<updated>2014-08-12T20:39:06Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Da bei mir [[RFR CUL]] sehr instabil lief, WLAN aber zufriedenstellend, habe ich einen Buffalo WZR-HP-G300NH mit OpenWRT Backfire (10.03.1-rc4) ausgestattet, als WLAN-Client konfiguriert und den CUL am USB-Port betrieben.&lt;br /&gt;
&lt;br /&gt;
Um den CUL als Quasi-CUN über FHEM anzusprechen, läuft folgendes Script auf dem Router: &lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 DEV=/dev/ttyACM0&lt;br /&gt;
 &lt;br /&gt;
 while (true)&lt;br /&gt;
 do&lt;br /&gt;
        /usr/bin/socat -ly -lh GOPEN:$DEV,raw,echo=0 TCP-LISTEN:2323&lt;br /&gt;
        sleep 2&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass socat in der mitgelieferten Version (1.6.0.1-2) für o.g. Zweck nicht funktioniert. Man kann aber eine neuere Version (1.7.1.3-2) von http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/ herunterladen und installieren.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration in fhem ist einfach:&lt;br /&gt;
&lt;br /&gt;
 define cul868 CUL &amp;lt;name-des-geräts&amp;gt;:2323 &amp;lt;fhtid&amp;gt;&lt;br /&gt;
 attr cul868 model CUL&lt;br /&gt;
&lt;br /&gt;
Anstelle von socat kann man im Notfall auch netcat benutzen. Dazu im Script die Zeile mit socat durch&lt;br /&gt;
&lt;br /&gt;
 netcat -l -p 2323 &amp;lt; $DEV &amp;gt;$DEV&lt;br /&gt;
&lt;br /&gt;
ersetzen. Allerdings gab es dann häufig Probleme mit der Echo-Einstellung, so dass mehrere Anläufe erforderlich waren, bis es nach einen Reboot stabil läuft. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:CUL]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Licht_dimmen_mit_Bewegungsmelder_und_Taster&amp;diff=7258</id>
		<title>Licht dimmen mit Bewegungsmelder und Taster</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Licht_dimmen_mit_Bewegungsmelder_und_Taster&amp;diff=7258"/>
		<updated>2014-08-12T20:37:56Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Aufgabe: ==&lt;br /&gt;
Ein Flurlicht soll gedimmt werden per Bewegungsmelder (FS20 PIRI) mit 50% Lichtstärke. &lt;br /&gt;
&lt;br /&gt;
Zum Schuheanziehen im Flur soll das Licht aber per Taster auf 100% geschaltet werden können. Der Bewegungsmelder springt aber nur an zwischen 7 und 20 Uhr.&lt;br /&gt;
&lt;br /&gt;
Die Schwierigkeit besteht darin, dass die z. B. minütlich kommende Meldung vom Bewegungsmelder nicht wieder auf 50% runterdimmt.&lt;br /&gt;
&lt;br /&gt;
== Script ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define flur_licht FS20 a875 10&lt;br /&gt;
attr flur_licht model fs20di&lt;br /&gt;
attr flur_licht follow-on-for-timer 1&lt;br /&gt;
#Flurlicht auf hell schalten Taster&lt;br /&gt;
define flur_s4_hell FS20 a875 62&lt;br /&gt;
define n_flur_s4_hell notify flur_s4_hell:.* { \&lt;br /&gt;
 {fhem(&amp;amp;quot;set flur_licht dim100%%&amp;amp;quot;)};;\&lt;br /&gt;
 {fhem(&amp;amp;quot;set flur_licht on-old-for-timer 120&amp;amp;quot;)};;\&lt;br /&gt;
 }&lt;br /&gt;
####Bewegungsmelder#######&lt;br /&gt;
define flur_bewegung FS20 a875 00&lt;br /&gt;
attr flur_bewegung model fs20piri&lt;br /&gt;
define n_flur_bewegung2 notify flur_bewegung:.* { \&lt;br /&gt;
 Log 3, &amp;amp;quot;@: flur_licht &amp;amp;quot;.Value(&amp;amp;quot;flur_licht&amp;amp;quot;);;\&lt;br /&gt;
 my $mzstate=Value(&amp;amp;quot;flur_licht&amp;amp;quot;);;\&lt;br /&gt;
 if ($hour &amp;amp;gt;= 7 &amp;amp;amp;&amp;amp;amp; $hour &amp;amp;lt;= 20) {\&lt;br /&gt;
  if ($mzstate eq &amp;amp;quot;off&amp;amp;quot;){\&lt;br /&gt;
   {fhem(&amp;amp;quot;set flur_licht dim50%%&amp;amp;quot;)}\&lt;br /&gt;
  }\&lt;br /&gt;
  {fhem(&amp;amp;quot;set flur_licht on-old-for-timer 120&amp;amp;quot;)}\&lt;br /&gt;
 }\&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Erläuterungen: ====&lt;br /&gt;
Taster und Bewegungsmelder schalten das Licht ein mit on-old-for-timer 120 - also für 2 Minuten auf der vorher eingestellten Helligkeit und danach schaltet der Dimmer automatisch ab.&lt;br /&gt;
&lt;br /&gt;
Um Abfragen zu können, ob die Lampe aus ist, ist der Parameter follow-on-for-timer beim Dimmer wichtig, damit der Status wie der Dimmer verhält und nach dem 2 Minuten auf off geht.&lt;br /&gt;
&lt;br /&gt;
Der Bewegungsmelder darf als nur auf die 50% schalten, wenn das licht schon aus war - ansonsten darf er nur die Einschaltzeit verlängern, damit das Licht auf 100% bleibt, solange noch jemand im Flur ist.&lt;br /&gt;
&lt;br /&gt;
Der Taster hingegen darf IMMER sofort das licht auf 100% setzen ohne Abfrage.&lt;br /&gt;
&lt;br /&gt;
Beim Bewegungsmelder kann und sollte man übrigens die Zeit bis zur nächsten Meldung sinnvoll einstellen - diese zeit muss kürzer sein als die Dauer mit der das Licht auf &amp;quot;ein&amp;quot; steht, damit das&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHT-ID_der_FHZ1300_herausfinden&amp;diff=7257</id>
		<title>FHT-ID der FHZ1300 herausfinden</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHT-ID_der_FHZ1300_herausfinden&amp;diff=7257"/>
		<updated>2014-08-12T20:35:58Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn man seine FHZ1300PC (oder andere FHZ1X00 Zentralen) durch [[CUL]] ersetzen möchte und keine Lust hat, alle FHT80b-Geräte neu an die Zentrale anzulernen, kann man dem CUL die selbe FHT-ID geben, die bisher die FHZ1300 hatte.&lt;br /&gt;
&lt;br /&gt;
Wie kann man diese herausfinden?&lt;br /&gt;
&lt;br /&gt;
Man schließt den CUL an, stellt ihn mit &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set myCUL raw X61&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
so ein, dass er die Protokollnachrichten weiterleitet, definiert möglichst alle seine FHT80b-Geräte und sucht im Log nach Nachrichten der Form&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;2008-09-28 13:22:47 FHT wz FHZ:can-xmit: 97&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Statt can-xmit kann man auch nach start-xmit oder can-rcv sehen. &lt;br /&gt;
&lt;br /&gt;
Die beiden angezeigten Ziffern werden nach Hex umgerechnet (61) und als die ersten beiden Stellen der FHT-ID verwendet. Die letzten beiden Stellen sind beliebig. Im Beispiel müsste der Eintrag dann lauten:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define myCUL CUL 6101&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Auf einem Testsystem kann man bspw. folgende Konfigurationsdatei discover-hc.conf verwenden&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;attr global logfile -&lt;br /&gt;
attr global verbose 5&lt;br /&gt;
attr global port 7072 global&lt;br /&gt;
attr global modpath /path/to/fhem&lt;br /&gt;
define myCUL CUL /dev/ttyACM0 0000&lt;br /&gt;
set myCUL raw X61&lt;br /&gt;
# alle FHT80b-Geräte hier aufführen&lt;br /&gt;
define myFHT1 FHT abcd&lt;br /&gt;
define myFHT2 FHT 1234&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
und mit&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;fhem discover-hc.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
starten.&lt;br /&gt;
&lt;br /&gt;
Wichtig: Anschliessend keinesfalls CUL/CUN und FHZ1X00 parallel betreiben, da die FHT Kommunikation sonst gestört ist.&lt;br /&gt;
&lt;br /&gt;
=== siehe auch ===&lt;br /&gt;
[[Was ist der Hauscode?]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_und_FritzBox_7390&amp;diff=7256</id>
		<title>FHEM und FritzBox 7390</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_und_FritzBox_7390&amp;diff=7256"/>
		<updated>2014-08-12T20:35:02Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FHEM auf der Fritz!Box 7390 wird von AVM ab Firmware-Version 84.05.05 unterstützt. Es werden damit die Treiber (Kernelmodule) für USB Geräte wie CUL und EUL sowie verschiedene Dienste bereitgestellt, die FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
== AVM Firmware mit FHEM ==&lt;br /&gt;
FHEM selbst ist als so genannte Labor-Firmware von AVM &#039;&#039;zusätzlich&#039;&#039;zur Basis-Firmware zu installieren und verändert die Versionsnummer nicht. Die AVM Variante kann über updatefhem auf den aktuellen Stand nachgerüstet werden. Sie hat allerdings den Nachteil, dass FHEM in einer chroot Umgebung läuft, damit sind die Funktionen der Fritz!Box nicht direkt zugreifbar. &lt;br /&gt;
&lt;br /&gt;
Die aktuellen Labor-Images können [http://www.avm.de/de/Service/Service-Portale/Labor/index.php hier] bezogen werden.&lt;br /&gt;
&lt;br /&gt;
== Community Firmware mit FHEM  ==&lt;br /&gt;
Eine etwas schlankere Variante von FHEM mit der Möglichkeit des direkten Zugriffs auf die Fritz!Box Funktionen steht unter [http://fhem.de/fhem-5.5-fb7390.image] zur Verfügung. (Alternative Images unter www.fhem.de/Download)&lt;br /&gt;
&lt;br /&gt;
Auch diese Firmware-Image lässt sich über die Funktion &amp;quot;Firmware-Update&amp;quot; der Fritz!Box installieren:&lt;br /&gt;
&lt;br /&gt;
* Menüpunkt System/Firmware-Update, dort den Reiter Firmware-Datei auswählen.&lt;br /&gt;
* Die passende Datei auswählen und mit &amp;quot;Update starten&amp;quot; bestätigen.&lt;br /&gt;
* Nach kurzer Zeit meldet sich die Fritz!Box mit der Warnung: &amp;quot;Die angegebene Datei enthält keine von AVM für dieses Gerät freigegebene Firmware.&amp;quot;&lt;br /&gt;
* Hier mit &amp;quot;Update fortsetzen&amp;quot; bestätigen. Die Firmware wird installiert, der Vorgang schließt mit dem Neustart der Fritz!Box ab.&lt;br /&gt;
* Anschließend steht FHEM im Webbrowser unter &amp;quot;fritz.box:8083/fhem&amp;quot;, und im Telnet Fenster unter &amp;quot;telnet fritz.box 7072&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
* [http://service.avm.de/support/de/SKB/FRITZ-Box-7390 AVM Support FAQ]&lt;br /&gt;
* [ftp://ftp.avm.de/fritz.box/fritzbox.fon_wlan_7390/ AVM Firmware Repository]&lt;br /&gt;
&lt;br /&gt;
== FB7390 einrichten - detaillierte Schritte ==&lt;br /&gt;
Sollten die o.g. Beschreibungen nicht ausreichen, hier eine detaillierte Beschreibung von Dirk070 aus dem Forum (siehe&lt;br /&gt;
[http://forum.fhem.de/index.php/topic,13337.msg82461.html#msg82461 hier])&lt;br /&gt;
&lt;br /&gt;
== FB7390 fhem als root ==&lt;br /&gt;
Im fhem Verzeichnis startfhem in startfhem_orig oder ähnlich umbenennen. Dann die Datei startfhemAsRoot in startfhem umbenennen, Fritzbox neu starten und schon startet fhem als Root.&amp;lt;br&amp;gt;&lt;br /&gt;
Sollten diese Schritte nicht reichen, dann nach [[FritzBox Parameter in fhem anzeigen#Wichtig|dieser Anleitung]] vorgehen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FritzBox]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SONOS&amp;diff=7255</id>
		<title>SONOS</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SONOS&amp;diff=7255"/>
		<updated>2014-08-12T20:33:08Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Anwendungsbeispiel soll den Einstieg in die Steuerung der heimischen Zoneplayer der Firma [http://www.sonos.com Sonos] erleichtern. Es werden die Verwendung und Einrichtung der dazugehörenden Module &#039;&#039;&#039;SONOS&#039;&#039;&#039; und &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039; beschrieben, und einige Beispiele für eine mehr oder weniger sinnvolle Nutzung von Events und Steuerungsmöglichkeiten gegeben.&lt;br /&gt;
Sollte etwas fehlen oder unklar sein, dann einfach eine kurze Nachricht an den Autor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 0; margin-top:10px; border: 1px solid #dfdfdf; padding: 0 1em 1em 1em; background-color:#fff0e0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;! Achtung !&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
Diese Module sind &#039;&#039;&#039;nicht&#039;&#039;&#039; im offiziellen Release von FHEM enthalten. Sie müssen mittels des Thirdparty-Updatemechanismus nachinstalliert werden.&lt;br /&gt;
Dabei sind trotzdem die Vorbedingungen bzgl. der Perl-Installation einzuhalten, da diese Update-Installation nur im Rahmen von FHEM erfolgt.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kurzüberblick ==&lt;br /&gt;
Hier soll nur ein kurzer Überblick über die mittlerweile doch recht umfangreichen Möglichkeiten geboten werden:&lt;br /&gt;
*Automatisches Erkennen aller ZonePlayer im lokalen Netzwerk. Dabei werden alle Player einer Paarung zusammengehörig benannt und gruppiert&lt;br /&gt;
*Automatische Aktualisierung aller aktuellen (und wenn verfügbar: der nächsten) Titelinformationen innerhalb von FHEM&lt;br /&gt;
**Dabei wird für jede veränderte Information ein Event erzeugt, man kann also dediziert darauf reagieren&lt;br /&gt;
**Bei normalen Abspiellisten werden auch die Informationen zum nächsten Titel ermittelt und angezeigt&lt;br /&gt;
**Es können auch verschiedene Zusammenfassungen der bestehenden Informationen zusammengestellt werden&lt;br /&gt;
*Anzeige des aktuellen (oder auch nächsten) Covers als Weblink&lt;br /&gt;
*Steuern der ZonePlayer: Play, Pause, Nächster Titel, Vorheriger Titel, Lautstärke Lauter/Leiser (auch als Rampe), Stummschalten&lt;br /&gt;
*Alle Player auf einen Befehl hin stoppen oder pausieren lassen&lt;br /&gt;
*Einstellen und Abfragen der Abspielparameter Repeat, Shuffle, CrossfadeMode, Loudness, Bass und Treble&lt;br /&gt;
*Festlegen einer minimalen und maximalen Lautstärke für jeden ZonePlayer (getrennt zwischen Normalbetrieb und Kopfhörernutzung)&lt;br /&gt;
*Laden und Speichern von Playlisten (auch M3U-Dateien aus dem Filesystem)&lt;br /&gt;
*Abspielen eines Sonos-Favoriten (z.B. Playlist, Spotify-Playlist, Titel, Radiosender, usw.)&lt;br /&gt;
*Abspielen beliebiger Titel (auch von Freigaben, die nicht von Sonos indiziert wurden)&lt;br /&gt;
*Abspielen beliebiger Radiostationen über deren HTTP-Link&lt;br /&gt;
*Hinzufügen beliebiger Titel und Radiostationen zur aktuellen Abspielliste&lt;br /&gt;
*Temporäres Abspielen von Dateien, mit nachfolgender Wiederherstellung des vorherigen Titels inkl. genauer Position im vorherigen Titel und der Lautstärke&lt;br /&gt;
*Erzeugen und temporäres Abspielen von Sprachdurchsagen auf Basis von eingegebenen Texten&lt;br /&gt;
**Wird standardmäßig über die Google-Übersetzungsmaschine realisiert&lt;br /&gt;
**Kann auch über eine eigenständige, lokale Installation realisiert werden&lt;br /&gt;
*Auslesen der verfügbaren gespeicherten Playlisten und Radiofavoriten&lt;br /&gt;
*Erzeugung und Bearbeitung von Alarmen, sowie Event bei Veränderung der Alarme duch andere Controller&lt;br /&gt;
*Setzen des Sleeptimer inkl. Fhem-Event bei Veränderung durch andere Controller und Ablauf des Timers&lt;br /&gt;
*Setzen und Auslesen der Gruppierungskonfiguration, sowie einzelnes Hinzufügen und Entfernen von Gruppenmitgliedern&lt;br /&gt;
*Erzeugen von Events nach festgelegten Tastensequenzen (am Player)&lt;br /&gt;
*Umbenennen der Zonen und festlegen der Zonenicons&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kurze Anmerkungen zur Sonos-Landschaftsgestaltung ===&lt;br /&gt;
Es ist im allgemeinen besser, die Sonos-Landschaft mit allen Paarungen vor dem Einrichten des Moduls zu erzeugen. &lt;br /&gt;
Dieses Modul benennt die Player nach den Zonennamen und der jeweiligen Funktion des Players innerhalb der Paarungs-Zone.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet aber auch, dass in diesem Augenblick möglichst keine Player gruppiert sein sollten (mehrere Zonen spielen dasselbe ab), da diese sonst komische Namen erhalten könnten (es geht hier ausschliesslich um die Fhem-interne Device-Benennung, natürlich bleiben die Zoneplayer selbst wie sie sind).&lt;br /&gt;
&lt;br /&gt;
Damit man nun eine einigermaßen passende Bezeichnung in Fhem erhält, sollte also die Gestaltung der Sonos-Player abgeschlossen sein. Natürlich funktioniert das System nach einer Fhem-Einrichtung und anschließender Sonos-Umbenennung immer noch, da intern alles mittels der eindeutigen Bezeichner gehandhabt wird, allerdings wird es u.U. etwas unübersichtlich bzgl. der Fhem-Device-Namen. Diese passen dann nicht mehr zu den Zonennamen (die entsprechenden Readings werden aber natürlich korrekt besetzt), was man aber natürlich auch nachträglich wieder anpassen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbindung von Sonos in FHEM ==&lt;br /&gt;
Die Einbindung erfolgt über die beiden Module &#039;&#039;&#039;SONOS&#039;&#039;&#039; und &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039;. Dabei ist Hauptsächlich das Modul &#039;&#039;&#039;SONOS&#039;&#039;&#039; einzurichten. Alle Zoneplayer werden automatisch erkannt, und dann entsprechend angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos SONOS localhost:4711 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name dieses Devices ist automatisch das Namensprefix beim Anlegen der SonosPlayer. In diesem Fall werden alle erkannten Zoneplayer mit dem Prefix &amp;quot;&amp;lt;code&amp;gt;Sonos_&amp;lt;/code&amp;gt;&amp;quot; anfangen.&lt;br /&gt;
Natürlich kann man das nach dem Anlegen einfach umbenennen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erkannte Zoneplayer werden als &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039;-Device angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer SONOSPLAYER RINCON_000E5828D0F401400_MR&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name des Device wird aus dem Namen des SONOS-Device und dem Namen der Zone gebildet. Dabei werden Leer- und Sonderzeichen in &amp;quot;&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;&amp;quot; umgewandelt.&lt;br /&gt;
&lt;br /&gt;
Beim Anlegen werden automatisch einige Attribute mit angelegt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer generateInfoSummarize1 &amp;lt;NormalAudio&amp;gt;&amp;lt;Artist prefix=&amp;quot;(&amp;quot; suffix=&amp;quot;)&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;Title prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot; ifempty=&amp;quot;[Keine Musikdatei]&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;Album prefix=&amp;quot; vom Album &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot;/&amp;gt;&amp;lt;/NormalAudio&amp;gt; &lt;br /&gt;
		&amp;lt;StreamAudio&amp;gt;&amp;lt;Sender suffix=&amp;quot;:&amp;quot;/&amp;gt;&amp;lt;SenderCurrent prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039; -&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;SenderInfo prefix=&amp;quot; &amp;quot;/&amp;gt;&amp;lt;/StreamAudio&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer generateInfoSummarize2 &amp;lt;TransportState/&amp;gt;&amp;lt;InfoSummarize1 prefix=&amp;quot; =&amp;gt; &amp;quot;/&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer generateInfoSummarize3 &amp;lt;Volume prefix=&amp;quot;Lautstärke: &amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;Mute instead=&amp;quot; ~ Kein Ton&amp;quot; ifempty=&amp;quot; ~ Ton An&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		 ~ Balance: &amp;lt;Balance ifempty=&amp;quot;Mitte&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;HeadphoneConnected instead=&amp;quot; ~ Kopfhörer aktiv&amp;quot; &lt;br /&gt;
			ifempty=&amp;quot; ~ Kein Kopfhörer&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
attr Sonos_Wohnzimmer icon icoSONOSPLAYER_icon-ZP90.png&lt;br /&gt;
attr Sonos_Wohnzimmer room Sonos&lt;br /&gt;
attr Sonos_Wohnzimmer stateVariable InfoSummarize2&lt;br /&gt;
attr Sonos_Wohnzimmer webCmd Play:Pause:Previous:Next:VolumeD:VolumeU:MuteT&lt;br /&gt;
attr Sonos_Wohnzimmer group Wohnzimmer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch ist dieses Device direkt in der FHEM-Oberfläche steuerbar. Auch hier gilt, dass man das natürlich anpassen kann. Das sollen nur vereinfachende Vorgaben sein.&lt;br /&gt;
Das Attribut &amp;quot;&amp;lt;code&amp;gt;room&amp;lt;/code&amp;gt;&amp;quot; wird wieder aus dem Namen des SONOS-Device gebildet.&lt;br /&gt;
Das Attribut &amp;quot;&amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt;&amp;quot; wird aus dem Namen der Zone gebildet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wird automatisch ein Weblink mit angelegt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define AlbumArt_Wohnzimmer weblink image fhem/icons/SONOSPLAYER/Sonos_Wohnzimmer_AlbumArt&lt;br /&gt;
attr AlbumArt_Wohnzimmer room Sonos&lt;br /&gt;
attr AlbumArt_Wohnzimmer htmlattr width=&amp;quot;200&amp;quot;&lt;br /&gt;
attr AlbumArt_Wohnzimmer group Wohnzimmer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird in der Raumansicht direkt über dem SonosPlayer-Device das Cover des aktuellen Titels angezeigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Namensvergabe der automatischen Erkennung ==&lt;br /&gt;
Der automatische Erkennungsmechanismus vergibt Devicenamen auf Basis der Zonennamen und der Funktion eines Players innerhalb eines Stereopaares oder einer Surroundkonstellation.&lt;br /&gt;
Dabei wird immer ein Player (der Master dieser Konstellationen) nur den Namen der Zone erhalten (ohne Anhängekürzel) und die anderen werden mit Kürzel versehen. Dadurch ist der Master der Zone automatisch dasjenige Playerdevice, welches gesteuert werden muss. Alle anderen Player leiten Steueranfragen automatisch an den Master weiter.&lt;br /&gt;
Besteht eine Zone nur aus einem Player, so gibt es natürlich auch nur diesen einen als Master.&lt;br /&gt;
&lt;br /&gt;
Als Anhängekürzel wird immer der Inhalt des Readings &#039;&#039;&#039;fieldType&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Bei der Funktion gibt es später dann zwei Fälle zu unterscheiden:&lt;br /&gt;
*Stereopaare werden von Sonos intern als Gruppe behandelt. Das bedeutet, dass der zweite Player (der nicht-Master) immer &#039;&#039;PLAYING&#039;&#039; als Status anzeigt, und nur der Master den korrekten Wert. Stereopaare haben, wie normale Gruppen oder Einzelplayer auch, eine Verzögerung von 70ms zu einem Eingangssignal.&lt;br /&gt;
*Surroundsysteme werden als Satelliten angebunden, und werden vom Modul nur mit &#039;&#039;intialized&#039;&#039; angegeben, da Sonos für diese nie eine Statusmeldung sendet. Diese Playersysteme haben eine verkürzte Verzögerung von 30ms zu einem Eingangssignal.&lt;br /&gt;
&lt;br /&gt;
Dabei ist ein Eingangsignal so etwas wie ein Line-In- oder SPDIF-Eingang.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Zonenlandschaft ===&lt;br /&gt;
Folgende Landschaft mit Status könnte es geben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sonos_Schlafzimmer      (STOPPED =&amp;gt; [Keine Musikdatei])&lt;br /&gt;
Sonos_Schlafzimmer_RF   (PLAYING =&amp;gt;  &#039;Keine Titelinformation bei Gruppenwiedergabe&#039;)&lt;br /&gt;
Sonos_Kinderzimmer      (PAUSED_PLAYBACK =&amp;gt;  &#039;Titelinformation&#039;)&lt;br /&gt;
Sonos_Gaestezimmer      (STOPPED =&amp;gt; [Keine Musikdatei])&lt;br /&gt;
Sonos_Wohnzimmer        (STOPPED =&amp;gt; [Keine Musikdatei])&lt;br /&gt;
Sonos_Wohnzimmer_LR     (initialized)&lt;br /&gt;
Sonos_Wohnzimmer_RR     (initialized)&lt;br /&gt;
Sonos_Wohnzimmer_SW     (initialized)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dabei wäre Schlafzimmer ein Stereopaar, Kinder- und Gästezimmer jeweils ein einzelner Player und Wohnzimmer z.B. eine Playbar mit zwei Rear-Lautsprechern und Subwoofer. In keiner Zone läuft eine aktive Wiedergabe.&lt;br /&gt;
Hier kann man schön die einzelnen Zustände und die erzeugten Namen erkennen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardwarevoraussetzungen ==&lt;br /&gt;
Diese Liste sollte im Laufe der Zeit fortgeführt werden. Es soll die Hardware-/Softwarevoraussetzungen festhalten, um Probleme im Vorfeld erkennen zu können.&lt;br /&gt;
&lt;br /&gt;
Funktionierende Kombinationen:&lt;br /&gt;
*Windows, ActivePerl&lt;br /&gt;
*Raspberry Pi, Default-Perl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problematische Kombinationen:&lt;br /&gt;
*FritzBox: Anscheinend ist Perl dort ohne Thread-Möglichkeit kompiliert. Diese sind aber essentiell notwendig für dieses Modul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Softwarevoraussetzungen ==&lt;br /&gt;
Für die Verwendung sind Perlmodule notwendig, die unter Umständen noch nachinstalliert werden müssen:&lt;br /&gt;
*&#039;&#039;&#039;LWP::Simple&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;LWP::UserAgent&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;SOAP::Lite&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;HTTP::Request&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Installation dieser Module geht in der Regel per CPAN. Das bedeutet das zum Beispiel mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo cpan LWP::Simple&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
das Modul &amp;quot;&amp;lt;code&amp;gt;LWP::Simple&amp;lt;/code&amp;gt;&amp;quot; installiert wird. Wenn man bereits als Benutzer &#039;&#039;&#039;root&#039;&#039;&#039; arbeitet, dann ist das &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; natürlich nicht nötig.&lt;br /&gt;
&lt;br /&gt;
Sollte es bei der Installation mittels CPAN zu Problemen kommen, dann folgt hier eine Beschreibung der manuellen Installation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hinweis für Debian-Systeme ===&lt;br /&gt;
Bei Debian-basierten Systemen (also auch Raspbian für den Raspberry Pi usw.) kann auch mittels&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install &amp;lt;paketname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
installiert werden. Manchmal ist es etwas schwieriger, die Paketnamen zu ermitteln, aber Google ist da sehr hilfreich.&lt;br /&gt;
&lt;br /&gt;
Hier mal die Liste für die oben genannten Pakete:&lt;br /&gt;
*&#039;&#039;&#039;LWP::Simple&#039;&#039;&#039;-Paketname (inkl. &#039;&#039;&#039;LWP::UserAgent&#039;&#039;&#039; und &#039;&#039;&#039;HTTP::Request&#039;&#039;&#039;): &amp;lt;code&amp;gt;libwww-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;SOAP::Lite&#039;&#039;&#039;-Paketname: &amp;lt;code&amp;gt;libsoap-lite-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;XML::Parser::Lite&#039;&#039;&#039;-Paketname: &amp;lt;code&amp;gt;libxml-parser-lite-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Installation LWP::Simple ===&lt;br /&gt;
Wenn sich dieses Paket nicht einfach per CPAN-Anweisung installieren läßt, dann hilft folgende Anleitung weiter. &lt;br /&gt;
Beim Abbruch der Installation mittels CPAN erscheint mittendrin ein Fehler, das die Datei nicht entpackt werden könne (couldn&#039;t untar). Da scheint es einen Fehler im Installationsskript zu geben.&lt;br /&gt;
&lt;br /&gt;
Man kann das aber auch Manuell installieren:&lt;br /&gt;
*Am Einfachsten ist ein Wechsel in den Kontext des Benutzers &#039;&#039;&#039;root&#039;&#039;&#039;: &amp;quot;&amp;lt;code&amp;gt;sudo su -&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Erstellen eines Ordners, z.B. &amp;quot;&amp;lt;code&amp;gt;mkdir lwpsimple&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in diesen Ordner &amp;quot;&amp;lt;code&amp;gt;cd lwpsimple&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Herunterladen der Datei von [http://search.cpan.org/~gaas/libwww-perl-6.04/ libwww-perl-6.04] oder direkter Link: [http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-6.04.tar.gz libwww-perl-6.04.tar.gz]: z.B. &amp;quot;&amp;lt;code&amp;gt;wget http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-6.04.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Entpacken der Datei: &amp;quot;&amp;lt;code&amp;gt;tar -xzvf libwww-perl-6.04.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in das neu entstandene Verzeichnis: &amp;quot;&amp;lt;code&amp;gt;cd libwww-perl-6.04&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Nun kann es nach dem Standardvorgehen weitergehen:&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Installation SOAP::Lite ===&lt;br /&gt;
Wenn sich dieses Paket nicht einfach per CPAN-Anweisung installieren läßt, dann hilft folgende Anleitung weiter. &lt;br /&gt;
Beim Abbruch der Installation mittels CPAN erscheint mittendrin ein Fehler, das die Datei nicht entpackt werden könne (couldn&#039;t untar). Da scheint es einen Fehler im Installationsskript zu geben.&lt;br /&gt;
&lt;br /&gt;
Man kann das aber auch Manuell installieren:&lt;br /&gt;
*Am Einfachsten ist ein Wechsel in den Kontext des Benutzers &#039;&#039;&#039;root&#039;&#039;&#039;: &amp;quot;&amp;lt;code&amp;gt;sudo su -&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Erstellen eines Ordners, z.B. &amp;quot;&amp;lt;code&amp;gt;mkdir soaplite&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in diesen Ordner &amp;quot;&amp;lt;code&amp;gt;cd soaplite&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Herunterladen der Datei von [http://search.cpan.org/~mkutter/SOAP-Lite-0.715/ CPAN-SOAP-Lite-0.715] oder direkter Link: [http://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/authors/id/M/MK/MKUTTER/SOAP-Lite-0.715.tar.gz SOAP-Lite-0.715.tar.gz]: z.B. &amp;quot;&amp;lt;code&amp;gt;wget http://mirror.informatik.uni-mannheim.de/pub/mirrors/CPAN/authors/id/M/MK/MKUTTER/SOAP-Lite-0.715.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Entpacken der Datei: &amp;quot;&amp;lt;code&amp;gt;tar -xzvf SOAP-Lite-0.715.tar.gz&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Wechsel in das neu entstandene Verzeichnis: &amp;quot;&amp;lt;code&amp;gt;cd SOAP-Lite-0.715&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
*Nun kann es nach der [http://www.soaplite.com/2003/06/installation_in.html Anleitung] weitergehen:&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**Dann kommt eine Nachfrage, was zusammengebaut werden soll. An dieser Stelle ist es jetzt wie eine normale CPAN Installation. Einfach mit &amp;lt;Enter&amp;gt; weitermachen lassen.&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
**&amp;quot;&amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung von Samba für Sprachausgabemöglichkeit ===&lt;br /&gt;
Wenn die Sprachausgabe verwendet werden soll, muss ein lokaler Samba-Daemon (Server für Windowsfreigaben) laufen oder eine für FHEM beschreibbare (Windows-)Freigabe woanders existieren, da Sonos nur auf eine solche lesend zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
Diese Beschreibung soll anhand des Raspberry-Pi (und anderer Debian-Systeme) zeigen, wie man einen solchen lokalen Samba-Server schnell für diesen Zweck einrichten kann:&lt;br /&gt;
*Lokales Verzeichnis für die Ablage der Tondateien erzeugen. z.B.: &amp;lt;pre&amp;gt;sudo mkdir /mnt/SonosSpeak&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Installation der notwendigen Pakete für Samba: &amp;lt;pre&amp;gt;sudo apt-get install samba samba-common-bin&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Starten des Editors zum Anpassen der Konfigurationsdatei: &amp;lt;pre&amp;gt;sudo nano /etc/samba/smb.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Folgende Zeilen hinzufügen (Pfade müssen natürlich u.U. angepasst werden): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[SonosSpeak]&lt;br /&gt;
  comment = Audio-Files for SonosPlayer to Speak&lt;br /&gt;
  read only = false&lt;br /&gt;
  path = /mnt/SonosSpeak&lt;br /&gt;
  guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Falls der Zugriff nicht funktioniert, kann vielleicht folgendes helfen:&lt;br /&gt;
**Sicherstellen, dass in der &#039;&#039;Global&#039;&#039;-Sektion der Parameter &#039;&#039;Security&#039;&#039; auf &#039;&#039;Share&#039;&#039; steht (oder gar nicht erst definiert wurde):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
  security = share&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Samba-Server neustarten: &amp;lt;pre&amp;gt;sudo /etc/init.d/samba restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird eine Freigabe mit dem Namen &#039;&#039;&#039;SonosSpeak&#039;&#039;&#039; erzeugt, die von allen ohne Anmeldung gelesen und beschrieben werden kann.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Interner Aufbau ==&lt;br /&gt;
Um die Kommunikation mit dem UPnP-Netzwerk parallel zum normalen Betrieb von FHEM zu ermöglichen, werden [http://perldoc.perl.org/threads.html Threads] eingesetzt. Dadurch sind manche Hardwareplattformen leider überfordert und können u.U. nicht mit diesem Modul verwendet werden.&amp;lt;br /&amp;gt;Das läßt sich aus technologischen Gründen auch nicht umgehen.&lt;br /&gt;
&lt;br /&gt;
Dabei wird der SubThread verwendet um die Callback-Aufrufe, die erfolgen, wenn z.B. eine Statusänderung eines Players erfolgt, zu verarbeiten. Die Aktualisierung der Daten selbst wird dann über eine interne [http://perldoc.perl.org/Thread/Queue.html Queue] &amp;quot;nach oben&amp;quot; zum Hauptthread übertragen, und dann mittels einer bestehenden TCP-Verbindung zur Verarbeitung in FHEM übertragen.&amp;lt;br /&amp;gt; Dadurch wird gewährleistet, dass die Daten immer im Hauptthread (also dem &amp;quot;eigentlichen&amp;quot; FHEM-Thread) verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Da dieser SubThread auch die Kommandoübergabe an den Player übernimmt, gibt es auch eine Kommando-Queue in die andere Richtung, die dann mittels eines Thread-Signals im SubThread-Kontext ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau sorgt natürlich dafür, dass man auf die üblichen Nebenläufigskeitsprobleme achten muss (in der Hauptsache sind das Dead-Locks, da man oftmals über drei Ecken aufeinander wartet, ohne das direkt zu sehen). Deswegen wird in allen Log-Ausgaben des Moduls ein Kürzel vorangestellt: &amp;quot;&amp;lt;code&amp;gt;SONOS_&amp;lt;/code&amp;gt;&amp;quot;, wobei der Unterstrich durch die Nummer des aktiven, loggenden, Threads ersetzt wird. Damit kann man sehr leicht feststellen, auf welcher &amp;quot;Ebene&amp;quot; diese Ausgabe erfolgt ist, und ob das alles so seine Richtigkeit hat.&lt;br /&gt;
&lt;br /&gt;
Der Rest sind nur viele Zeilen, die XML-Strukturen (mittels regulärer Ausdrücke) parsen oder erzeugen, und die entsprechenden Informationen setzen oder abfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation des Moduls selbst ==&lt;br /&gt;
Hier wird die Installation des eigentlichen Moduls beschrieben, sowie ein Changelog ausgegeben, damit man nachvollziehen kann, was am Modul so passiert ist. Dieser Changelog steht auch in der Datei 00_SONOS.pm.&lt;br /&gt;
&lt;br /&gt;
=== Installation mittels FHEM-Updatemechanismus ===&lt;br /&gt;
Um dieses Modul über den Update-Mechanismus von FHEM zu installieren, muss folgender Befehl im Eingabefeld (oder auf der Telnet-Konsole) eingegeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;update thirdparty http://fhem.lmsoft.de/sonos sonos&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für einen Vorabcheck, was installiert werden würde, kann man folgendes eingeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;update thirdparty http://fhem.lmsoft.de/sonos sonos check&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Perl-Installation korrekt erweitert wurde, bzw. bereits erweitert war, sollte das Modul nach einem Neustart zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Living on the bleeding edge ====&lt;br /&gt;
Da ich vor einem Releasetermin natürlich einiges entwickelt habe, und dies natürlich auch selber teste, habe ich dafür einen Development-Server eingerichtet.&lt;br /&gt;
Dieser kann u.U. sinnvollerweise auch von anderen als Installationsquelle verwendet werden, da er aktuelle Fehlerbereinigungen oder neue Features und Konzepte enthält, die man gerne vorab sehen möchte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;:&lt;br /&gt;
Diese Version muss nicht immer und zwangsläufig besser sein! ich gebe mir Mühe, bin aber auch nur ein Mensch :-)&lt;br /&gt;
&lt;br /&gt;
Folgendes muss für die Installation eingegeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;update thirdparty http://fhem.lmsoft.de/sonos_dev sonos&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Installation ===&lt;br /&gt;
Dieser Part ist nur solange interessant, wie das Modul (noch) nicht offiziell ist.&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb ist das Modul [http://perlupnp.sourceforge.net/ PerlUPnP] notwendig.&lt;br /&gt;
&lt;br /&gt;
Folgende Dateien sind nötig:&lt;br /&gt;
*00_SONOS.pm&lt;br /&gt;
*21_SONOSPLAYER.pm&lt;br /&gt;
*2 Dateien der PerlUPnP-Library&lt;br /&gt;
*Dateien für MP3-Tags bei der Sprachausgabe (Wenn nicht vorhanden, fehlt nur die Funktionalität, das Modul sollte aber dennoch lauffähig sein)&lt;br /&gt;
*Die unter &#039;&#039;Softwarevoraussetzungen&#039;&#039; genannten Perlmodule&lt;br /&gt;
&lt;br /&gt;
Die beiden SONOS-Perlmodule müssen einfach in das Verzeichnis &amp;lt;code&amp;gt;FHEM&amp;lt;/code&amp;gt; kopiert werden (wie alle anderen FHEM-Module auch).&lt;br /&gt;
&lt;br /&gt;
Die PerlUPnP-Library muss komplett in das Verzeichnis &amp;lt;code&amp;gt;FHEM/lib/&amp;lt;/code&amp;gt; abgelegt werden. Dabei muss das Verzeichnis &amp;lt;code&amp;gt;UPnP&amp;lt;/code&amp;gt; genannt werden. &lt;br /&gt;
Es werden für den Betrieb nicht alle Dateien des Standard-Pakets benötigt, sondern nur zwei .pm Dateien. &amp;lt;br /&amp;gt;&lt;br /&gt;
Die resultierende Ordnerstruktur (inkl. Dateien von PerlUPnP) lautet dann wie folgt:&lt;br /&gt;
*FHEM/lib&lt;br /&gt;
*FHEM/lib/UPnP&lt;br /&gt;
*FHEM/lib/UPnP/Common.pm&lt;br /&gt;
*FHEM/lib/UPnP/ControlPoint.pm&lt;br /&gt;
&lt;br /&gt;
Die Dateien für die MP3-Tags müssen ebenfalls in das Verzeichnis &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; kopiert werden. Diese wird nur bei manchen Dateien für die Zwischendurchsage benötigt, da Sonos nicht immer eine Laufzeit mitliefert, bzw. für die generierten Sprachdurchsagen, da dort die Informationen für die Anzeige im ZonePlayer gesetzt werden.&amp;lt;br /&amp;gt;Die Laufzeit z.B. wird für die Pausenberechnung aber gebraucht, und muss dementsprechend auf anderem Wege ermittelt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die resultierende Ordnerstruktur lautet dann wie folgt:&lt;br /&gt;
*FHEM/lib/&lt;br /&gt;
*FHEM/lib/MP3&lt;br /&gt;
*FHEM/lib/MP3/Tag.pm&lt;br /&gt;
*FHEM/lib/MP3/Info.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag&lt;br /&gt;
*FHEM/lib/MP3/Tag/File.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/LastResort.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ImageExifTool.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/CDDB_File.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ID3v2_Data.pod&lt;br /&gt;
*FHEM/lib/MP3/Tag/ImageSize.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ID3v1.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ParseData.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/Cue.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/ID3v2.pm&lt;br /&gt;
*FHEM/lib/MP3/Tag/Inf.pm&lt;br /&gt;
*FHEM/lib/Normalize&lt;br /&gt;
*FHEM/lib/Normalize/Text&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields.pm&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/Music_Fields-rus.lst&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/G_Gershwin.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/A_Dvor_k.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/J_Brahms.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/L_van_Beethoven.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/A_Schnittke.comp&lt;br /&gt;
*FHEM/lib/Normalize/Text/Music_Fields/D_Shostakovich.comp&lt;br /&gt;
*FHEM/lib/Encode&lt;br /&gt;
*FHEM/lib/Encode/transliterate_win1251.pm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von FHEM kann das Modul wie beschrieben verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Fehlersuche ===&lt;br /&gt;
Da das Modul noch in der Entwicklung steht, und natürlich sowieso immer wieder Probleme auftauchen können, hier ein paar Hinweise zur Fehlersuche:&lt;br /&gt;
Das Modul besteht zunächst aus zwei Ebenen:&lt;br /&gt;
*Eine Ebene, die innerhalb von Fhem selbst läuft&lt;br /&gt;
*Eine Ebene, die als eigenständiger Prozess läuft (entweder durch Fhem selbst oder manuell angestartet)&lt;br /&gt;
&lt;br /&gt;
Die Logausgaben der ersten Ebene landen direkt im Fhem-Log, die der zweiten Ebene können dort nicht reingeschrieben werden, und landen dementsprechend auf der Konsole (genauer: auf STDOUT).&lt;br /&gt;
Wenn man also die Log-Ausgaben dieses Sub-Prozesses sehen möchte, muss man im Startskript den STDOUT entsprechend umlenken, oder einen manuellen Start ausführen:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo perl fhem.pl fhem.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
Dazu muss man natürlich vorher in das entsprechende Verzeichnis wechseln.&lt;br /&gt;
&lt;br /&gt;
Die Menge der Logausgaben werden, wie in Fhem üblich, über das Attribut Verbose am Sonos-Device gesteuert (Bis auf wenige Zeilen beim Start des Sub-Prozesses, die nur mit dem globalen Verbose-Attribut gesteuert werden können, da noch keine Verbindung besteht).&lt;br /&gt;
&lt;br /&gt;
Im Normalfall sollte Anhand der Ausgabe erkennbar sein, was das jeweilige Problem ist. Bei Unklarheiten am Besten im Forum suchen/posten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hinweise / Häufige Fehler / FAQ ====&lt;br /&gt;
Hier soll mal eine Liste mit häufigen Fehlern, Problemen und Hinweisen entstehen.&lt;br /&gt;
&lt;br /&gt;
*Allgemein läuft das Modul besser, wenn es im Benutzerkontext &#039;&#039;root&#039;&#039; läuft. Für diverse Funktionalitäten ist das sogar notwendig (z.B. Pingtype auf &#039;&#039;icmp&#039;&#039; konfiguriert).&lt;br /&gt;
*Wenn man das Problem hat, dass Befehle an den falschen Player gesendet werden, sollte man das Reading &#039;&#039;&#039;ZoneGroupID&#039;&#039;&#039; prüfen. Bei ungruppierten Playern sollte es die eigene UDN enthalten, bei gruppierten Playern die UDN des Gruppenmaster.&amp;lt;br /&amp;gt;Sollte das mal nicht der Fall sein, so kann es sein, dass im Sonos-System eine Falschinformation vorliegt. Da es jetzt nicht so einfach ist, die bei Sonos dazu zu bewegen, diesen Fehler zu beseitigen, gibt es u.U. eine Workaround-Möglichkeit mit dem Modul.&amp;lt;br /&amp;gt;Wenn wir z.B. zwei Player haben: &#039;&#039;Sonos_Bad&#039;&#039; und &#039;&#039;Sonos_Kueche&#039;&#039;, und dort die Steuerung nicht korrekt funktioniert, dann einmal die folgenden Schritte versuchen (bei mehr oder anderen Playern natürlich analog dazu).&amp;lt;br /&amp;gt;Dadurch werden die Gruppen gebildet, und nochmal explizit aufgelöst.&lt;br /&gt;
**&amp;lt;code&amp;gt;set Sonos Groups [Sonos_Bad, Sonos_Kueche]&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;set Sonos Groups [Sonos_Kueche, Sonos_Bad]&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;set Sonos Groups [Sonos_Bad], [Sonos_Kueche]&amp;lt;/code&amp;gt;&lt;br /&gt;
*Es ist empfehlenswert, dass erst das &#039;&#039;&#039;Sonos&#039;&#039;&#039;-Device definiert wird, und dann erst die entsprechenden &#039;&#039;&#039;Sonosplayer&#039;&#039;&#039;-Devices dazu. Sonst kann es u.U. zu einer Verdoppelung des SubProzesses kommen.&lt;br /&gt;
*Manchmal bleiben &#039;Reste&#039; beim Beenden von Fhem. Dann kann es sinnvoll sein, erst alle Perl-Prozesse zu beenden. Diese kann man mit &amp;lt;pre&amp;gt;sudo ps -aux | grep perl&amp;lt;/pre&amp;gt; finden, und dann einzeln mittels &amp;lt;pre&amp;gt;sudo kill ID&amp;lt;/pre&amp;gt; beenden (die ID steht in der ersten Spalte des Ergebnisses des vorherigen Befehls).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Changelog ===&lt;br /&gt;
*2.5 (07.03.2014):&lt;br /&gt;
**Verwendung und Speicherung der Benutzer-IDs für Spotify und Napster wurden stabiler gegenüber Sonderzeichen gemacht&lt;br /&gt;
**Spotify-URLs werden im Reading &#039;currentTrackURI&#039; und &#039;nextTrackURI&#039; lesbarer abgelegt&lt;br /&gt;
**Ein Fehler beim Öffnen von M3U-Playlistdateien wurde behoben (dafür Danke an John)&lt;br /&gt;
**Überholt: Für die Informationsanfragen an Fhem durch den SubProzess wird nun standardmäßig der Telnet-Port von Fhem verwendet. Wenn das fehlschlägt, wird auf den alten Mechanismus zurückgeschaltet&lt;br /&gt;
**Neu: Es werden keine Informationsanfragen mehr zwischen Fhem und dem SubProzess ausgetauscht. Notwendige Informationen müssen vorher übertragen werden. Das bedeutet, dass bei einer Attributänderung ein Neustart von Fhem erfolgen muss.&lt;br /&gt;
**Es wurde ein Standard-Layout für das RemoteControl-Hilfsmodul angelegt&lt;br /&gt;
**Der Verbose-Level des Sonos-Devices wird nun auch an den SubProzess weitergereicht (auch zur Laufzeit), und beim initialen Start des SubProzess-Threads mitgegeben.&lt;br /&gt;
**AlbumArt von Napster erhält nun den den festen Mimetype &#039;jpg&#039;, da dieser nicht übertragen wird&lt;br /&gt;
**Es werden nun die durch Fhem definierten Standard-Attribute mit angeboten&lt;br /&gt;
**Es gab ein Problem mit der Befehlsverarbeitung, wenn das Verbose-Attribut an einem Sonos-Device gesetzt war.&lt;br /&gt;
**Es wird nun auf Änderungsevents für den Zonennamen und das Zonenicon reagiert, und die entsprechenden Readings aktualisiert&lt;br /&gt;
**Es gibt jetzt zwei neue Setter: &#039;Name&#039; und &#039;Icon&#039;, mit dem der Name und das Icon der Zone eingestellt werden kann&lt;br /&gt;
**Es gibt jetzt einen Getter &#039;PossibleRoomIcons&#039;, welcher die möglichen Angaben für den neuen Setter &#039;Icon&#039; liefert&lt;br /&gt;
**Das Reading &#039;ZoneGroupID&#039; wird nun auf eine andere Weise ermittelt und gesetzt&lt;br /&gt;
**Es gib jetzt ein neues Reading &#039;AlarmRunning&#039;, welches auf &#039;1&#039; steht, wenn gerade eine Alarmabspielung aktiv ist&lt;br /&gt;
**Die Namens- und Aufgabenerkennung beim Ermitteln der Player wurde angepasst&lt;br /&gt;
**Der Aufruf von AddMember und RemoveMember wurde bzgl. des SonosDevice-Namen abgesichert, sodass hier kein Absturz mehr bei einer falschen Deviceangabe erfolgt&lt;br /&gt;
**Es gibt jetzt ein neues Reading &#039;AlarmRunningID&#039;, welches bei einer Alarmausführung die ID des aktiven Alarms enthält&lt;br /&gt;
**Das Senden von Aktualisierungen an Fhem wurde etwas sicherer gemacht, wenn Fhem auf der anderen Seite gerade nicht zuhören kann&lt;br /&gt;
**Die Readings &#039;AlarmList&#039;, &#039;AlarmListIDs&#039; und &#039;AlarmListVersion&#039; werden nicht mehr aus dem Statefile geladen, da dort Sonderzeichen wie &#039;#&#039; zum Abschneiden der restlichen Zeile führen&lt;br /&gt;
**Anpassung der UPnP-Klasse, damit das Device-Beschreibungsdokument nur noch einmal geladen wird (anstatt wie bisher zweimal)&lt;br /&gt;
**Anpassung im Bereich der Cover Aktualisierung über FhemWeb. Das geht jetzt mit viel weniger Aufwand durch.&lt;br /&gt;
**Es gibt jetzt einen Setter &#039;SnapshotGroupVolume&#039;, der das aktuelle Lautstärkenverhältnis der einzelnen Player einer Gruppe für die folgenden Aufrufe des Setter &#039;GroupVolume&#039; festhält. Die Anweisungen &#039;PlayURI&#039; und &#039;PlayURITemp&#039; (sowie darauf aufbauende Aufrufe wie &#039;Speak&#039;) führen diese Anweisung selbsttätig beim Starten durch.&lt;br /&gt;
**Wenn beim Auffrischen der Subscriptions ein Fehler auftritt, der darauf schließen läßt, dass der Player weg ist, dann wird die entsprechende Referenz aufgeräumt&lt;br /&gt;
**Man kann als relative Angabe bei setVolume nun einen Prozentwert angeben, z.B. &#039;+20%&#039;. Damit wird die Lautstärke um den jeweiligen prozentualen Anteil erhöht oder abgesenkt.&lt;br /&gt;
**Es gibt jetzt ein Reading &#039;LineInConnected&#039;, welches eine &#039;1&#039; enthält, wenn der Line-In-Eingang angeschlossen wurde, sonst &#039;0&#039;.&lt;br /&gt;
*2.4 (31.12.2013):&lt;br /&gt;
**Initiale Lautstärkenermittlung wurde nun abgesichert, falls die Anfrage beim Player fehlschlägt&lt;br /&gt;
**Verbesserte Gruppenerkennung für die Anzeige der Informationen wie Titel usw.&lt;br /&gt;
**Fallback (Log) für den Aufruf von Log3 geschaffen, damit auch alte FHEM-Versionen funktionieren&lt;br /&gt;
**Es wurde eine Korrektur im verwendetetn UPnP-Modul gemacht, die eine bessere Verarbeitung der eingehenden Datagramme gewährleistet (dafür Danke an Sacha)&lt;br /&gt;
**Es werden nun zusätzliche Readings (beginnend mit &#039;next&#039;) mit den Informationen über den nächsten Titel befüllt. Diese können natürlich auch für InfoSummarize verwendet werden&lt;br /&gt;
**Es kann nun ein Eintrag aus der Sonos-Favoritenliste gestartet werden (Playlist oder Direkteintrag)&lt;br /&gt;
**Das Benennen der Sonos-Fhem-Devices wird nun auf Namensdoppelungen hin überprüft, und der Name eindeutig gemacht. Dabei wird im Normalfall das neue Reading &#039;fieldType&#039; an den Namen angehangen. Nur der Master einer solchen Paarung bekommt dann den Original-Raumnamen als Fhem-Devicenamen&lt;br /&gt;
**Es gibt ein neues Reading &#039;fieldType&#039;, mit dem man erkennen kann, an welcher Position in einer Paarung dieser Zoneplayer steht&lt;br /&gt;
**Diverse Probleme mit Gruppen und Paarungen beim neu Erkennen der Sonos-Landschaft wurden beseitigt&lt;br /&gt;
**Es gibt jetzt einen Getter &#039;EthernetPortStatus&#039;, der den Status des gewünschten Ethernet-Ports liefert&lt;br /&gt;
**Es gibt jetzt einen Setter &#039;Reboot&#039;, der einen Neustart des Zoneplayers durchführt&lt;br /&gt;
**Es gibt jetzt einen Setter &#039;Wifi&#039;, mit dem der Zustand des Wifi-Ports eines Zoneplayers gesetzt werden kann&lt;br /&gt;
**Wenn ein Player als &amp;quot;Disappeared&amp;quot; erkannt wird, wird dem Sonos-System dies mitgeteilt, sodass er aus allen Listen und Controllern verschwindet&lt;br /&gt;
**Kleinere Korrektur, die eine bessere Verarbeitung der Kommunikation zwischen Fhem und dem Subprozess bewirkt&lt;br /&gt;
*2.3 (2.12.2013):&lt;br /&gt;
**Die Antwort von &#039;SetCurrentPlaylist&#039; wurde korrigiert. Dort kam vorher &#039;SetToCurrentPlaylist&#039; zurück.&lt;br /&gt;
**VolumeStep kann nun auch als Attribut definiert werden. Das fehlte in der zulässigen Liste noch.&lt;br /&gt;
**Speak kann nun auch für lokale Binary-Aufrufe konfiguriert werden.&lt;br /&gt;
**Speak kann nun einen Hash-Wert auf Basis des gegebenen Textes in den Dateinamen einarbeiten, und diese dann bei Gleichheit wiederverwenden (Caching)&lt;br /&gt;
**Sonos kann nun ein &amp;quot;set StopAll&amp;quot; oder &amp;quot;set PauseAll&amp;quot; ausführen, um alle Player/Gruppen auf einen Schlag zu stoppen/pausieren&lt;br /&gt;
**Beim Discover-Event wird nun genauer geprüft, ob sich überhaupt ein ZonePlayer gemeldet hat&lt;br /&gt;
**Die UserIDs für Napster und Spotify werden wieder korrekt ermittelt. Damit kann auch wieder ein Playlistenimport erfolgen.&lt;br /&gt;
**Loudness Einstell- und Abfragbar&lt;br /&gt;
**Bass Einstell- und Abfragbar&lt;br /&gt;
**Treble Einstell- und Abfragbar&lt;br /&gt;
**Volume kann nun auch als RampToVolume ausgeführt werden&lt;br /&gt;
*2.2 (12.10.2013):&lt;br /&gt;
**Befehlswarteschlange wieder ausgebaut. Dadurch gibt es nur noch das Reading LastActionResult, und alles wird viel zügiger ausgeführt, da Fhem nicht auf die Ausführung warten muss.&lt;br /&gt;
**TempPlaying berücksichtigt nun auch die Wiedergabe von Line-In-Eingängen (also auch Speak)&lt;br /&gt;
**Veraltete, mittlerweile unbenutzte, Readings werden nun gelöscht&lt;br /&gt;
**SetLEDState wurde hinzugefügt&lt;br /&gt;
**Die IsAlive-Überprüfung kann mit &#039;none&#039; abgeschaltet werden&lt;br /&gt;
**CurrentTempPlaying wird nicht mehr benötigt&lt;br /&gt;
*2.1:&lt;br /&gt;
**Neuen Befehl &#039;CurrentPlaylist&#039; eingeführt&lt;br /&gt;
*2.0:&lt;br /&gt;
**Neue Konzeptbasis eingebaut&lt;br /&gt;
**Man kann Gruppen auf- und wieder abbauen&lt;br /&gt;
**Es gibt neue Lautstärke- und Mute-Einstellungen für Gruppen ingesamt&lt;br /&gt;
**Man kann Button-Events definieren&lt;br /&gt;
*1.13:&lt;br /&gt;
**Neuer Abspielzustand &#039;TRANSITIONING&#039; wird berücksichtigt&lt;br /&gt;
**Der Aufruf von &#039;GetDeviceDefHash&#039; wird nun mit dem Parameter &#039;undef&#039; anstatt ohne einen Parameter durchgeführt&lt;br /&gt;
*1.12:&lt;br /&gt;
**TrackURI hinzugefügt&lt;br /&gt;
**LoadPlayList und SavePlayList können nun auch Dateinamen annehmen, um eine M3U-Datei zu erzeugen/als Abspielliste zu laden&lt;br /&gt;
**Alarme können ausgelesen, gesetzt und gelöscht werden&lt;br /&gt;
**SleepTimer kann gesetzt und ausgelesen werden&lt;br /&gt;
**Reading DailyIndexRefreshTime hinzugefügt&lt;br /&gt;
**Bei AddURIToQueue und PlayURI können jetzt auch (wie bei LoadPlayList) Spotify und Napster-Ressourcen angegeben werden&lt;br /&gt;
**Beim Erzeugen des Cover-Weblinks wird nun nur noch die Breite festgelegt, damit Nicht-Quadratische Cover auch korrekt dargestellt werden&lt;br /&gt;
**SONOS_Stringify gibt Strings nun in einfachen Anführungszeichen aus (und maskiert etwaig enthaltene im String selbst)&lt;br /&gt;
*1.11:&lt;br /&gt;
**Ein Transport-Event-Subscribing wird nur dann gemacht, wenn es auch einen Transport-Service gibt. Die Bridge z.B. hat sowas nicht.&lt;br /&gt;
**Bei PlayURITemp wird nun der Mute-Zustand auf UnMute gesetzt, und anschließend wiederhergestellt&lt;br /&gt;
**Shuffle, Repeat und CrossfadeMode können nun gesetzt und abgefragt werden. Desweiteren wird der Status beim Transport-Event aktualisiert.&lt;br /&gt;
**Umlaute bei &amp;quot;generateInfoSmmarize3&amp;quot; durch &amp;quot;sichere&amp;quot; Schreibweise ersetzt (Lautst&amp;amp;auml;rke -&amp;gt; Lautstaerke)&lt;br /&gt;
*1.10:&lt;br /&gt;
**IsAlive beendet nicht mehr den Thread, wenn der Player nicht mehr erreichbar ist, sondern löscht nur noch die Proxy-Referenzen&lt;br /&gt;
**FHEMWEB-Icons werden nur noch im Hauptthread aktualisiert&lt;br /&gt;
**Getter &#039;getBalance&#039; und Setter &#039;setBalance&#039; eingeführt.&lt;br /&gt;
**HeadphoneConnected inkl. minVolumeHeadphone und maxVolumeHeadphone eingeführt&lt;br /&gt;
**InfoSummarize um die Möglichkeit der Volume/Balance/HeadphoneConnected-Felder erweitert. Außerdem werden diese Info-Felder nun auch bei einem Volume-Event neu berechnet (und triggern bei Bedarf auch!)&lt;br /&gt;
**InfoSummarize-Features erweitert: &#039;instead&#039; und &#039;emptyval&#039; hinzugefügt&lt;br /&gt;
**IsAlive prüft nicht mehr bei jedem Durchgang bis zum Thread runter, ob die Subscriptions erneuert werden müssen &lt;br /&gt;
*1.9:&lt;br /&gt;
**RTL.it Informationen werden nun schöner dargestellt (Da steht eine XML-Struktur im Titel)&lt;br /&gt;
**Wenn kein Cover vom Sonos geliefert werden kann, wird das FHEM-Logo als Standard verwendet (da dieses sowieso auf dem Rechner vorliegt)&lt;br /&gt;
**UPnP-Fehlermeldungen eingebaut, um bei einer Nichtausführung nähere Informationen erhalten zu können&lt;br /&gt;
*1.8:&lt;br /&gt;
**Device-Removed wird nun sicher ausgeführt. Manchmal bekommt man wohl deviceRemoved-Events ohne ein vorheriges deviceAdded-Event. Dann gibt es die gesuchte Referenz nicht.&lt;br /&gt;
**Renew-Subscriptions wurden zu spät ausgeführt. Da war alles schon abgelaufen, und konnte nicht mehr verlängert werden.&lt;br /&gt;
**ZonePlayer-Icon wird nun immer beim Discover-Event heruntergeladen. Damit wird es auch wieder aktualisiert, wenn FHEM das Icon beim Update verwirft.&lt;br /&gt;
**MinVolume und MaxVolume eingeführt. Damit kann nun der Lautstärkeregelbereich der ZonePlayer festgelegt werden&lt;br /&gt;
**Umlaute beim Übertragen in das Reading State werden wieder korrekt übertragen. Das Problem waren die etwaigen doppelten Anführungsstriche. Diese werden nun maskiert.&lt;br /&gt;
**Sonos Docks werden nun auch erkannt. Dieses hat eine andere Device-Struktur, weswegen der Erkennungsprozess angepasst werden musste.&lt;br /&gt;
*1.7:&lt;br /&gt;
**Umlaute werden bei Playernamen beim Anlegen des Devices korrekt umgewandelt, und nicht in Unterstriche&lt;br /&gt;
**Renew-Subscription eingebaut, damit ein Player nicht die Verbindung zum Modul verliert&lt;br /&gt;
**CurrentTempPlaying wird nun auch sauber beim Abbrechen des Restore-Vorgangs zurückgesetzt&lt;br /&gt;
**Die Discovermechanik umgebaut, damit dieser Thread nach einem Discover nicht neu erzeugt werden muss.&lt;br /&gt;
*1.6:&lt;br /&gt;
**Speak hinzugefügt (siehe Doku im Wiki)&lt;br /&gt;
**Korrektur von PlayURITemp für Dateien, für die Sonos keine Abspiellänge zur Verfügung stellt&lt;br /&gt;
**Korrektur des Thread-Problems welches unter *Nix-Varianten auftrat (Windows war nicht betroffen)&lt;br /&gt;
*1.5:&lt;br /&gt;
**PlayURI, PlayURITemp und AddURIToQueue hinzugefügt (siehe Doku im Wiki)&lt;br /&gt;
*1.4:&lt;br /&gt;
**Exception-Handling bei der Befehlsausführung soll FHEM besser vor verschwundenen Playern schützen &lt;br /&gt;
**Variable $SONOS_ThisThreadEnded sichert die korrekte Beendigung des vorhandenen Threads, trotz Discover-Events in der Pipeline&lt;br /&gt;
**Einrückungen im Code korrigiert&lt;br /&gt;
*1.3:&lt;br /&gt;
**StopHandling prüft nun auch, ob die Referenz noch existiert&lt;br /&gt;
*1.2:&lt;br /&gt;
**Proxy-Objekte werden beim Disappearen des Player entfernt, und sorgen bei einem nachfolgenden Aufruf für eine saubere Fehlermeldung&lt;br /&gt;
**Probleme mit Anführungszeichen &amp;quot; in Liedtiteln und Artist-Angaben. Diese Zeichen werden nun ersetzt&lt;br /&gt;
**Weblink wurde mit fehlendem &amp;quot;/&amp;quot; am Anfang angelegt. Dadurch hat dieser nicht im Floorplan funktionert&lt;br /&gt;
**pingType wird nun auf Korrektheit geprüft.&lt;br /&gt;
**Play:3 haben keinen Audio-Eingang, deshalb funktioniert das Holen eines Proxy dafür auch nicht. Jetzt ist das Holen abgesichert.&lt;br /&gt;
*1.1:&lt;br /&gt;
**Ping-Methode einstellbar über Attribut &#039;pingType&#039;&lt;br /&gt;
*1.0:&lt;br /&gt;
**Initial Release&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modul &#039;&#039;&#039;SONOS&#039;&#039;&#039; ==&lt;br /&gt;
Dieses Modul erledigt die eigentliche Kommunikationsarbeit zu den ZonePlayern mittles UPnP. &lt;br /&gt;
Es startet (und läßt ihn dauerhaft laufen) einen Discovery Prozess, der alle ZonePlayer auffordert, sich zu melden, und reagiert auf entsprechende Signalisierungen.&lt;br /&gt;
Es instantiiert einen Listener und meldet diesen bei allen ZonePlayern für Abspielaktualisierungen an.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Aufruf des Discovery-Prozesses erfolgt, wird geprüft, ob der Player bereits definiert wurde. Wenn nicht, wird eine Definition erzeugt, wenn ja, dann wird die Komponente mit den neu erhaltenen Informationen aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Aufruf der Abspielaktualisierung erfolgt, so wird die entsprechene Zoneplayer-Komponente in FHEM mit den neu erhaltenen Informationen aktualisiert, und entsprechende FHEM-Events generiert.&lt;br /&gt;
&lt;br /&gt;
Wenn das Feature mit &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; verwendet wird, wird ein weiterer Listener beim entsprechenden Zoneplayer angemeldet. Mittels diesem werden Lautstärkenänderungen am Zoneplayer gemeldet umd können entsprechend umgehend korrigiert werden.&amp;lt;br &amp;gt;Als Nebeneffekt wird für jede Lautstärkenänderung auch ein Event in FHEM erzeugt (als Folge einer Aktualisierung des Readings &amp;lt;code&amp;gt;Volume&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Readings von SONOS ===&lt;br /&gt;
*&amp;lt;code&amp;gt;ZoneGroupState&amp;lt;/code&amp;gt;: Die Konfigurationsinformationen zu der aktuellen Gruppenlandschaft der Zoneplayer. Der Befehl &amp;lt;code&amp;gt;get SONOS Groups&amp;lt;/code&amp;gt; vereinfacht den Zugriff hierauf, indem es eine einfach les- und verarbeitbare Liste erzeugt.&lt;br /&gt;
*&amp;lt;code&amp;gt;UserId_Spotify&amp;lt;/code&amp;gt;: Speichert die UserId für den Spotify-Zugriff. Diese Information ist notwendig, wenn eine M3U-Datei mit Spotify-Titeln importiert werden soll, und wird automatisch ermittelt, sobald man mit dem Original-Controller einen einzelnen Titel aus Spotify in die aktuelle Abspielliste überträgt.&lt;br /&gt;
*&amp;lt;code&amp;gt;UserId_Napster&amp;lt;/code&amp;gt;: Speichert die UserId für den Napster-Zugriff. Diese Information ist notwendig, wenn eine M3U-Datei mit Napster-Titeln importiert werden soll, und wird automatisch ermittelt, sobald man mit dem Original-Controller einen einzelnen Titel aus Napster in die aktuelle Abspielliste überträgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Attribute von SONOS ===&lt;br /&gt;
*&amp;lt;code&amp;gt;pingType(none,tcp,udp,icmp,syn)&amp;lt;/code&amp;gt;: Definiert die Art, wie der Alive-Check eines Zoneplayers erfolgen soll. Die Verfahren funktionieren unterschiedlich gut. Am Ressourcensparsamsten ist &#039;&#039;icmp&#039;&#039;, benötigt aber &amp;quot;&amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;&amp;quot;-Rechte. An zweiter Stelle ist &#039;&#039;syn&#039;&#039; zu empfehlen. Die anderen Verfahren melden manchmal fehlerhafte not alives. Einfach probieren. Mittels &#039;&#039;none&#039;&#039; kann dieser Mechanismus auch deaktiviert werden.&lt;br /&gt;
*&amp;lt;code&amp;gt;targetSpeakDir&amp;lt;/code&amp;gt;: Das Verzeichnis, in dem dieses Modul die Sprachdateien von &amp;lt;code&amp;gt;Speak&amp;lt;/code&amp;gt; (siehe [http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#Set-Befehle_an_den_SONOSPLAYER Set-Befehle an den SONOSPLAYER]) ablegen soll (also die Adresse für den &#039;&#039;&#039;Schreib&#039;&#039;&#039;zugriff). Es wird empfohlen, dass dieses Verzeichnis &#039;&#039;&#039;nicht&#039;&#039;&#039; von Sonos indiziert ist.&amp;lt;br /&amp;gt;z.B. Pfade unter *Nix: &amp;lt;code&amp;gt;/home/www/Sonos&amp;lt;/code&amp;gt; oder unter Windows: &amp;lt;code&amp;gt;C:\InetPub\Sonos&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;targetSpeakURL&amp;lt;/code&amp;gt;: Die URL, unter der &#039;&#039;von außen&#039;&#039; (also aus Sicht des Zoneplayers) auf die abgelegte Sprachdatei zugegriffen werden kann (also die Adresse für den &#039;&#039;&#039;Lese&#039;&#039;&#039;zugriff). &amp;lt;br /&amp;gt;z.B. &amp;lt;code&amp;gt;\\192.168.178.45\Sonos&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;targetSpeakFileTimestamp(0,1)&amp;lt;/code&amp;gt;: Definiert, ob in dem Namen der Sprachausgabedatei ein Zeitstempel enthalten sein soll. Das sorgt dafür, dass alle Dateien beibehalten werden (da nicht mit demselben Namen überschrieben wird).&amp;lt;br /&amp;gt;Manchmal kann das auch Caching-Probleme beseitigen. In meinen Tests hat die Anzeige der in der Sprachdatei enthaltenen MP3-Tags nur mit dieser aktivierten Option sauber funktioniert, da der ZonePlayer bei mir die Tags gecached hält.&amp;lt;br /&amp;gt;Anderseits muss man sich dabei Gedanken über eine Aufräumstrategie machen, da die alten Dateien immer vorhanden bleiben.&lt;br /&gt;
*&amp;lt;code&amp;gt;targetSpeakFileHashCache(0,1)&amp;lt;/code&amp;gt;: Definiert, ob in dem Namen der Sprachausgabedatei ein Hash-Wert enthalten sein soll. Das sorgt dafür, dass die Dateien bei gleichem Text wiederverwendet werden und nicht neu generiert werden.&lt;br /&gt;
**Für diese Funktionalität wird das Perl-Modul &#039;&#039;&#039;Digest::SHA1&#039;&#039;&#039; für die Berechnung des Hash-Werts benötigt. Am einfachsten kann es bei Bedarf per CPAN installiert werden: &amp;lt;code&amp;gt;sudo cpan install Digest::SHA1&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;Speak1&amp;lt;/code&amp;gt;: Hiermit kann ein Systemaufruf definiert werden, der zu Erzeugung einer Sprachausgabe verwendet werden kann. Sobald dieses Attribut definiert wurde, ist ein entsprechender Setter am Sonosplayer verfügbar.&amp;lt;br /&amp;gt;Das Format ist:&amp;lt;br /&amp;gt;&amp;lt;Ausgabedateiendung&amp;gt;:&amp;lt;Befehlszeile&amp;gt;&lt;br /&gt;
**Es dürfen folgende Platzhalter verwendet werden:&amp;lt;br /&amp;gt;&#039;&#039;&#039;%language%&#039;&#039;&#039;: Wird durch die eingegebene Sprache ersetzt&amp;lt;br /&amp;gt;&#039;&#039;&#039;%filename%&#039;&#039;&#039;: Wird durch den kompletten Dateinamen (inkl. Dateiendung) ersetzt.&amp;lt;br /&amp;gt;&#039;&#039;&#039;%text%&#039;&#039;&#039;: Wird durch den zu übersetzenden Text ersetzt.&lt;br /&gt;
*&amp;lt;code&amp;gt;Speak2&amp;lt;/code&amp;gt;: Siehe Speak1&lt;br /&gt;
*&amp;lt;code&amp;gt;Speak3&amp;lt;/code&amp;gt;: Siehe Speak1&lt;br /&gt;
*&amp;lt;code&amp;gt;Speak4&amp;lt;/code&amp;gt;: Siehe Speak1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get-Befehle an SONOS ===&lt;br /&gt;
*&amp;lt;code&amp;gt;Groups&amp;lt;/code&amp;gt;: Liefert die aktuelle Gruppierungskonfiguration der Sonos-Systemlandschaft zurück. Das Format ist eine Komma-getrennte Liste von Listen mit Devicenamen, also z.B. &amp;lt;code&amp;gt;[Sonos_Kueche], [Sonos_Wohnzimmer, Sonos_Schlafzimmer]&amp;lt;/code&amp;gt;. In diesem Beispiel sind also zwei Gruppen definiert, von denen die erste aus einem Player und die zweite aus Zwei Playern besteht. Dabei ist die Reihenfolge innerhalb der Unterlisten wichtig, da der erste Eintrag der sogenannte Gruppenkoordinator ist (in diesem Fall also &amp;lt;code&amp;gt;Sonos_Wohnzimmer&amp;lt;/code&amp;gt;), von dem die aktuelle Abspielliste und der aktuelle Titel auf die anderen Gruppenmitglieder übernommen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Set-Befehle an SONOS ===&lt;br /&gt;
*&amp;lt;code&amp;gt;Groups &amp;lt;Gruppendefinition&amp;gt;&amp;lt;/code&amp;gt;: Setzt die aktuelle Gruppierungskonfiguration der Sonos-Systemlandschaft. Das Format ist jenes, welches auch von dem Get-Befehl &#039;&#039;Groups&#039;&#039; geliefert wird.&lt;br /&gt;
*&amp;lt;code&amp;gt;StopAll&amp;lt;/code&amp;gt;: Stoppt die Wiedergabe in allen Zonen.&lt;br /&gt;
*&amp;lt;code&amp;gt;PauseAll&amp;lt;/code&amp;gt;: Pausiert die Wiedergabe in allen Zonen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modul &#039;&#039;&#039;SONOSPLAYER&#039;&#039;&#039; ==&lt;br /&gt;
Dieses Modul dient im großen und ganzen als Platzhalter für FHEM, damit der Anwender FHEM-Konform informiert werden, bzw. steuern kann.&lt;br /&gt;
&lt;br /&gt;
Hier werden die Informationen, die vom &#039;&#039;&#039;SONOS&#039;&#039;&#039;-Modul erkannt werden, abgelegt, und die Aktualisierungs-Events erzeugt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Readings von SONOSPLAYER ===&lt;br /&gt;
Folgende Informationen werden im SONOSPLAYER als Reading abgelegt:&lt;br /&gt;
*Grundlegendes&lt;br /&gt;
**&amp;lt;code&amp;gt;presence&amp;lt;/code&amp;gt;: Erreichbarkeit des Players. Kann &amp;quot;appeared&amp;quot; oder &amp;quot;disappeared&amp;quot; sein&lt;br /&gt;
**&amp;lt;code&amp;gt;roomName&amp;lt;/code&amp;gt;: Originalname des ZonePlayers. Kann Leer- oder Sonderzeichen enthalten&lt;br /&gt;
**&amp;lt;code&amp;gt;saveRoomName&amp;lt;/code&amp;gt;: Sicherer Name des Zoneplayer. Sonderzeichen wurden in Unterstriche umgewandelt. Das Device wird beim Anlegen mit diesem Namen angelegt&lt;br /&gt;
**&amp;lt;code&amp;gt;playerType&amp;lt;/code&amp;gt;: Typbezeichnung des ZonePlayer. z.B. &amp;quot;ZP90&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;fieldType&amp;lt;/code&amp;gt;: In einer Paarung wird jedem Player vom Sonos-System ein eindeutiger FieldType zugewiesen. Dieser wird von diesem Modul für die Eindeutigkeit des Device-Namen verwendet. Bei einer Stereopaarung z.B. hat ein Player den Type &#039;LF&#039; (für Left-Front), &#039;RF&#039; (für Right-Front) oder SW (für Subwoofer); bei Surround-Komfigurationen aber auch RR (für Right-Rear) oder LR (für Left-Rear).&lt;br /&gt;
**&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt;: URL zum Informationsdokument des ZonePlayers&lt;br /&gt;
**&amp;lt;code&amp;gt;softwareRevision&amp;lt;/code&amp;gt;: Version der installierten Software. z.B. &amp;quot;3.8.4&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;serialNum&amp;lt;/code&amp;gt;: Seriennummer des ZonePlayers. Entspricht weitestgehend der MAC-Adresse. z.B. &amp;quot;00-0E-58-28-D0-F4:2&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;LastActionResult&amp;lt;/code&amp;gt;: Enthält den Namen und das Ergebnis der letzten Aktion auf dem Player. Da die Aktionen asyncron übertragen werden, kann nur hier kontrolliert werden, ob das gewünschte Ergebnis erreicht wurde.&lt;br /&gt;
**&amp;lt;code&amp;gt;Volume&amp;lt;/code&amp;gt;: Enthält im Normalfall die am Player eingestellte Laustärke zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird diese Lautstärke bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung der Lautstärke auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Mute&amp;lt;/code&amp;gt;: Enthält, wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, den aktuellen Zustand des Mute. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Mute-Zustands auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Shuffle&amp;lt;/code&amp;gt;: Enthält den aktuellen Zustand von Shuffle. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).&lt;br /&gt;
**&amp;lt;code&amp;gt;Repeat&amp;lt;/code&amp;gt;: Enthält den aktuellen Zustand von Repeat. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).&lt;br /&gt;
**&amp;lt;code&amp;gt;CrossfadeMode&amp;lt;/code&amp;gt;: Enthält den aktuellen Zustand von CrossfadeMode. Wird durch Event des Players aktualisiert (zusammen mit der Titelinformation).&lt;br /&gt;
**&amp;lt;code&amp;gt;Bass&amp;lt;/code&amp;gt;: Enthält im Normalfall den am Player eingestellten Basslevel zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird dieser Basslevel bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Basslevels auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Treble&amp;lt;/code&amp;gt;: Enthält im Normalfall den am Player eingestellten Treblelevel zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird dieser Treblelevel bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Treblelevels auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: Enthält im Normalfall die am Player eingestellte Balance zum Zeitpunkt der Erkennung. Wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, wird diese Balance bei jeder Änderung am Player mit aktualisiert. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung der Balance auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;Loudness&amp;lt;/code&amp;gt;: Enthält, wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; gesetzt wurde, den aktuellen Zustand des Loudness. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung des Loudness-Zustands auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;HeadphoneConnected&amp;lt;/code&amp;gt;: Enthält, wenn eines der beiden Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; (oder auch &amp;lt;code&amp;gt;minVolumeHeadphone&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;maxVolumeHeadphone&amp;lt;/code&amp;gt;) gesetzt wurde, den Zustand, ob ein Kopfhörer verwendet wird, oder nicht. &amp;lt;br /&amp;gt;Wenn zusätzlich noch das Attribut &amp;lt;code&amp;gt;generateVolumeEvent&amp;lt;/code&amp;gt; gesetzt ist, erzeugt jede Änderung dieses Zustands auch ein FHEM-Event. Standardmäßig ist dies aus Zeitgründen deaktiviert, da FHEM-Events an jeden(!) notify innerhalb FHEM gemeldet werden. Dies kann u.U. zu Verzögerungen bei dem ZonePlayer führen.&lt;br /&gt;
**&amp;lt;code&amp;gt;SleepTimer&amp;lt;/code&amp;gt;: Enthält die Restzeit des Sleeptimers. Diese Information wird vom Player beim Setzen und Ablaufen gemeldet, und erzeugt somit ein Event zu Beginn und Ende des Timers. Während der Timer läuft, wird hier nichts aktualisiert. Man muss also, falls benötigt, selber die verbleibende Restzeit mittels des Readings-Timestamps und diesem Wert ermitteln.&amp;lt;br /&amp;gt;Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird.&amp;lt;br /&amp;gt;Beim Ablaufen des Timers wird vom Player eine Aktualisierung auf den Wert &#039;&#039;&#039;off&#039;&#039;&#039; gesendet. Darauf kann in einem Notify-Event geprüft werden.&lt;br /&gt;
**&amp;lt;code&amp;gt;SleepTimerVersion&amp;lt;/code&amp;gt;: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten &#039;&#039;SleepTimer&#039;&#039;-Informationen. Diese Information wird Hauptsächlich intern benötigt, um beurteilen zu können, ob das Reading &#039;&#039;SleepTimer&#039;&#039; neu geladen werden muss.&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmRunning&amp;lt;/code&amp;gt;: Dieses Reading enthält &#039;&#039;1&#039;&#039;, wenn gerade ein Alarm abgespielt wird, sonst &#039;&#039;0&#039;&#039;&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmRunningID&amp;lt;/code&amp;gt;: Dieses Reading enthält die ID des verursachenden Alarms, wenn gerade ein Alarm abgespielt wird, sonst ist es leer.&lt;br /&gt;
**&amp;lt;code&amp;gt;DailyIndexRefreshTime&amp;lt;/code&amp;gt;: Enthält die aktuell gültige &#039;&#039;DailyIndexRefreshTime&#039;&#039;, zu der der Medienindex neu aufgebaut werden soll. &amp;lt;br /&amp;gt;Diese Information wird automatisch aktualisiert, wenn sie bei einem Player verändert wird, wenn das Attribut &#039;&#039;&#039;getAlarms&#039;&#039;&#039; des Player auf &#039;&#039;1&#039;&#039; gesetzt wurde.&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmList&amp;lt;/code&amp;gt;: Enthält die textuelle Repräsentation des Hashs mit den aktuell für diesen Player gültigen Alarminformationen. Diese Information wird automatisch aktualisiert, wenn das Attribut &#039;&#039;&#039;getAlarms&#039;&#039;&#039; auf &#039;&#039;1&#039;&#039; gesetzt wurde, ansonsten steht sie nicht zur Verfügung (und es kann kein Alarm angelegt, verändert und gelöscht werden). Das Format des Hashs entspricht dem, das zum Setzen oder Anpassen eines Alarms notwendig ist.&amp;lt;br /&amp;gt;Folgene Schlüssel sind dort zulässig/notwendig:&lt;br /&gt;
***&#039;&#039;&#039;Enabled(0,1)&#039;&#039;&#039;: Gibt an, ob der Alarm aktiviert ist.&lt;br /&gt;
***&#039;&#039;&#039;Volume(0..100)&#039;&#039;&#039;: Die Lautstärke, mit der der Alarm wiedergegeben werden soll.&lt;br /&gt;
***&#039;&#039;&#039;StartTime(Timstamp)&#039;&#039;&#039;: Die Uhrzeit, zu der der Alarm starten soll.&lt;br /&gt;
***&#039;&#039;&#039;Duration(Timstamp)&#039;&#039;&#039;: Die Dauer, die der Alarm laufen soll.&lt;br /&gt;
***&#039;&#039;&#039;Repeat(0,1)&#039;&#039;&#039;: Gibt an, ob die Wiedergabe wiederholt werden soll.&lt;br /&gt;
***&#039;&#039;&#039;Shuffle(0,1)&#039;&#039;&#039;: Gibt an, ob die Wiedergabe zufällig erfolgen soll.&lt;br /&gt;
***&#039;&#039;&#039;RoomUUID&#039;&#039;&#039;: Die ID der Zone, in der der Alarm wiedergegeben werden soll. Dieser Wert muss nie mit angegeben werden, da er automatisch befüllt wird (Diese Information ist durch das verwendete Fhem-Zoneplayer-Device klar).&lt;br /&gt;
***&#039;&#039;&#039;ProgramURI&#039;&#039;&#039;: Die abzuspielende URI.&lt;br /&gt;
***&#039;&#039;&#039;ProgramMetaData&#039;&#039;&#039;: Die Metadaten zu der abzuspielenden URI.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Once(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm nur einmal laufen soll. Wenn hier eine &#039;&#039;1&#039;&#039; angegeben wurde, dann werden die anderen &#039;&#039;Recurrence&#039;&#039;-Angaben ignoriert.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Monday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Montag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Tuesday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Dienstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Wednesday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Mittwoch laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Thursday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Donnerstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Friday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Freitag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Saturday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Samstag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;Recurrence_Sunday(0,1)&#039;&#039;&#039;: Gibt an, dass der Alarm jeden Sonntag laufen soll. Kann mit den anderen Tagesangaben kombiniert werden.&lt;br /&gt;
***&#039;&#039;&#039;IncludeLinkedZones(0,1)&#039;&#039;&#039;: Gibt an, ob die aktuell verlinkten Zonen diesen Alarm ebenfall abspielen sollen.&lt;br /&gt;
***&#039;&#039;&#039;Beispiel-Hash&#039;&#039;&#039;: { Enabled =&amp;gt; 1, Volume =&amp;gt; 12, StartTime =&amp;gt; &#039;16:00:00&#039;, Duration =&amp;gt; &#039;00:15:00&#039;, Repeat =&amp;gt; 0, Shuffle =&amp;gt; 0, ProgramURI =&amp;gt; &#039;x-rincon-buzzer:0&#039;, ProgramMetaData =&amp;gt; &#039; &#039;, Recurrence_Once =&amp;gt; 0, Recurrence_Monday =&amp;gt; 1, Recurrence_Tuesday =&amp;gt; 1, Recurrence_Wednesday =&amp;gt; 1, Recurrence_Thursday =&amp;gt; 1, Recurrence_Friday =&amp;gt; 1, Recurrence_Saturday =&amp;gt; 0, Recurrence_Sunday =&amp;gt; 0, IncludeLinkedZones =&amp;gt; 0 }&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmListIDs&amp;lt;/code&amp;gt;: Enthält die Hash-Schlüssel der Alarme als kommaseparierte Liste. Dieses Reading gibt es Hauptsächlich zur Vereinfachung des Zugriffs auf das Reading &#039;&#039;&#039;AlarmList&#039;&#039;&#039;. Damit hat man direkt die Anzahl und Primärschlüssel im Zugriff.&lt;br /&gt;
**&amp;lt;code&amp;gt;AlarmListVersion&amp;lt;/code&amp;gt;: Dieses Reading enthält die Information über die aktuelle Version der gespeicherten Alarm-Informationen. Diese Information wird Hauptsächlich intern benötigt, um beurteilen zu können, ob die Alarminformationen neu geladen werden müssen.&lt;br /&gt;
**&amp;lt;code&amp;gt;ZoneGroupID&amp;lt;/code&amp;gt;: Die ID des Gruppenkoordinators plus eine laufende Nummer. Sollte die Gruppe nur aus einem Mitglied bestehen, so ist es die eigene ID (=UDN).&lt;br /&gt;
**&amp;lt;code&amp;gt;ZoneGroupName&amp;lt;/code&amp;gt;: Der Name der aktuellen Gruppe&lt;br /&gt;
**&amp;lt;code&amp;gt;ZonePlayerUUIDsInGroup&amp;lt;/code&amp;gt;: Eine Liste der in der aktuellen Gruppe befindlichen Zoneplayer.&lt;br /&gt;
**&amp;lt;code&amp;gt;LineInConnected&amp;lt;/code&amp;gt;: Gibt an, ob der Line-In-Eingang angeschlossen ist, oder nicht. Wird bei Änderung am Player automatisch aktualisiert, und erzeugt damit auch ein Event.&lt;br /&gt;
*Infos zum aktuellen Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTitle&amp;lt;/code&amp;gt;: Titelbezeichnung des aktuellen Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;currentArtist&amp;lt;/code&amp;gt;: Interpret des aktuellen Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;currentAlbum&amp;lt;/code&amp;gt;: Albumname des aktuellen Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;currentAlbumArtist&amp;lt;/code&amp;gt;: Interpret des Albums. Kann z.B. auch &amp;quot;(compilations)&amp;quot; sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentOriginalTrackNumber&amp;lt;/code&amp;gt;: Nummer des aktuellen Titels bezogen auf das Album&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrack&amp;lt;/code&amp;gt;: Nummer des aktuellen Titels in der Abspielliste&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackURI&amp;lt;/code&amp;gt;: Dateipfad des aktuellen Titels in der Abspielliste. Gültige Formate siehe PlayURI.&lt;br /&gt;
**&amp;lt;code&amp;gt;currentTrackDuration&amp;lt;/code&amp;gt;: Länge des aktuellen Titels im Format H:MM:SS&lt;br /&gt;
**&amp;lt;code&amp;gt;currentSender&amp;lt;/code&amp;gt;: Senderbezeichnung, wenn es ein Radiostream ist&lt;br /&gt;
**&amp;lt;code&amp;gt;currentSenderCurrent&amp;lt;/code&amp;gt;: Zusatzinformationen zur Radiosendung, meist der Programmtitel wie &#039;Pop&amp;amp;Weck&#039;&lt;br /&gt;
**&amp;lt;code&amp;gt;currentSenderInfo&amp;lt;/code&amp;gt;: Zusatzinforationen zur Radiosendung, meist der Titel des aktuellen Liedes&lt;br /&gt;
**&amp;lt;code&amp;gt;currentAlbumArtURI&amp;lt;/code&amp;gt;: Relativer Verzeichnis-Pfad im lokalen FHEM (physisch). Beginnt momentan mit &amp;quot;www&amp;quot;&lt;br /&gt;
*Infos zum nächsten Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTitle&amp;lt;/code&amp;gt;: Titelbezeichnung des nächsten Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;nextArtist&amp;lt;/code&amp;gt;: Interpret des nächsten Titels&lt;br /&gt;
**&amp;lt;code&amp;gt;nextAlbum&amp;lt;/code&amp;gt;: Albumname des nächsten Titel&lt;br /&gt;
**&amp;lt;code&amp;gt;nextAlbumArtist&amp;lt;/code&amp;gt;: Interpret des Albums des nächsten Titels. Kann z.B. auch &amp;quot;(compilations)&amp;quot; sein.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextOriginalTrackNumber&amp;lt;/code&amp;gt;: Nummer des nächsten Titels bezogen auf das Album&lt;br /&gt;
**&amp;lt;code&amp;gt;nextAlbumArtURI&amp;lt;/code&amp;gt;: Relativer Verzeichnis-Pfad im lokalen FHEM (physisch). Beginnt momentan mit &amp;quot;www&amp;quot;&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackURI&amp;lt;/code&amp;gt;: Dateipfad des nächsten Titels in der Abspielliste. Gültige Formate siehe PlayURI.&lt;br /&gt;
**&amp;lt;code&amp;gt;nextTrackDuration&amp;lt;/code&amp;gt;: Länge des nächsten Titels im Format H:MM:SS&lt;br /&gt;
*Generierte Informationen&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize1&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize2&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize3&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;infoSummarize4&amp;lt;/code&amp;gt;: Frei zusammenstellbare Informationszeile. Zum Format siehe [InfoSummarize]&lt;br /&gt;
**&amp;lt;code&amp;gt;currentStreamAudio&amp;lt;/code&amp;gt;: Boolean. 1 wenn gerade ein Radiostream läuft, sonst 0. Momentan faktisch Negation zu &amp;lt;currentNormalAudio&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;currentNormalAudio&amp;lt;/code&amp;gt;: Boolean. 1 wenn gerade ein normaler Titel läuft, sonst 0. Momentan faktisch Negation zu &amp;lt;currentStreamAudio&amp;gt;&lt;br /&gt;
*Infos zum Gesamtstatus&lt;br /&gt;
**&amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt;: Aktueller Abspielstatus. Kann &amp;quot;ERROR&amp;quot;, &amp;quot;STOPPED&amp;quot;, &amp;quot;PLAYING&amp;quot; oder &amp;quot;PAUSED_PLAYBACK&amp;quot; sein. Wobei ERROR heißt, dass es keine Verbindung zum Player gibt&lt;br /&gt;
**&amp;lt;code&amp;gt;numberOfTracks&amp;lt;/code&amp;gt;: Anzahl der momentan in der Abspielliste befindlichen Titel&lt;br /&gt;
&lt;br /&gt;
=== Attribute von SONOSPLAYER ===&lt;br /&gt;
*&amp;lt;code&amp;gt;disable(0,1)&amp;lt;/code&amp;gt;: Deaktiviert die Verarbeitung von Events dieses Devices&lt;br /&gt;
*&amp;lt;code&amp;gt;VolumeStep&amp;lt;/code&amp;gt;: Definiert die Schrittweite für den Aufruf von &amp;lt;code&amp;gt;VolumeU&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;VolumeD&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;generateVolumeSlider(0,1)&amp;lt;/code&amp;gt;: Aktiviert einen Slider für die Lautstärkeneinstellung auf der Detailansicht. Standardmäßig ist dieser aktiviert (=1).&lt;br /&gt;
*&amp;lt;code&amp;gt;generateVolumeEvent(0,1)&amp;lt;/code&amp;gt;: Aktiviert die Generierung eines Events bei Lautstärkeänderungen, wenn mindestens eines der Attribute &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minVolumeHeadphone&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolumeHeadphone&amp;lt;/code&amp;gt; definiert ist. Standardmäßig ist dies deaktiviert (=0), um die Zeitverzögerung so gering wie möglich zu halten.&lt;br /&gt;
*&amp;lt;code&amp;gt;generateSomethingChangedEvent(0,1)&amp;lt;/code&amp;gt;: Bestimmt, ob ein Event mit dem Namen &#039;SomethingChanged&#039; generiert werden soll, wenn überhaupt ein Event generiert wurde. Das ist nützlich, wenn man auf eine beliebige Änderung des Player reagieren möchte.&lt;br /&gt;
*&amp;lt;code&amp;gt;generateInfoSummarize1&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize1&#039; mit dem angegebenen Format.&lt;br /&gt;
*&amp;lt;code&amp;gt;generateInfoSummarize2&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize2&#039; mit dem angegebenen Format.&lt;br /&gt;
*&amp;lt;code&amp;gt;generateInfoSummarize3&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize3&#039; mit dem angegebenen Format.&lt;br /&gt;
*&amp;lt;code&amp;gt;generateInfoSummarize4&amp;lt;/code&amp;gt;: Generiert das Reading &#039;InfoSummarize4&#039; mit dem angegebenen Format.&lt;br /&gt;
*&amp;lt;code&amp;gt;stateVariable(TransportState,NumberOfTracks,Track,TrackDuration,Title,Artist,Album,&amp;lt;br /&amp;gt;&lt;br /&gt;
	OriginalTrackNumber,AlbumArtist,Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,&amp;lt;br /&amp;gt;&lt;br /&gt;
	AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,nextTitle,nextArtist,&amp;lt;br /&amp;gt;&lt;br /&gt;
	nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,CrossfadeMode,&amp;lt;br /&amp;gt;&lt;br /&gt;
	Balance,HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,&amp;lt;br /&amp;gt;&lt;br /&gt;
	SoftwareRevision,SerialNum,InfoSummarize1,InfoSummarize2,InfoSummarize3,InfoSummarize4)&amp;lt;/code&amp;gt;: Legt fest, welcher Variablenwert in den State geschrieben werden soll.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVolume(0..100)&amp;lt;/code&amp;gt;: Legt die untere Grenze für die einstellbare Lautstärke dieses ZonePlayers fest. Diese kann auch mit keinem Controller unterschritten werden, da diese überwacht wird.&lt;br /&gt;
**Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading &#039;&#039;&#039;Volume&#039;&#039;&#039; am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.&amp;lt;br /&amp;gt;Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden.&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn eine untere oder obere Grenze festgelegt wird, werden für Lautstärkenänderungen auch Events erzeugt. Es ist unbedingt darauf zu achten, dass etwaige Notify-Definitionen zügig bearbeitet werden, da sonst das Sonos-System träge werden könnte.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVolume(0..100)&amp;lt;/code&amp;gt;: Legt die obere Grenze für die einstellbare Lautstärke dieses ZonePlayers fest. Diese kann auch mit keinem Controller überschritten werden, da diese überwacht wird.&lt;br /&gt;
**Wenn eine untere oder obere Grenze festgelegt wurde, so wird das Reading &#039;&#039;&#039;Volume&#039;&#039;&#039; am entsprechenden SonosPlayer bei jeder Änderung am Player aktualisiert.&amp;lt;br /&amp;gt;Möchte man also immer die aktuelle Lautstärke kennen, aber keine Enschränkung machen, dann sollte der Wert von &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; gesetzt werden. Desweiteren werden gleichzeitig auch Änderungen an der Balance aktualisiert, da diese mit übertragen werden.&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn eine untere oder obere Grenze festgelegt wird, werden für Lautstärkenänderungen auch Events erzeugt. Es ist unbedingt darauf zu achten, dass etwaige Notify-Definitionen zügig bearbeitet werden, da sonst das Sonos-System träge werden könnte.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVolumeHeadphone(0..100)&amp;lt;/code&amp;gt;: Legt die untere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest.&lt;br /&gt;
**&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Es gelten die gleichen Bedingungen und Hinweise wie bei &amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVolumeHeadphone(0..100)&amp;lt;/code&amp;gt;: Legt die obere Grenze für die einstellbare Lautstärke dieses ZonePlayers im Kopfhörerbetrieb fest.&lt;br /&gt;
**&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Es gelten die gleichen Bedingungen und Hinweise wie bei &amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;getAlarms(0,1)&amp;lt;/code&amp;gt;: Meldet sich bei Playern für die Aktualisierung von Alarm-Informationen an. Diese werden bei Änderung direkt aktualisiert, und erzeugen dementsprechend ein Fhem-Event. Gleichzeitig wird hiermit die &#039;&#039;&#039;DailyIndexRefreshTime&#039;&#039;&#039; mit aktualisiert.&lt;br /&gt;
*&amp;lt;code&amp;gt;buttonEvents &amp;amp;lt;Time:Pattern&amp;amp;gt;[ &amp;amp;lt;Time:Pattern&amp;amp;gt; ...]&amp;lt;/code&amp;gt;: Definiert, dass bei einer bestimten Tastenfolge am Player ein Event erzeugt werden soll. Die Definition der Events erfolgt als Tupel: Der erste Teil vor dem Doppelpunkt ist die Zeit in Sekunden, die berücksichtigt werden soll, der zweite Teil hinter dem Doppelpunkt definiert die Abfolge der Buttons, die für dieses Event notwendig sind.&lt;br /&gt;
**Folgende Button-Kürzel sind zulässig:&lt;br /&gt;
***&#039;&#039;&#039;M&#039;&#039;&#039;: Der Mute-Button (&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Der Mute-Button am SonosPlayer ist seit Firmware 4.2 ein Play/Pause/Next-Button, der kein Mute-Event mehr erzeugt, meine Beschwerde an Sonos, dass es nicht benutzerfreundlich ist, einen Mute-Symbolisierten Button mit Play/Pause zu belegen, wurde im großen und ganzen ignoriert)&lt;br /&gt;
***&#039;&#039;&#039;H&#039;&#039;&#039;: Die Headphone-Buchse&lt;br /&gt;
***&#039;&#039;&#039;U&#039;&#039;&#039;: Up-Button (Lautstärke Hoch)&lt;br /&gt;
***&#039;&#039;&#039;D&#039;&#039;&#039;: Down-Button (Lautstärke Runter)&lt;br /&gt;
**Das Event, das geworfen wird, heißt &amp;lt;code&amp;gt;ButtonEvent&amp;lt;/code&amp;gt;, der Wert ist die definierte Tastenfolge&amp;lt;br /&amp;gt;Z.B.: &amp;lt;code&amp;gt;2:MM&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Hier wird definiert, dass ein Event erzeugt werden soll, wenn innerhalb von 2 Sekunden zweimal die Mute-Taste gedrückt wurde. Das damit erzeugte Event hat dann den Namen &amp;lt;code&amp;gt;ButtonEvent&amp;lt;/code&amp;gt;, und den Wert &amp;lt;code&amp;gt;MM&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get-Befehle an den SONOSPLAYER ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Es wurden ein paar Get-Möglichkeiten entfernt. Diese Befehle (wie z.B. &#039;&#039;Volume&#039;&#039;) können mittlerweile direkt geliefert werden, und müssen nicht angefordert werden. Übrig geblieben sind nur noch solche Anweisungen, die Informationen beschaffen, die nicht automatisch geliefert werden (können).&lt;br /&gt;
*&amp;lt;code&amp;gt;CurrentTrackPosition&amp;lt;/code&amp;gt;: Liefert die aktuelle Zeitposition im Lied&lt;br /&gt;
*&amp;lt;code&amp;gt;Favourites&amp;lt;/code&amp;gt;: Liefert eine Liste mit den Namen aller gespeicherten Sonos-Favoriten. Das Format der Liste ist eine Komma-Separierte Liste, bei der die Namen in doppelten Anführungsstrichen stehen. z.B. &amp;quot;Liste 1&amp;quot;,&amp;quot;Eintrag 2&amp;quot;,&amp;quot;Test&amp;quot;&lt;br /&gt;
*&amp;lt;code&amp;gt;Playlists&amp;lt;/code&amp;gt;: Liefert eine Liste aller gespeicherten Playlists. Diese Anfrage liefert bei allen Zoneplayern die gleiche Liste zurück. Das Format ist eine Komma-Separierte Liste, bei der die Einträge in doppelten Anführungszeichen stehen z.B. &amp;quot;Liste 1&amp;quot;,&amp;quot;Liste 2&amp;quot;,&amp;quot;Test&amp;quot;&lt;br /&gt;
*&amp;lt;code&amp;gt;Radios&amp;lt;/code&amp;gt;: Liefert eine Liste aller gespeicherten Radiosender (Favoriten). Diese Anfrage liefert bei allen Zoneplayern die gleiche Liste zurück. Das Format ist eine Komma-Separierte Liste, bei der die Einträge in doppelten Anführungszeichen stehen z.B. &amp;quot;Sender 1&amp;quot;,&amp;quot;Sender 2&amp;quot;,&amp;quot;Test&amp;quot;&lt;br /&gt;
*&amp;lt;code&amp;gt;Alarm &amp;lt;ID&amp;gt;&amp;lt;/code&amp;gt;: Ausnahmefall. Diese Get-Anweisung liefert direkt ein Hash zurück, in welchem die Informationen des Alarms mit der gegebenen ID enthalten sind. Es ist die Kurzform für &amp;lt;code&amp;gt;eval(ReadingsVal(&amp;lt;Devicename&amp;gt;, &#039;Alarmlist&#039;, ()))-&amp;gt;{&amp;lt;ID&amp;gt;};&amp;lt;/code&amp;gt;, damit sich nicht jeder ausdenken muss, wie er jetzt am einfachsten an die Alarm-Informationen rankommen kann.&lt;br /&gt;
*&amp;lt;code&amp;gt;EthernetPortStatus &amp;lt;PortNumber&amp;gt;&amp;lt;/code&amp;gt;: Liefert den Ethernet-Portstatus des gegebenen Ports (&#039;0&#039; oder &#039;1&#039;). Kann &#039;Active&#039; oder &#039;Inactive&#039; liefern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Set-Befehle an den SONOSPLAYER ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis!&#039;&#039;&#039;: Alle Set-Befehle liefern kein direktes Ergebnis zurück. Sollte ein Ergebnis generiert werden (meistens eine Statusmeldung, bzw. was genau getan wurde), so landet dies nach der Ausführung in dem Reading &amp;lt;code&amp;gt;LastActionResult&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;Play&amp;lt;/code&amp;gt;: Startet die Wiedergabe&lt;br /&gt;
*&amp;lt;code&amp;gt;Pause&amp;lt;/code&amp;gt;: Pausiert die Wiedergabe&lt;br /&gt;
*&amp;lt;code&amp;gt;Stop&amp;lt;/code&amp;gt;: Stoppt die Wiedergabe&lt;br /&gt;
*&amp;lt;code&amp;gt;Next&amp;lt;/code&amp;gt;: Springt zum Anfang des nächsten Liedes&lt;br /&gt;
*&amp;lt;code&amp;gt;Previous&amp;lt;/code&amp;gt;: Springt zum Anfang des vorhergehenden Liedes. Das ist ein anderes Verhalten als mit einem Controller. Der Controller springt zunächst an den Anfang des aktuellen Liedes, und erst beim erneuten Drücken an den Anfang des vorhergehenden Liedes.&lt;br /&gt;
*&amp;lt;code&amp;gt;LoadPlaylist &amp;lt;Playlistname&amp;gt; [ListeVorherLeeren]&amp;lt;/code&amp;gt;: Lädt die benannte Playliste in die aktuelle Abspielliste. Der Parameter kann/muss URL-Encoded sein, um auch Leer- und Sonderzeichen angeben zu können. Wenn der Parameter &#039;&#039;ListeVorherLeeren&#039;&#039; mit &#039;&#039;1&#039;&#039; angegeben wurde, wird die aktuelle Abspielliste vor dem Import geleert. Standardmäßig wird hier eine &#039;&#039;1&#039;&#039; angenommen.&lt;br /&gt;
**&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Es kann auch ein Dateiname angegeben werden, um eine übliche M3U-Datei aus dem Filesystem zu laden. Dieser muss mit &amp;quot;&#039;&#039;&#039;file:&#039;&#039;&#039;&amp;quot; eingeleitet werden. Beispiel: &amp;quot;&#039;&#039;&#039;file:c:/Test.m3u&#039;&#039;&#039;&amp;quot;.&amp;lt;br /&amp;gt;Innerhalb der Datei selbst werden bislang folgende Sonderformate unterstützt:&lt;br /&gt;
***&#039;&#039;&#039;Spotify:&#039;&#039;&#039; Titel aus Spotify werden mit dem Kürzel &#039;&#039;x-sonos-spotify:&#039;&#039; begonnen.&lt;br /&gt;
***&#039;&#039;&#039;Napster/Rhapsody:&#039;&#039;&#039; Titel aus Napster/Rhapsody werden mit dem Kürzel &#039;&#039;npsdy:&#039;&#039; begonnen.&lt;br /&gt;
***&#039;&#039;Hinweise&#039;&#039;: Die Benutzernamen für diese Importe, die zum Zeitpunkt des Import bekannt sein müssen, müssen zuvor dem System bekannt gemacht werden. Ansonsten erscheint eine entsprechende Fehlermeldung.&amp;lt;br /&amp;gt;So kann der Benutzername für eines der Systeme bekannt gemacht werden:&lt;br /&gt;
****Aktuelle Abspielliste eines Players leeren&lt;br /&gt;
****Einen beliebigen Titel aus dem gewünschten Anbieter in die aktuelle Abspielliste einfügen. Dabei ist zu beachten, dass man das direkt aus der Auswahl des Anbietes heraus macht (also nicht über eine Playliste, Favoriten o.ä. Direktzugriffe)&lt;br /&gt;
****Nun gibt es ein neues Reading am zentralen Sonos-Device, welches den Benutzernamen enthält. Um diesen Dauerhaft bereitzustellen, muss der Zustand mittels &#039;&#039;save&#039;&#039; gespeichert werden.&lt;br /&gt;
*&amp;lt;code&amp;gt;SavePlaylist &amp;lt;Playlistname&amp;gt;&amp;lt;/code&amp;gt;: Speichert die aktuelle Abspielliste unter dem angegebenen Namen als Playliste ab. Dabei wird eine etwaig bestehende Liste gleichen Namens überschrieben. Der Parameter kann/muss URL-Encoded sein, um auch Leer- und Sonderzeichen angeben zu können.&lt;br /&gt;
**&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Es kann auch ein Dateiname angegeben werden, um eine übliche M3U-Datei im Filesystem zu erzeugen. Dieser muss mit &amp;quot;&#039;&#039;&#039;file:&#039;&#039;&#039;&amp;quot; eingeleitet werden. Beispiel: &amp;quot;&#039;&#039;&#039;file:c:/Test.m3u&#039;&#039;&#039;&amp;quot;.&amp;lt;br /&amp;gt;&#039;&#039;Nähere Informationen zum möglichen Inhalt der Datei siehe unter &#039;&#039;&#039;LoadPlayList&#039;&#039;&#039;.&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;EmptyPlaylist&amp;lt;/code&amp;gt;: Löscht die aktuelle Abspielliste&lt;br /&gt;
*&amp;lt;code&amp;gt;CurrentPlaylist&amp;lt;/code&amp;gt;: Setzt den Abspielmodus auf die aktuelle Abspielliste, startet aber keine Wiedergabe (z.B. nach dem Hören eines Radiostreams, wo die aktuelle Abspielliste zwar noch existiert, aber gerade &amp;quot;nicht verwendet&amp;quot; wird)&lt;br /&gt;
*&amp;lt;code&amp;gt;StartFavourite &amp;lt;FavouriteName&amp;gt; [NoStart]&amp;lt;/code&amp;gt;: Startet den angegebenen Favoriten. Der Name bezeichnet einen Eintrag in der Sonos-Favoritenliste. Der Parameter sollte/kann URL-Encoded werden um auch Spezialzeichen zu ermöglichen.&lt;br /&gt;
**Wenn das Wort &#039;NoStart&#039; als zweiter Parameter angegeben wurde, dann wird der Favorit geladen und fertig vorbereitet, aber nicht explizit gestartet.&lt;br /&gt;
**Folgende Unterscheidungen werden auf Basis des Typs des Sonos-Favoriten gemacht:&lt;br /&gt;
***Bei einem Playlist-Typ (z.B. Sonos-Playlist, Spotify-Playlist, usw.) wird die aktuelle Abspielliste geleert, mit dem neuen Inhalt befüllt und die Wiedergabe gestartet&lt;br /&gt;
***Bei einem Einzel-Eintrag (Direkter Titel, Radiosender, Spotify-Titel, usw) wird die aktuelle Abspielliste nicht angetastet, sondern der aktuelle Abspieleintrag entsprechend angepasst und gestartet&lt;br /&gt;
*&amp;lt;code&amp;gt;LoadRadio &amp;lt;Radiostationname&amp;gt;&amp;lt;/code&amp;gt;: Lädt den benannten Radiosender, genauer gesagt, den benannten Radiofavoriten. Dabei wird die bestehende Abspielliste beibehalten, aber deaktiviert. Der Parameter kann/muss URL-Encoded sein, um auch Leer- und Sonderzeichen angeben zu können.&lt;br /&gt;
*&amp;lt;code&amp;gt;Mute &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den Mute-Zustand auf den angegebenen Wert. Der Wert kann on oder off sein. Liefert als Ergebnis den neuen Zustand.&lt;br /&gt;
*&amp;lt;code&amp;gt;MuteT&amp;lt;/code&amp;gt;: Schaltet den Mute-Zustand um. Liefert als Ergebnis den neuen Zustand.&lt;br /&gt;
*&amp;lt;code&amp;gt;Shuffle&amp;lt;/code&amp;gt;: Legt den Zustand des Shuffle-Zustands fest. Liefert den aktuell gültigen Shuffle-Zustand.&lt;br /&gt;
*&amp;lt;code&amp;gt;Repeat&amp;lt;/code&amp;gt;: Legt den Zustand des Repeat-Zustands fest. Liefert den aktuell gültigen Repeat-Zustand.&lt;br /&gt;
*&amp;lt;code&amp;gt;CrossfadeMode&amp;lt;/code&amp;gt;: Legt den Zustand des Crossfade-Mode fest. Liefert den aktuell gültigen Crossfade-Mode.&lt;br /&gt;
*&amp;lt;code&amp;gt;LEDState&amp;lt;/code&amp;gt;: Legt den Zustand der LED fest. Liefert den aktuell gültigen Zustand zurück.&lt;br /&gt;
*&amp;lt;code&amp;gt;SleepTimer&amp;lt;/code&amp;gt;: Legt den aktuellen SleepTimer fest. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS). Zum Deaktivieren darf der Zeitstempel nur Nullen enthalten oder das Wort &#039;off&#039;.&lt;br /&gt;
*&amp;lt;code&amp;gt;DailyIndexRefreshTime&amp;lt;/code&amp;gt;: Legt die aktuell gültige &#039;&#039;DailyIndexRefreshTime&#039;&#039; fest, zu der der Medienindex neu aufgebaut werden soll. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS).&lt;br /&gt;
*&amp;lt;code&amp;gt;VolumeD&amp;lt;/code&amp;gt;: Verringert die Lautstärke um 10 Einheiten.&lt;br /&gt;
*&amp;lt;code&amp;gt;VolumeU&amp;lt;/code&amp;gt;: Erhöht die Lautstärke um 10 Einheiten.&lt;br /&gt;
*&amp;lt;code&amp;gt;Volume &amp;lt;VolumeLevel&amp;gt; [RampType]&amp;lt;/code&amp;gt;: Setzt die Lautstärke auf den angegebenen Wert. Der kann eine relative Angabe mittels + oder - sein. Dann wird um die entsprechende Höhe erhöht oder verringert. Wird eine relative Lautstärke angegeben, so kann diese mit einem folgenden Prozentzeichen als anteilige Änderung ausgeführt werden (z.B. +20%). Liefert als Ergebnis die neue Lautstärke.&amp;lt;br /&amp;gt;Als optionaler Parameter ist ein Ramptype zulässig. Mögliche Werte sind 1 (SLEEP_TIMER_RAMP_TYPE), 2 (AUTOPLAY_RAMP_TYPE) und 3 (ALARM_RAMP_TYPE). Die Werte entsprechen verschiedenen Mustern bei der Geschwindigkeit nach oben oder unten.&lt;br /&gt;
*&amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: Setzt die Balance auf den angegebenen Wert. Der Wert kann zwischen -100 (voll links) und 100 (voll rechts) liegen. Gibt die wirklich eingestellte Balance als Ergebnis zurück.&lt;br /&gt;
*&amp;lt;code&amp;gt;VolumeSave &amp;lt;VolumeLevel&amp;gt;&amp;lt;/code&amp;gt;: Setzt die Lautstärke auf den angegebenen Wert. Der kann eine relative Angabe mittels + oder - sein. Dann wird um die entsprechende Höhe erhöht oder verringert. Liefert als Ergebnis die neue Lautstärke. Zusätzlich wird die alte Lautstärke in einem Reading abgelegt, um sie wiederherstellen zu können.&lt;br /&gt;
*&amp;lt;code&amp;gt;VolumeRestore&amp;lt;/code&amp;gt;: Stellt die mittels VolumeSave gespeicherte Lautstärke wieder her.&lt;br /&gt;
*&amp;lt;code&amp;gt;CurrentTrackPosition &amp;lt;TimePosition&amp;gt;&amp;lt;/code&amp;gt;: Setzt die aktuelle Zeitposition im Lied&lt;br /&gt;
*&amp;lt;code&amp;gt;Track &amp;lt;TrackNumber&amp;gt;&amp;lt;/code&amp;gt;: Stellt das Lied an der Position TrackNumber in der Abspielliste als aktuelles Lied ein. Dabei kann als Tracknummer der Wert &amp;lt;code&amp;gt;Random&amp;lt;/code&amp;gt; angegeben werden. Dann wird eine zufällige Tracknummer ausgewählt (diese Ermittlung erfolgt nach Setzen der aktuellen Abspielliste, und erfolgt somit korrekt auf die gesamte zur Verfügung stehende Liste).&lt;br /&gt;
*&amp;lt;code&amp;gt;PlayURI &amp;lt;SongURI&amp;gt; [Volume]&amp;lt;/code&amp;gt;: Spielt die angegebene MP3-Datei mit der optional verwendbaren Lautstärke ab. Die Datei muss vom SonosPlayer aus direkt erreichbar (und natürlich auch lesbar) sein, braucht aber nicht indiziert worden zu sein.&amp;lt;br /&amp;gt;Folgende Formate werden momentan akzeptiert:&lt;br /&gt;
**&#039;&#039;&#039;Sonos-Devicenamen&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;Sonos_Wohnzimmer&amp;lt;/code&amp;gt;. Der Devicename muss natürlich bereits definiert worden sein. Es wird der AV-Eingang des gewählten Zoneplayer-Device als Wiedergabestrom gewählt.&lt;br /&gt;
**&#039;&#039;&#039;UNC-Pfade&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;\\Server\Freigabe\Dateiname.mp3&amp;lt;/code&amp;gt;. Erkennungsmerkmal ist der Doppelte Backslash am Anfang. Darstellung aller üblichen Informationen inkl. Cover u.ä.&lt;br /&gt;
**&#039;&#039;&#039;Web-Streams&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;http://www.energyradio.de/hot&amp;lt;/code&amp;gt;. Erkennungsmerkmal ist die Angabe von &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; am Anfang. Es werden keine Cover aber Streaminformationen dargestellt.&lt;br /&gt;
**&#039;&#039;&#039;Sonstige URI-Typen&#039;&#039;&#039;: z.B. &amp;lt;code&amp;gt;x-sonos-spotify:spotify:track:0jkLC0noG4A4i9lob2gSc3?sid=9&amp;amp;flags=0&amp;lt;/code&amp;gt;. Darstellung aller üblichen Informationen. Die verfügbaren Formate können durch Sonos erweitert/verändert werden.&amp;lt;br /&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das Format der URI, das hier angegeben werden kann, ist stets identisch zum Reading &#039;&#039;&#039;currentTrackURI&#039;&#039;&#039;, das bedeutet, dass die URI, die man dort sieht, hier direkt wieder angegeben werden kann.&amp;lt;br /&amp;gt;Es gibt lediglich die oben benannte Vereinfachung für MP3-Dateien und Radio-URLs (aber auch dafür könnte man das offizielle Format angeben).&lt;br /&gt;
*&amp;lt;code&amp;gt;PlayURITemp &amp;lt;SongURI&amp;gt; [Volume]&amp;lt;/code&amp;gt;: Spielt die angegebene MP3-Datei mit der optional verwendbaren Lautstärke als temporäre Datei ab. Nachdem die Datei abgespielt wurde, werden die vorhergehenden Abspielparameter (Lautstärke, Titel, Position usw.) wiederhergestellt. Im Normalfall geht es also direkt dort weiter, wo die Unterbrechung stattgefunden hat. Die Datei muss vom SonosPlayer aus direkt erreichbar (und natürlich auch lesbar) sein, braucht aber nicht indiziert worden zu sein. Für eine ordnungsgemäße Wiederherstellung ist es notwendig, dass dies eine Datei und kein Stream ist, da die Abspiellänge vorher bekannt sein muss.&lt;br /&gt;
**Für Streams (genauer: Für Dateien, deren Abspiellänge nicht ermittelt werden kann) ist dieser Aufruf identisch zu &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt;, es wird im Anschluß nichts wiederhergestellt.&lt;br /&gt;
**Zulässige Formate stehen unter &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt;.&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Zum Ermitteln der Liedlänge wird u.U. eine zusätzliche Library verwendet (Wenn die Info nicht vom SonosPlayer bereitgestellt wird): &amp;lt;code&amp;gt;MP3::Info&amp;lt;/code&amp;gt;. Diese Library muss zusätzlich in das FHEM-Lib-Verzeichnis kopiert werden.&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-)&lt;br /&gt;
*&amp;lt;code&amp;gt;AddURIToQueue &amp;lt;SongURI&amp;gt;&amp;lt;/code&amp;gt;: Fügt die angegebene Datei in die aktuelle Abspielliste an die Stelle hinter dem aktuellen Titel hinzu. Ändert nichts am aktuell abgespielten Titel.&amp;lt;br /&amp;gt;Zulässige Formate stehen unter &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt;.&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Es kann auch ein Radio-Stream hinzugefügt werden. Dieser wird auch normal abgespielt, wenn er dran ist. Dabei ist zu beachten, dass dieser Titel nie enden wird, und die Titel- und Interpretinformationen nicht dargestellt werden. Auch nicht die sonst üblichen Streaminformationen. Diese werden nur angezeigt, wenn der Stream mittels &amp;lt;code&amp;gt;PlayURI&amp;lt;/code&amp;gt; direkt (ohne Verwendung der Queue) abgespielt wird.&lt;br /&gt;
*&amp;lt;code&amp;gt;Speak &amp;lt;Volume&amp;gt; &amp;lt;Language&amp;gt; &amp;lt;Text&amp;gt;&amp;lt;/code&amp;gt;: Wandelt den angegebenen Text mittels Google in gesprochenen Text um und spielt diesen mittels &amp;lt;code&amp;gt;PlayURITemp&amp;lt;/code&amp;gt; ab. An dieser Stelle ist zu berücksichtigen, dass der Text-Parameter auch Leerzeichen enthalten darf (und damit nach FHEM-Regeln eigentlich mehrere Parameter sind). Deswegen steht die Lautstärke vorne als nicht optionaler Parameter.&lt;br /&gt;
**&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: In dem generierten MP3 wird ein ID3-Tag eingetragen, in dem die Umlaute wohl leider nicht sauber ankommen. Deswegen ist im Sonos-Controller die Anzeige dieser Umlaute bei den Sprachdurchsagen auch nicht korrekt.&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Für die korrekte Funktionsweise müssen die Attribute &amp;lt;code&amp;gt;targetSpeakDir&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;targetSpeakURL&amp;lt;/code&amp;gt; am Sonos-Device konfiguriert sein (siehe [http://www.fhemwiki.de/wiki/Sonos_Anwendungsbeispiel#Attribute_von_SONOS Attribute von SONOS]).&lt;br /&gt;
**Mögliche Sprachparameter können bei Google herausgefunden werden. Diese sind z.B. &#039;&#039;&#039;de&#039;&#039;&#039;, &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;es&#039;&#039;&#039;, &#039;&#039;&#039;fr&#039;&#039;&#039;, &#039;&#039;&#039;it&#039;&#039;&#039;...&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Die Textlänge ist durch Google begrenzt. Wenn die Größe überschritten wird, erhält man eine Fehlermeldung im Log: &amp;quot;&#039;&#039;404 Not found&#039;&#039;&amp;quot;. Leider erhielt ich in meinen Tests unterschiedliche Ergebnisse bzgl. der verwendbaren Länge (ca. 100 Zeichen). Einfach probieren.&lt;br /&gt;
**&#039;&#039;&#039;Achtung!&#039;&#039;&#039;: Wenn bereits eine temporäre Ausgabe erfolgt, so wird die Aufforderung mit einer entsprechenden Meldung verworfen. Es kann nur eine geben :-)&lt;br /&gt;
*&amp;lt;code&amp;gt;Alarm &amp;lt;Create|Update|Delete&amp;gt; &amp;lt;ID&amp;gt; &amp;lt;Datenhash&amp;gt;&amp;lt;/code&amp;gt;: Diese Anweisung wird für die Bearbeitung der Alarme verwendet:&lt;br /&gt;
**&#039;&#039;&#039;Create&#039;&#039;&#039;: Erzeugt einen neuen Alarm-Eintrag mit den übergebenen Hash-Daten. Der Rückgabewert ist die ID des neuen Alarms.&lt;br /&gt;
**&#039;&#039;&#039;Update&#039;&#039;&#039;: Aktualisiert den Alarm mit der übergebenen ID und den angegebenen Hash-Daten.&lt;br /&gt;
**&#039;&#039;&#039;Delete&#039;&#039;&#039;: Löscht den Alarm-Eintrag mit der übergebenen ID.&lt;br /&gt;
**&#039;&#039;&#039;Datenhash&#039;&#039;&#039;: Das Format ist ein Perl-Hash und wird mittels der eval-Funktion interpretiert. Eine Beschreibung befindet sich bei der Dokumentation des Readings &#039;&#039;&#039;AlarmList&#039;&#039;&#039; oder den folgenden Beispielen.&lt;br /&gt;
**&#039;&#039;&#039;Beispiele&#039;&#039;&#039;:&lt;br /&gt;
***&amp;lt;code&amp;gt;set Sonos_Wohnzimmer Alarm Create 0 { Enabled =&amp;amp;gt; 1, Volume =&amp;amp;gt; 35, StartTime =&amp;amp;gt; &#039;00:00:00&#039;, Duration =&amp;amp;gt; &#039;00:15:00&#039;, Repeat =&amp;amp;gt; 0, Shuffle =&amp;amp;gt; 0, ProgramURI =&amp;amp;gt; &#039;x-rincon-buzzer:0&#039;, ProgramMetaData =&amp;amp;gt; &#039; &#039;, Recurrence_Once =&amp;amp;gt; 0, Recurrence_Monday =&amp;amp;gt; 1, Recurrence_Tuesday =&amp;amp;gt; 1, Recurrence_Wednesday =&amp;amp;gt; 1, Recurrence_Thursday =&amp;amp;gt; 1, Recurrence_Friday =&amp;amp;gt; 1, Recurrence_Saturday =&amp;amp;gt; 0, Recurrence_Sunday =&amp;amp;gt; 0, IncludeLinkedZones =&amp;amp;gt; 0 }&amp;lt;/code&amp;gt;: Erzeugt einen neuen Alarm mit den angegebenen Informationen. Die neue ID wird als Ergebnis zurückgegeben.&lt;br /&gt;
***&amp;lt;code&amp;gt;set Sonos_Wohnzimmer Alarm Update 17 { Shuffle =&amp;amp;gt; 1 }&amp;lt;/code&amp;gt;: Aktualisiert den Alarm mit der ID &#039;&#039;17&#039;&#039;, und passt dort Shuffle auf &#039;&#039;Aktiv&#039;&#039; an.&lt;br /&gt;
***&amp;lt;code&amp;gt;set Sonos_Wohnzimmer Alarm Delete 17&amp;lt;/code&amp;gt;: Löscht den Alarm mit der ID &#039;&#039;17&#039;&#039;.&lt;br /&gt;
*&amp;lt;code&amp;gt;AddMember &amp;lt;Devicename&amp;gt;&amp;lt;/code&amp;gt;: Fügt dem Device das übergebene Device als Gruppenmitglied hinzu. Die Wiedergabe des aktuellen Devices bleibt erhalten, und wird auf das angegebene Device mit übertragen.&lt;br /&gt;
*&amp;lt;code&amp;gt;RemoveMember &amp;lt;Devicename&amp;gt;&amp;lt;/code&amp;gt;: Entfernt dem Device das übergebene Device, sodass die beiden keine Gruppe mehr bilden. Die Wiedergabe des aktuellen Devices läuft normal weiter. Das abgetrennte Device stoppt seine Wiedergabe, und hat keine aktuelle Abspielliste mehr (seit Sonos Version 4.2 hat der Player wieder die Playliste von vorher aktiv).&lt;br /&gt;
*&amp;lt;code&amp;gt;GroupVolume &amp;lt;VolumeLevel&amp;gt;&amp;lt;/code&amp;gt;: Setzt die Gruppenlautstärke. Das dafür verwendete Lautstärkenverhältnis muss zuvor einmal mittels def Anweisung &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; festgelegt worden sein.&lt;br /&gt;
**&#039;&#039;Hinweis&#039;&#039;: Wenn man &#039;&#039;&#039;GroupVolume&#039;&#039;&#039; aufruft, ohne vorher &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; aufgerufen zu haben, wird nur die Lautstärke des Players verändert, für den man den Aufruf durchführt.&lt;br /&gt;
*&amp;lt;code&amp;gt;SnapshotGroupVolume&amp;lt;/code&amp;gt;: Legt das Lautstärkeverhältnis der aktuellen Player der Gruppe für folgende &#039;&#039;&#039;GroupVolume&#039;&#039;&#039;-Aufrufe fest. Dieses festgelegte Verhältnis wird bis zum nächsten Aufruf von &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; beibehalten.&lt;br /&gt;
**&#039;&#039;Hinweis&#039;&#039;: Das einzelne Verstellen von Zoneplayer-Laustärken mittels &#039;&#039;&#039;Volume&#039;&#039;&#039; wird nicht im bereits gespeicherten Lautstärkenverhältnis aktualisiert/widergespiegelt. Hat man also nachträglich die Lautstärke eines einzelnen Players geändert (auch über den Controller), so muss &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; erneut aufgerufen werden, damit das Verhältnis bei einer weiteren Gruppenlautstärkenänderung wieder erhalten bleibt (ansonsten wird das alte Verhältnis vor der Lautstärkeänderung wiederhergestellt).&lt;br /&gt;
**&#039;&#039;Hinweis&#039;&#039;: Dieser Aufruf muss vor einem eventuellen Aufruf von &#039;&#039;&#039;GroupVolume&#039;&#039;&#039; erfolgen, da sonst nur die Lautstärke des Players verändert, für den man den Aufruf durchführt.&lt;br /&gt;
**&#039;&#039;Beispiel&#039;&#039; für eine Gruppe mit stark verschiedenen Lautstärken:&lt;br /&gt;
***Aufruf von &#039;&#039;&#039;SnapshotGroupVolume&#039;&#039;&#039; =&amp;gt; Aktuelles Lautstärkeverhältnis wird gespeichert&lt;br /&gt;
***Aufruf von &#039;&#039;&#039;GroupVolume 2&#039;&#039;&#039; =&amp;gt; Gruppe wird sehr leise gestellt, dabei sieht das relative Lautstärkeverhältnis fast gleich aus, da sich die Abstände immer weiter annähern&lt;br /&gt;
***Aufruf von &#039;&#039;&#039;GroupVolume 35&#039;&#039;&#039; =&amp;gt; Gruppe wird laut gestellt, dabei kommt wieder das vorhergehende Lautstärkeverhältnis zum tragen&lt;br /&gt;
*&amp;lt;code&amp;gt;GroupMute &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den Mute-Zustand für die komplette Gruppe in einem Schritt. Der Wert kann on oder off sein.&lt;br /&gt;
*&amp;lt;code&amp;gt;Reboot&amp;lt;/code&amp;gt;: Führt für den Zoneplayer einen Neustart durch.&lt;br /&gt;
*&amp;lt;code&amp;gt;Wifi &amp;lt;State&amp;gt;&amp;lt;/code&amp;gt;: Setzt den WiFi-Zustand des Players. Kann &#039;off&#039;, &#039;persist-off&#039; oder &#039;on&#039; sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definition der InfoSummarize ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
infoSummarizeX := &amp;lt;NormalAudio&amp;gt;:sumElem:&amp;lt;/NormalAudio&amp;gt; &amp;lt;StreamAudio&amp;gt;:sumElem:&amp;lt;/StreamAudio&amp;gt;|&lt;br /&gt;
	:sumElem:&lt;br /&gt;
sumElem := &amp;lt;:variable:[ prefix=&amp;quot;:text:&amp;quot;][ suffix=&amp;quot;:text:&amp;quot;][ instead=&amp;quot;:text:&amp;quot;]&lt;br /&gt;
	[ ifempty=&amp;quot;:text:&amp;quot;][ emptyval=&amp;quot;:text:&amp;quot;]/&amp;gt;&lt;br /&gt;
variable := TransportState|NumberOfTracks|Track|TrackDuration|Title|Artist|Album|&lt;br /&gt;
	OriginalTrackNumber|AlbumArtist|Sender|SenderCurrent|SenderInfo|StreamAudio|NormalAudio|&lt;br /&gt;
	AlbumArtURI|nextTrackDuration|nextTrackURI|nextAlbumArtURI|nextTitle|nextArtist|&lt;br /&gt;
	nextAlbum|nextAlbumArtist|nextOriginalTrackNumber|Volume|Mute|Shuffle|Repeat|&lt;br /&gt;
	CrossfadeMode|Balance|HeadphoneConnected|SleepTimer|Presence|RoomName|SaveRoomName|&lt;br /&gt;
	PlayerType|Location|SoftwareRevision|SerialNum|InfoSummarize1|InfoSummarize2|&lt;br /&gt;
	InfoSummarize3|InfoSummarize4&lt;br /&gt;
text := [Beliebiger Text ohne doppelte Anführungszeichen]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Unterscheidung zwischen &amp;lt;code&amp;gt;&amp;lt;NormalAudio&amp;gt;&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;&amp;lt;StreamAudio&amp;gt;&amp;lt;/code&amp;gt; liegt bei der anliegenden Musikquelle. Gestreamte Audioquellen habe nur einen kleineren Set an Informationen vorliegen, während bei einer &amp;quot;normalen&amp;quot; Musikquelle z.B. eine Unterscheidung zwischen Artist und Title gemacht wird, und im Gegenzug z.B. kein Sendername existiert.&amp;lt;br /&amp;gt;&lt;br /&gt;
Man kann diese Unterscheidung auch weglassen, und direkt die Variablenausgaben hinschreiben. Dann gilt der Code für beide Musikquellenarten gleichermaßen (u.U. sind dann einige Felder nicht sinnvoll bzw. gar nicht gefüllt).&lt;br /&gt;
&lt;br /&gt;
Die Tag-Erweiterungen &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;suffix&amp;lt;/code&amp;gt; werden jeweils vor bzw. hinter den Feldwert in die Ausgabe gesetzt, wenn es einen Feldwert zum Ausgeben gibt. &amp;lt;br /&amp;gt;&lt;br /&gt;
Die Erweiterung &amp;lt;code&amp;gt;instead&amp;lt;/code&amp;gt; wird anstatt des Feldwerts ausgegeben, wenn normalerweise der Feldwert ausgegeben werden würde (abhängig davon, ob der Feldwert als &#039;&#039;empty&#039;&#039; angesehen wird, oder nicht).&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Erweiterung &amp;lt;code&amp;gt;ifempty&amp;lt;/code&amp;gt; wird eingesetzt, wenn es gerade &#039;&#039;keinen&#039;&#039; Feldinhalt gibt. In diesem Fall werden natürlich auch keine Pre- und Suffixe sowie Instead-Angaben ausgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Erweiterung &amp;lt;code&amp;gt;emptyval&amp;lt;/code&amp;gt; legt fest, was neben einem undefinierten Feldwert noch als &#039;&#039;leer&#039;&#039; gelten soll. Dies ist interessant, wenn man z.B. den Zahlwert &#039;&#039;0&#039;&#039; als &#039;&#039;leer&#039;&#039; festlegen möchte.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beim Definieren dieser Erweiterungen ist zu beachten, dass keine doppelten Anführungszeichen angegeben werden. Diese zerstören die weitere, interne Verarbeitung durch FHEM (Irgendwas ist immer :-)&lt;br /&gt;
Desweiteren können Verweise auf andere &amp;lt;code&amp;gt;InfoSummarize&amp;lt;/code&amp;gt;-Felder nur in aufsteigender Reihenfolge erfolgen. Es sind also keine Vorwärtsreferenzen oder Rekursionen möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlende Kommandos ==&lt;br /&gt;
Sollte eine Steuerungsmöglichkeit oder Information fehlen, oder anderes gewünscht sein, dann einfach eine Nachricht ins Forum. Meistens läßt sich da was machen :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ideenpipeline ===&lt;br /&gt;
Folgende Ideen sind bereits in der gedanklichen Pipeline. Aber alles Schritt für Schritt und der Reihe nach:&lt;br /&gt;
*&#039;&#039;&#039;Momentan Leer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Erledigte Ideen:&lt;br /&gt;
*&#039;&#039;&#039;Zwischendurchsage&#039;&#039;&#039;: Eine Datei abspielen, und danach wieder an der alten Stelle mit der alten Lautstärke weiterspielen (In Version 1.5 hinzugekommen)&lt;br /&gt;
*&#039;&#039;&#039;Beliebige MP3s in die Queue legen oder abspielen&#039;&#039;&#039;: Entgegen dem Controllergefühl kann man sehr wohl völlig frei abspielbare Dateien in der Queue haben. Es kann nur sein, das man kein Cover oder ähnliches angezeigt bekommt (noch zu testen). (In Version 1.5 hinzugekommen, Cover funktionieren wie immer)&lt;br /&gt;
*&#039;&#039;&#039;Beliebige Radiostationen abspielen&#039;&#039;&#039;: Hier gilt das gleich wie für die MP3s. (In Version 1.5 hinzugekommen, Cover und Streaminformationen funktionieren beim Direktabspielen, aus der Queue heraus wird nur der Stream abgespielt)&lt;br /&gt;
*&#039;&#039;&#039;Lautstärkegrenzen festlegen&#039;&#039;&#039;: Damit soll festgelegt werden können, in welchen Grenzen die Lautstärke überhaupt verändert werden kann. Das soll in der entsprechenden Zone natürlich auch für die normalen Sonos-Controller gelten. Dabei werden explizit &#039;&#039;keine&#039;&#039; Readings im FHEM aktualisiert, da eine Lautstärkeänderung sonst von der Verarbeitungsgeschwindigkeit von FHEM (inkl. seiner Notifies) abhängig wäre. (In Version 1.8 hinzugekommen)&lt;br /&gt;
*&#039;&#039;&#039;Zonentopologie verwenden/anpassen&#039;&#039;&#039;: Es soll eine Speichermöglichkeit für die aktuelle Topologie geschaffen werden, und auch eine neue Topologie gesetzt werden können. Ich stelle mir da eine Art von &amp;quot;Szenen&amp;quot; vor die man nach Bedarf setzen und dann natürlich auch steuern kann. Diese Szenen sollen den Gruppierungszustand aller verfügbaren ZonePlayer repräsentieren (können), also wer mit wem in einer Gruppe ist, und wer der jeweilige Koordinator ist (nur dieser kann die Steuerung entgegennehmen, und für die gesamte Gruppe ausführen). (In Version 2.0 hinzugekommen)&lt;br /&gt;
*&#039;&#039;&#039;Button-Events&#039;&#039;&#039;: Es soll eine Möglichkeit zum direkten Reagieren auf Tastenevents am Player existieren. Man soll verschiedene Tastensequenzen festlegen können, die dann Fhem-Events erzeugen, auf die man reagieren kann. (In Version 2.0 hinzugekommen)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Hier können mit der Zeit ein paar Beispiele eingestellt werden, um die Möglichkeiten zu verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zum Loggen aller Aktionen auf allen Playern ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define FileLog_Sonos_Actions FileLog /path/to/log/Sonos_Actions-%Y-%m.log \&lt;br /&gt;
		Sonos_.*:.*LastActionResult.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hiermit wird jede Aktion, die, durch Fhem verursacht, an die Player gesendet wurde, mitgeschrieben. Sehr praktisch für Fehlersuche, bzw. die Kontrolle darüber, was eigentlich von Fhem aus so auf den Playern gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zum automatischen Abspielen einer Liste nach dem Einschalten eines Players ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer_Appeared_Notify notify Sonos_Wohnzimmer:presence:.appeared { \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer LoadPlaylist R.%%20Spielliste&amp;quot; ;; \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer Volume 15&amp;quot; ;; \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer Track random&amp;quot; ;; \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Wohnzimmer Play&amp;quot; \&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird auf das Event &#039;&#039;&#039;presence: appeared&#039;&#039;&#039; reagiert und eine Playlist geladen (hier mit Leerzeichen im Namen, darum mittels &amp;quot;&amp;lt;code&amp;gt;%20&amp;lt;/code&amp;gt;&amp;quot; HTML-kodiert, was wiederum wegen FHEM-Notify auf &amp;quot;&amp;lt;code&amp;gt;%%20&amp;lt;/code&amp;gt;&amp;quot; kodiert werden muss). Anschließend wird die Lautstärke gesetzt, ein Titel ausgewählt (zufällig) und das Abspielen gestartet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Verstärkerschaltung auf Basis des Player-Zustands ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define Sonos_Wohnzimmer_GoPlaying_Notify notify Sonos_Wohnzimmer:transportState.*PLAYING { \&lt;br /&gt;
			fhem &amp;quot;delete wohnzimmer_Sonos_Ton_Off_Timer&amp;quot; ;; \&lt;br /&gt;
			if (Value(&#039;wohnzimmer_Sonos_Ton&#039;) ne &#039;on&#039;) { \&lt;br /&gt;
				fhem &amp;quot;set wohnzimmer_Sonos_Ton on&amp;quot; \&lt;br /&gt;
			} \&lt;br /&gt;
		}&lt;br /&gt;
define Sonos_Wohnzimmer_GoNotPlaying_Notify notify \&lt;br /&gt;
		Sonos_Wohnzimmer:transportState.*(STOPPED|PAUSED_PLAYBACK) { \&lt;br /&gt;
			fhem &amp;quot;delete wohnzimmer_Sonos_Ton_Off_Timer&amp;quot;;; \&lt;br /&gt;
			fhem &amp;quot;define wohnzimmer_Sonos_Ton_Off_Timer at +00:05:00 \&lt;br /&gt;
				set wohnzimmer_Sonos_Ton off&amp;quot; \&lt;br /&gt;
		}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird beim Wechsel des &amp;lt;code&amp;gt;transportState&amp;lt;/code&amp;gt; auf &amp;quot;&amp;lt;code&amp;gt;PLAYING&amp;lt;/code&amp;gt;&amp;quot; der Verstärker angeschaltet, und beim Wechsel auf &amp;quot;&amp;lt;code&amp;gt;STOPPED&amp;lt;/code&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;code&amp;gt;PAUSED_PLAYBACK&amp;lt;/code&amp;gt;&amp;quot; ein Timer zum Ausschalten des Verstärkers in 5 Minuten definiert.&amp;lt;br /&amp;gt;Der Timer ist notwendig, da beim Wechsel zwischen einem &amp;quot;normalen&amp;quot; Titel und einem Radiostream ein kurzer Zwischenwechsel auf &amp;quot;&amp;lt;code&amp;gt;STOPPED&amp;lt;/code&amp;gt;&amp;quot; erfolgt, und ich nicht den Verstärker innerhalb von ein paar Sekunden aus- und wieder einschalten will.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für das Loggen des gerade abgespielten Titels ===&lt;br /&gt;
&amp;lt;pre&amp;gt;define FileLog_Sonos_Wohnzimmer FileLog /etc/fhem/log/Sonos_Wohnzimmer-%Y-%m.log \&lt;br /&gt;
		Sonos_Wohnzimmer:infoSummarize2:.{2,}&lt;br /&gt;
attr FileLog_Sonos_Wohnzimmer room Sonos&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird bei jedem Wechsel des Titels oder des Abspielzustands ein Eintrag ins Log geschrieben. Damit kann man, auch bei einem Radiosender, verfolgen, welche Titel zu welcher Zeit so über den Player gelaufen sind :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Stummschaltung bei einem Anruf ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15&lt;br /&gt;
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0&lt;br /&gt;
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Trigger auf &#039;call&#039; existiert nur, damit ausgehende Telefonate beim Beenden nicht die Lautstärke verändern. Das passiert, weil das Disconnected-Event auch nach ausgehenden Anrufen kommt.&amp;lt;br /&amp;gt;Das Beispiel kann man natürlich noch beliebig erweitern, vielleicht etwas mit Anrufererkennung usw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Anrufsignalisierung per MP3 bei einem Anruf ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define fritzBox_anrufstartringsong_notify notify fritzBox:.*ring set Sonos_Wohnzimmer \&lt;br /&gt;
		PlayURITemp \\Server\Audio\RingRingRing.mp3 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird bei Anruf die angegebene MP3-Datei temporär mit der Lautstärke 30 eingeblendet. Wenn die Datei abgespielt wurde, wird der vorherige Zustand im Player wiederhergestellt, und es geht weiter, wo unterbrochen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für beide Varianten beim Telefonanruf gleichzeitig ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define fritzBox_anrufstartring_notify notify fritzBox:.*ring set Sonos_Wohnzimmer VolumeSave 15 \&lt;br /&gt;
		;; set Sonos_Wohnzimmer PlayURITemp \\Server\Audio\RingRingRing.mp3 30&lt;br /&gt;
define fritzBox_anrufstartcall_notify notify fritzBox:.*call set Sonos_Wohnzimmer VolumeSave +0&lt;br /&gt;
define fritzBox_anrufende_notify notify fritzBox:.*disconnect set Sonos_Wohnzimmer VolumeRestore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel soll nur die Kombinationsmöglichkeiten verdeutlichen, und hat mehr spielerischen Character.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Sprachdurchsage auf Basis eines Notify ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define wohnzimmer_Tastenfeld_1_Notify notify wohnzimmer_Tastenfeld_1 set Sonos_Wohnzimmer Speak \&lt;br /&gt;
		45 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll.&lt;br /&gt;
define wohnzimmer_Tastenfeld_2_Notify notify wohnzimmer_Tastenfeld_2 set Sonos_Wohnzimmer Speak \&lt;br /&gt;
		+10 de Hier dann die Textnachricht, wie sie auf dem Player ausgegeben werden soll.&lt;br /&gt;
define wohnzimmer_Tastenfeld_3_Notify notify wohnzimmer_Tastenfeld_3 set Sonos_Wohnzimmer Speak \&lt;br /&gt;
		+0 en Hello, this is a short message.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1: Hier wird auf Basis eines Notify (hier ein FS20-Taster) eine Textnachricht auf Deutsch mit der Lautstärke 45 auf dem SonosPlayer ausgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
2: Hier wird eine deutsche Textnachricht mit 10 Einheiten lauter als aktuell eingestellt ausgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
3: Hier wird eine englische Textnachricht mit der gleichen Lautstärke wie aktuell eingestellt ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für das Reagieren auf Tastenevents ===&lt;br /&gt;
Hier ein Beispiel, wie man die Tasten an einem Play5 (und natürlich auch an jedem anderen Player) zu einer einfachen, autarken Steuerung programmieren kann.&lt;br /&gt;
&lt;br /&gt;
Grundlagen, die ich zur allgemeinen Vereinfachung in meiner &amp;lt;code&amp;gt;99_myUtils.pm&amp;lt;/code&amp;gt; habe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Wird benötigt, da ein reDefine nur einen Befehl aufrufen kann&lt;br /&gt;
sub pauseMuteOff($) {&lt;br /&gt;
  my ($devName) = @_;&lt;br /&gt;
&lt;br /&gt;
  if (defined($main::defs{$devName})) {&lt;br /&gt;
    fhem(&amp;quot;set $devName Pause&amp;quot;);&lt;br /&gt;
    fhem(&amp;quot;set $devName Mute Off&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Löscht ein Define, wenn es existiert. Damit kann man dynamische AT-Defines löschen, &lt;br /&gt;
# ohne zu wissen, ob sie überhaupt existieren&lt;br /&gt;
sub deleteDefineIfExists($) {&lt;br /&gt;
  my ($devName) = @_;&lt;br /&gt;
&lt;br /&gt;
  if (defined($main::defs{$devName})) {&lt;br /&gt;
    fhem(&amp;quot;delete $devName&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Definiert ein define neu; Heisst, es wird, wenn es bereits existiert, gelöscht und neu angelegt&lt;br /&gt;
sub reDefine($$) {&lt;br /&gt;
  my ($devName, $define) = @_;&lt;br /&gt;
&lt;br /&gt;
  deleteDefineIfExists($devName);&lt;br /&gt;
  fhem(&#039;define &#039;.$devName.&#039; &#039;.$define);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attribut am Sonosplayer-Device:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Sonos_Schlafzimmer buttonEvents 1:MM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notify-Defines, die die Steuerung übernehmen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Sonos_Schlafzimmer_WantPlaying_Notify notify Sonos_Schlafzimmer:ButtonEvent:.MM \&lt;br /&gt;
	set Sonos_Schlafzimmer Play&lt;br /&gt;
define Sonos_Schlafzimmer_WantStopPlaying notify Sonos_Schlafzimmer:Mute.*1 \&lt;br /&gt;
	{ reDefine(&#039;Schlafzimmer_Sonos_Stop_Timer&#039;, &#039;at +00:00:30 \&lt;br /&gt;
		{ pauseMuteOff(&amp;quot;Sonos_Schlafzimmer&amp;quot;) }&#039;) }&lt;br /&gt;
define Sonos_Schlafzimmer_WantStopPlayingOff notify Sonos_Schlafzimmer:Mute.*0 \&lt;br /&gt;
	{ deleteDefineIfExists(&#039;Schlafzimmer_Sonos_Stop_Timer&#039;) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird mittels des Attributs &amp;lt;code&amp;gt;buttonEvents&amp;lt;/code&amp;gt; ein Event bei zweimaligen Drücken von &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;ute innerhalb von 1 Sekunde definiert. &lt;br /&gt;
Anschließend wird auf dieses Event reagiert, indem der Player mit der Wiedergabe beginnen soll.&lt;br /&gt;
Desweiteren wird auf das Ändern von Mute reagiert, indem beim Aktivieren von Mute (also einmal drücken) ein Timer gestartet wird, der nach 30 Sekunden die Wiedergabe anhält, und den Mute-Zustand wieder zurücksetzt. Das letzte notify existiert nur, damit man das Beenden der Wiedergabe innerhalb der 30 Sekunden noch verhindern kann.&lt;br /&gt;
&lt;br /&gt;
Hier ist zu beachten, dass diese Events natürlich nicht unterscheiden können, ob das ganze am Player selbst oder über einen Controller geschaltet wurde. Von beiden Stellen aus kann diese Funktionalität verursacht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für einen Offline-Sprachsynthetisierer ===&lt;br /&gt;
Man kann mit den Attributen &#039;&#039;Speak1&#039;&#039;, &#039;&#039;Speak2&#039;&#039;, &#039;&#039;Speak3&#039;&#039; und &#039;&#039;Speak4&#039;&#039; am zentralen Sonos-Device Kommandozeilen definieren, die einen Text in eine Sounddatei umwandeln.&lt;br /&gt;
Hier soll dies am Beispiel von &#039;&#039;espeak&#039;&#039; verdeutlicht werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wav:/usr/bin/espeak -v %language% -w %filename% &amp;quot;%text%&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst muss das Ausgabedateiformat definiert werden, damit die internen Funktionen entsprechend reagieren können. Anschließend wird die Befehlszeile mit den entsprechenden Platzhaltern angegeben.&lt;br /&gt;
Hier muss beachtet werden, dass der Platzhalter &#039;&#039;%language%&#039;&#039; mit dem zweiten Parameter der Fhem-Befehlseingabe gefüllt wird. In diesem Beispiel muss man dort also &#039;&#039;german&#039;&#039; angeben (anstatt &#039;&#039;de&#039;&#039; bei Google), um eine deutsche Ausgabe zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel hat den kleinen Nachteil, dass die Ausgabe in einer WAV-Datei erfolgt, die keinerlei Tag-Informationen tragen kann. Um das zu ändern, kann man einen Konverter nachschalten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mp3:/usr/bin/espeak -v %language% --stdout &amp;quot;%text%&amp;quot; | /usr/bin/avconv -i - %filename%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird die Ausgabe von &#039;&#039;espeak&#039;&#039; direkt in das MP3-Format umgewandelt, und intern mit den entsprechenden Tags versehen. Hier ist allerdings der Nachteil, dass es etwas länger dauert (bei mir ca. 1-3 Sekunden).&lt;br /&gt;
&lt;br /&gt;
Die in diesem Beispiel verwendeten Pakete können unter Debian mittels der Anweisungen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install espeak&lt;br /&gt;
sudo apt-get install ffmpeg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
installiert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zu InfoSummarize ===&lt;br /&gt;
Standard, wie er angelegt wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
InfoSummarize1 = &amp;lt;NormalAudio&amp;gt;&amp;lt;Artist prefix=&amp;quot;(&amp;quot; suffix=&amp;quot;)&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;Title prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot; ifempty=&amp;quot;[Keine Musikdatei]&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;Album prefix=&amp;quot; vom Album &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot;/&amp;gt;&amp;lt;/NormalAudio&amp;gt; \&lt;br /&gt;
	&amp;lt;StreamAudio&amp;gt;&amp;lt;Sender suffix=&amp;quot;:&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;SenderCurrent prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039; -&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;SenderInfo prefix=&amp;quot; &amp;quot;/&amp;gt;&amp;lt;/StreamAudio&amp;gt;&lt;br /&gt;
InfoSummarize2 = &amp;lt;TransportState/&amp;gt;&amp;lt;InfoSummarize1 prefix=&amp;quot; =&amp;gt; &amp;quot;/&amp;gt;&lt;br /&gt;
InfoSummarize3 = &amp;lt;Volume prefix=&amp;quot;Lautstärke: &amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;Mute instead=&amp;quot; ~ Kein Ton&amp;quot; ifempty=&amp;quot; ~ Ton An&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;\&lt;br /&gt;
	 ~ Balance: &amp;lt;Balance ifempty=&amp;quot;Mitte&amp;quot; emptyval=&amp;quot;0&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;HeadphoneConnected instead=&amp;quot; ~ Kopfhörer aktiv&amp;quot; ifempty=&amp;quot; ~ Kein Kopfhörer&amp;quot; \&lt;br /&gt;
		emptyval=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass man auf andere InfoSummarize-Felder verweisen darf, solange man diese nur in aufsteigender Reihenfolge verwendet. Rekursionen oder Vorwärtrsreferenzen werden nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Beispiel, um die Informationen des nächsten Titels zusammenzufassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
InfoSummarize4 = &amp;lt;NormalAudio&amp;gt;Nächster Titel: &amp;lt;nextArtist prefix=&amp;quot;(&amp;quot; suffix=&amp;quot;)&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;nextTitle prefix=&amp;quot; &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot; ifempty=&amp;quot;[Keine Musikdatei]&amp;quot;/&amp;gt;\&lt;br /&gt;
	&amp;lt;nextAlbum prefix=&amp;quot; vom Album &#039;&amp;quot; suffix=&amp;quot;&#039;&amp;quot;/&amp;gt;&amp;lt;/NormalAudio&amp;gt;\&lt;br /&gt;
	&amp;lt;StreamAudio&amp;gt;Kein nächster Titel ermittelbar&amp;lt;/StreamAudio&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Cover-Anzeige des nächsten Titels ===&lt;br /&gt;
Mit diesem Beispiel wird gezeigt, wie man sich einen Weblink für die Anzeige des Covers des nächsten Titels erzeugen kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define NextAlbumArt_Wohnzimmer weblink image fhem/icons/SONOSPLAYER/Sonos_Wohnzimmer_NextAlbumArt&lt;br /&gt;
attr NextAlbumArt_Wohnzimmer group Wohnzimmer&lt;br /&gt;
attr NextAlbumArt_Wohnzimmer htmlattr width=&amp;quot;200&amp;quot;&lt;br /&gt;
attr NextAlbumArt_Wohnzimmer room Sonos&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für das Übertragen eines Titels an einen anderen Player ===&lt;br /&gt;
Mein Sohn hat öfter den Wunsch, einen gerade im Wohnzimmer laufenden Titel auch in seine eigene Abspielliste zu bekommen. Der Weg am Sonos-Controller über eine gespeicherte Playliste ist dabei sehr umständlich.&lt;br /&gt;
Ich habe ein 8-fach Sensorfeld an der Wohnzimmerwand, wo ich ein Feld dafür programmiert habe, das Reading &#039;&#039;currentTrackURI&#039;&#039; mittels der Set-Anweisung &#039;&#039;AddURIToQueue&#039;&#039; in die aktuelle Abspielliste meines Sohnes zu packen.&lt;br /&gt;
Das ist natürlich nichts besonderes, aber vielleicht für den einen oder anderen auch eine nette Idee:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define wohnzimmer_Sensorfeld_Notify notify wohnzimmer_Sensorfeld { \&lt;br /&gt;
	fhem &amp;quot;set Sonos_Sohnemann AddURIToQueue &amp;quot;.\&lt;br /&gt;
		ReadingsVal(&amp;quot;Sonos_Wohnzimmer&amp;quot;, &amp;quot;currentTrackURI&amp;quot;, &amp;quot;&amp;quot;) \&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Code Snippets]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DLCD&amp;diff=7254</id>
		<title>DLCD</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DLCD&amp;diff=7254"/>
		<updated>2014-08-12T20:32:02Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Daten sammeln und formatiert auf LCD ausgeben&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModCmdRef= ---- noch nicht Teil von FHEM ----&lt;br /&gt;
|ModForumArea=[http://forum.fhem.de/index.php/board,8.0.html Codeschnipsel] / [http://forum.fhem.de/index.php/topic,24519.0.html DLCD]&lt;br /&gt;
|ModTechName=39_DLCD.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=6340 epsrw1]}}&lt;br /&gt;
&lt;br /&gt;
Das [[DLCD]]-Modul bietet eine einfache Möglichkeit, Daten zu sammeln und für die Anzeige auf einem seriellen LCD aufzubereiten.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&amp;lt;u&amp;gt;Diese Wiki-Seite beschreibt den Versionsstand 1.1 des DLCD-Moduls.&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Thread im Forum:[http://forum.fhem.de/index.php/topic,24519.0.html]&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
[[Datei:dok39_DLCD.jpg|mini|Funktionsweise]]&lt;br /&gt;
&lt;br /&gt;
DLCD bietet als kleines Helferlein die Möglichkeit, Textzeilen eines LCD Displays als Readings vorzubereiten und mit Daten frei konfigurierbarer Readings zu befüllen.&lt;br /&gt;
&lt;br /&gt;
Jede Zeile wird als Attr vordefiniert, und mit Platzhaltern (zB.: %1%) für die einzutragenden Werte versehen.&lt;br /&gt;
&lt;br /&gt;
Die Liste aller einzulesenden Devices:Readings wird in einem attr eingestellt. Das Modul prüft dann regelmäßig (attr: poll interval) die Daten der Fhem-Devices &lt;br /&gt;
und aktualisiert dann die Anzeige sobald sich einer der Werte geändert hat.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich können Zahlen einfach über attr formatiert werden (Kommastellen, Rundung, Anzeige von + und - Zeichen).&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Ausgabe auf das LCD erfolgt jeweils immer dann wenn eine Änderung der Daten festgestellt wird, auf beliebiges konfigurierbares Device. Zum beispiel I2C LCD über FHEM, oder auch über shell-command für nicht von FHEM unterstützte displays.&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  define &amp;lt;name&amp;gt; DLCD &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;In der Basisversion wurde Number::Format von cpan benötigt. Dies ist ab v. 1.1. nicht mehr der Fall.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Alle Attributes sind auch in fhem durch das Kommando get attrHelp &amp;lt;varname&amp;gt; erklärt, für&#039;s &amp;quot;schnelle Nachschauen zwischendurch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* dlcdRows -&amp;gt; Anzahl Zeilen des LCD Displays&lt;br /&gt;
&lt;br /&gt;
* dlcdCols -&amp;gt; Anzahl Spalten des LCD Displays&lt;br /&gt;
&lt;br /&gt;
* dlcdPollInterval -&amp;gt; Zeitintervall nach dem FHEM die Daten versucht zu aktualisieren&lt;br /&gt;
&lt;br /&gt;
* dlcdLine1 -&amp;gt; Formatvorlage für LCD-zeile zB: text: %1% text: %2%&lt;br /&gt;
&lt;br /&gt;
* dlcdLine2 -&amp;gt; Formatvorlage für LCD-zeile zB: text: %3% text: %4%&lt;br /&gt;
&lt;br /&gt;
* dlcdLine3 -&amp;gt; Formatvorlage für LCD-zeile zB: text: %5% text: %6%&lt;br /&gt;
&lt;br /&gt;
* dlcdLine4 -&amp;gt; Formatvorlage für LCD-zeile text: %7% text: %8%&lt;br /&gt;
&lt;br /&gt;
* dlcdLine5 -&amp;gt; Formatvorlage für LCD-zeile text: %11% text: %12%&lt;br /&gt;
&lt;br /&gt;
* dlcdVal1 -&amp;gt; Quelle für den Wert %1% im Format: FhemDev:reading&lt;br /&gt;
&lt;br /&gt;
* dlcdVal2 -&amp;gt; Quelle für den Wert %2% im Format: FhemDev:reading&lt;br /&gt;
&lt;br /&gt;
* dlcdVal3 -&amp;gt; Quelle für den Wert %3% im Format: FhemDev:reading&lt;br /&gt;
&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
* dlcdVal12 -&amp;gt; Quelle für den Wert %12% im Format: FhemDev:reading&lt;br /&gt;
&lt;br /&gt;
* dlcdTriggerCmd -&amp;gt; Fhem-Command zum Schreiben einer LCD-Zeile. zB.: set lcd_wand writeXY 0,%L%,20,1 %T%&lt;br /&gt;
&lt;br /&gt;
* dlcdVal1formatnum -&amp;gt; Zahlenformatierung für Wert %1%, muss none sein bei Nicht-Zahl&lt;br /&gt;
&lt;br /&gt;
* dlcdVal2formatnum -&amp;gt; Zahlenformatierung für Wert %1%, muss none sein bei Nicht-Zahl&lt;br /&gt;
&lt;br /&gt;
* dlcdVal3formatnum -&amp;gt; Zahlenformatierung für Wert %1%, muss none sein bei Nicht-Zahl&lt;br /&gt;
&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
* dlcdVal12formatnum -&amp;gt; Zahlenformatierung für Wert %1%, muss none sein bei Nicht-Zahl&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
dlcdVal .. formatnum funktioniert wie folgt:&lt;br /&gt;
&lt;br /&gt;
optionen: 0 / 0+- / 1 / 1+- / 2 / 2+- / 3 / 3+- &lt;br /&gt;
&lt;br /&gt;
setzen die Anzahl Dezimalstellen fest, sowie ob ein + bzw. - Zeichen vorangestellt wird.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* dlcdBlankspaceReplace -&amp;gt; Leerzeichen wird im dlcdTriggerCmd durch diesen attr-Wert ersetzt. zB: \x20&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
reset -&amp;gt;alle Readings zurücksetzen&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Line1 -&amp;gt; Aktuelle Anzeige der Zeile 1&lt;br /&gt;
&lt;br /&gt;
Line2 -&amp;gt; Aktuelle Anzeige der Zeile 2&lt;br /&gt;
&lt;br /&gt;
Line3 -&amp;gt; Aktuelle Anzeige der Zeile 3&lt;br /&gt;
&lt;br /&gt;
Line4 -&amp;gt; Aktuelle Anzeige der Zeile 4&lt;br /&gt;
&lt;br /&gt;
Line5 -&amp;gt; Aktuelle Anzeige der Zeile 5&lt;br /&gt;
&lt;br /&gt;
== Spezielle Anzeigefunktionen ==&lt;br /&gt;
&lt;br /&gt;
Datum und Uhrzeit basieren aktuell auf der Systemzeit des FHEM-servers. Eine Möglichkeit als Zeitbasis den Timestamp eines FHEM-Readings zu verwenden ist denkbar; wer das nutzen möchte, bitte im Forum melden.&lt;br /&gt;
&lt;br /&gt;
=== Datum ===&lt;br /&gt;
&lt;br /&gt;
* %date_Y% --&amp;gt; Jaheszahl 4-stellig&lt;br /&gt;
* %date_y% --&amp;gt; Jahreszahl 2-stellig&lt;br /&gt;
* %date_M% --&amp;gt; Monat als Zahl, 2-stellig&lt;br /&gt;
* %date_M_eng% --&amp;gt; Monat, Abkürzung englisch&lt;br /&gt;
* %date_M_ger% --&amp;gt; Monat, Abkürzung deutsch&lt;br /&gt;
* %date_D% --&amp;gt; Tag des Monats 2-stellig&lt;br /&gt;
* %date_WD% --&amp;gt; Wochentag 1-stellig im Format 0(So) ... 6(Sa)&lt;br /&gt;
* %date_WD_eng% --&amp;gt; Wochentag, Abkürzung englisch&lt;br /&gt;
* %date_WD_ger% --&amp;gt; Wochentag, Abkürzung deutsch&lt;br /&gt;
&lt;br /&gt;
=== Zeit ===&lt;br /&gt;
&lt;br /&gt;
* %time_hms% --&amp;gt; HH:MM:SS Uhrzeit&lt;br /&gt;
* %time_h% --&amp;gt; Stunde&lt;br /&gt;
* %time_m% --&amp;gt; Minute&lt;br /&gt;
* %time_s% --&amp;gt; Sekunde&lt;br /&gt;
&lt;br /&gt;
=== Mathematische Werteberechnung ===&lt;br /&gt;
&lt;br /&gt;
* Noch in Arbeit - Ideen sind willkommen ;) --&amp;gt; Forum&lt;br /&gt;
* To be continued&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,24519.0.html] Thread im Forum, in dem dieses Modul vorgestellt wurde&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=STELLMOTOR&amp;diff=7253</id>
		<title>STELLMOTOR</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=STELLMOTOR&amp;diff=7253"/>
		<updated>2014-08-12T20:26:31Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:STELLMOTOR}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellmotor-Steuerung mit Zeitabweichungskorrektur&lt;br /&gt;
|ModType=x&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef= ---- noch nicht Teil von FHEM ----&amp;gt;&lt;br /&gt;
|ModForumArea=[http://forum.fhem.de/index.php/board,8.0.html Codeschnipsel] / [http://forum.fhem.de/index.php/topic,23933.msg176432.html#msg176432 STELLMOTOR]&lt;br /&gt;
|ModTechName=39_STELLMOTOR.pm&lt;br /&gt;
|ModOwner=epsrw1,cwagner}}&lt;br /&gt;
Das Modul [[STELLMOTOR]] bietet eine einfache Möglichkeit, mit zwei Relais den Rechts-/Linkslauf eines Motors zu steuern und punktgenau anzuhalten. &lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Diese Wiki-Seite beschreibt die Version 2.0 des STELLMOTOR Moduls.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* Wiedereintrittsfähig nach einem Neustart&lt;br /&gt;
* Wiederholungsgenauigkeit durch Ausgleich von Rundungs- und Laufzeitabweichungen&lt;br /&gt;
* Vermeiden von Blockade des FHEM während der Laufzeit des Motors&lt;br /&gt;
&lt;br /&gt;
Thread im Forum:[http://forum.fhem.de/index.php/topic,23933.0.html]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:dok39_STELLMOTOR.jpg|mini|Funktionsweise]]&lt;br /&gt;
&lt;br /&gt;
Vorrangig ist dieses Modul für zwei Relais an GPIO- oder an PIFace-Pins eines Rasberrys gedacht. Andere Einplatinencomputer werden &lt;br /&gt;
mit dem Device-Typ SysCmd unterstützt. Es bietet zusätzlich auch die Option, zwei Schaltaktoren per Funk (aus Timinggründen nicht &lt;br /&gt;
empfohlen) oder 1-Wire anzusteuern. &lt;br /&gt;
&lt;br /&gt;
Aus den Werten MaxTics (Default=100, für Prozentanzeige) und MaxDriveSeconds (Laufzeit des Motors von 0 bis 100%) wird die Zeit &lt;br /&gt;
berechnet, die der Motor nach rechts oder links laufen muss, um die mit set gewünschte Motorstellung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
FHEM läuft dann weiter ohne einzufrieren, und prüft im Loop nur noch ob, die Stoppzeit im Cache erreicht ist. Da der Stopp nie &lt;br /&gt;
exakt zur geplanten Zeit ausgeführt wird, liegt im Cache ein weiterer Wert, der die Differenz zwischen geplanter und tatsächlicher &lt;br /&gt;
Stoppzeit dem nächsten Kommando hinzurechnet. So werden sich addierende kleine Zeitdifferenzen vermieden.&lt;br /&gt;
&lt;br /&gt;
Zum Kalibrieren (set calibrate) fährt der Motor einfach volle Zeit nach links/null. Hier wird der in Getriebemotoren meist eingebaute &lt;br /&gt;
Endschalter genutzt, um den &amp;quot;Null-Punkt&amp;quot; sicher zu finden. Falls ein angeschlossener Motor solche Endschalter nicht hat, müssen diese &lt;br /&gt;
für diese Schaltungsweise unbedingt vorgesehen werden.&lt;br /&gt;
Übliche Montagepunkte sind ein Wellrad an der Ansgangswelle, an Endpunkten des zu bewegenden Objektes oder direkt am Motor gegen&lt;br /&gt;
eine drehend gefedert gelagerte Motoraufhängung.&lt;br /&gt;
&lt;br /&gt;
Anwendungsszenarien für das Modul sind unter Anderem:&lt;br /&gt;
* [[Mischersteuerung|3- oder 4-Wege Heizkreis-Mischer]]&lt;br /&gt;
* [[Solarspeicher|Warmwasser-Mischventil für Solarspeicher]]&lt;br /&gt;
* [[Eigenbau-Heizungsthermostate]]&lt;br /&gt;
* [[Eigenbau-Rolladensteuerung]]&lt;br /&gt;
* [[(Dach-)Fensteröffner]]&lt;br /&gt;
* [[Beamer-Leinwand]]&lt;br /&gt;
* [[Heliostaten]]&lt;br /&gt;
* ....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  define &amp;lt;name&amp;gt; STELLMOTOR &amp;lt;PiFace|Gpio|FhemDev|SysCmd&amp;gt;  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Je nach Device Typ sind verschiedene Attribute zur erforderlich, damit STELLMOTOR weiß, wie die beiden Relais angeschlossen sind.&lt;br /&gt;
* &#039;&#039;&#039;PiFace&#039;&#039;&#039; und &#039;&#039;&#039;Gpio&#039;&#039;&#039; benötigen STMgpioPortRL und STMgpioPortSTART&lt;br /&gt;
* &#039;&#039;&#039;FhemDev&#039;&#039;&#039; benötigt STMfhemDevRL und STMfhemDevSTART &lt;br /&gt;
* &#039;&#039;&#039;SysCmd&#039;&#039;&#039; benötigt STMsysCmdRL und STMsysCmdSTART&lt;br /&gt;
&lt;br /&gt;
Für den Schaltvorgang &amp;quot;baut&amp;quot; STELLMOTOR einen set-Befehl zusammen. Beispielsweise bei FhemDev&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  set &amp;lt;**..PortRL&amp;gt; 0     sowie      set &amp;lt;**..PortSTART&amp;gt; 1      zum Einschalten links  &lt;br /&gt;
  set &amp;lt;**..PortRL&amp;gt; 1     sowie      set &amp;lt;**..PortSTART&amp;gt; 0      zum Einschalten rechts (bei Type &amp;quot;einzel&amp;quot;, sonst 1,1)&lt;br /&gt;
  set &amp;lt;**..PortRL&amp;gt; 0     sowie      set &amp;lt;**..PortSTART&amp;gt; 0      zum Ausschalten&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Schaltbefehle 0 und 1 können mit Attributen invertiert und/oder gemapped werden (zB.: On/Off)&lt;br /&gt;
&lt;br /&gt;
Um die Wirkung auszuprobieren, ohne jedes Mal zum Mischer rennen zu müssen, bietet sich an, zwei &#039;&#039;&#039;Dummys&#039;&#039;&#039; zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define Stellmotor2rl dummy&lt;br /&gt;
&lt;br /&gt;
define Stellmotor2start dummy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set &amp;lt;name&amp;gt; 45&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
stellt den Motor nun auf 45%. Angenommen, stand er bei 10%, wird er nun (45-10)*MaxDriveSeconds/MaxTics Sekunden lang nach rechts laufen und dann von STELLMOTOR gestoppt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Bilder zeigen die elektrische Verdrahtung von zwei Relais, die von je einem Aktor gesteuert werden:&lt;br /&gt;
[[Datei:Relais-Schaltung FBH-Mischer attr einzel.jpg|mini|Schaltplan einzel]]       [[Datei:Relais-Schaltung FBH-Mischer attribut Wechsel.jpg|mini|Schaltplan wechsel]]   &lt;br /&gt;
&lt;br /&gt;
Typische Getriebemotoren haben eingebaute Endschalter, die beim Erreichen der 0%- oder 100%-Position die Stromversorgung unterbrechen. Das Modul Stellmotor nutzt dies &lt;br /&gt;
aus, um eine Kalibrierung zwischen rechnerischem und tatsächlichen Stand herzustellen. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
&lt;br /&gt;
Alle Attributes sind auch in fhem durch das Kommando get attrHelp &amp;lt;varname&amp;gt; erklärt, für&#039;s &amp;quot;schnelle Nachschauen zwischendurch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Global gültige Attribute ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Wertebereich !! Default !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| STMrlType|| String || einzel || je nach Schaltplan, Wechsel=start+RL-relais, einzel=R-Relais+L-Relais werden geschaltet&lt;br /&gt;
&amp;lt;b&amp;gt;&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039;&amp;lt;/b&amp;gt; falsche Einstellung kann zu Kurzschluss am Motor führen, bitte Einstellung genau überdenken oder mit dummy testen&lt;br /&gt;
&lt;br /&gt;
bei einzel: &lt;br /&gt;
Rechtslauf: start=0 rl=1 &lt;br /&gt;
Linkslauf: start=1 rl=0 Ruhe: &lt;br /&gt;
start=0 rl=0&lt;br /&gt;
&lt;br /&gt;
bei wechsel: &lt;br /&gt;
Rechtslauf start=0 rl=1 &lt;br /&gt;
Linkslauf: L start=1 rl=0 &lt;br /&gt;
Ruhe: start=0 rl=0&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|STMmaxDriveSeconds ||[0...n]||muss angepasst werden||gestoppte Zeit in Sekunden, die der Motor für die Fahrt von 0 bis 100 Prozent braucht&lt;br /&gt;
|-&lt;br /&gt;
|STMmaxTics ||[0...100]||100||Motorstellung - bei Prozentangaben 100, bei Winkelangaben anzupassen&lt;br /&gt;
|-&lt;br /&gt;
|STMpollInterval || Float ||0.1||Zeitintervall nach dem FHEM prüft, ob die interne Stoppzeit erreicht wurde. Hier sollte mit einem möglichst &lt;br /&gt;
kleinen Wert gestartet werden, der vorsichtig erhöht werden kann, falls FHEM zu langsam läuft wegen des Stellmotors. Darf nicht größer &lt;br /&gt;
STMlastDiffMax sein, sonst beginnt der Motor zu schwingen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| STMresetOtherDeviceAtCalibrate|| String || 0 || Fhem Device das am Ende des Kalibriervorganges zusätzlich resettet wird. (command: &lt;br /&gt;
set &amp;lt;STMresetOtherDeviceAtCalibrate&amp;gt; reset&amp;quot; wird abgesetzt), zB für eigenes Logging oder Rotary Encoder&lt;br /&gt;
|- &lt;br /&gt;
| STMinvertOut|| Zahl || 0 || setzen für Devices die 0 für Start und 1 für Stop erwarten &lt;br /&gt;
|- &lt;br /&gt;
| STMmapOffCmd|| String || 0 || string der im device-command anstelle &#039;0&#039; verwendet wird für stop &lt;br /&gt;
|- &lt;br /&gt;
| STMmapOnCmd|| String || 0 || string der im device-command anstelle &#039;1&#039; verwendet wird für start &lt;br /&gt;
|- &lt;br /&gt;
| STMcalibrateDirection|| String || L || auf R wird die Ralibrierung nach rechts gefahren, default= L (links) &lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| STMlastDiffMax|| Zahl || 1|| ist die Stoppzeit weiter als dieser wert vom Soll entfernt, wird sofort ein neuer drive &lt;br /&gt;
gestartet. Wert muss immer größer als STMpollInterval sein, sonst beginnt der Motor zu schwingen &lt;br /&gt;
|- &lt;br /&gt;
| STMtimeTolerance|| Float || 0.001 || Stop-Time Differenzen kleiner als dieser Wert werden bei der Berechnung vollständig &lt;br /&gt;
ignoriert (Parameter wird voraussichtlich in der nächsten Modulversion entfallen)&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| STMdebugToLog3|| Zahl || 0/1 || Debug Informationen ins Log schreiben. Achtung, kann eine Menge Daten verursachen, falls &lt;br /&gt;
man vergisst, es wieder abzuschalten!&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|readingFnAttributes||||||readingFnAttributes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Device Type abhängige Attribute ===&lt;br /&gt;
&lt;br /&gt;
Je nach Device Type sind verschiedene Attribute vorgesehen, um STELLMOTOR mitzuteilen, wie die beiden Relais angesprochen &lt;br /&gt;
werden. Man kann so z. B. während der Aufbauphase der Installation neben den Gpio devices noch 2 dummy devices im Attr &lt;br /&gt;
vorhalten um zwischendurch zu testen. Hierzu muss dann nur noch die DEF des STELLMOTOR Devices vorübergehend auf FhemDev &lt;br /&gt;
geändert werden.&lt;br /&gt;
&lt;br /&gt;
Alle Attributes sind auch in fhem durch das kommando get attrHelp &amp;lt;varname&amp;gt; erklärt, für das &amp;quot;schnelle Nachschauen zwischendurch&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|- &lt;br /&gt;
! Device Type !! Parameter !! Typ !! Default !! Beschreibung &lt;br /&gt;
|- &lt;br /&gt;
| PiFace / Gpio || STMgpioPortRL || Zahl || 5 || PiFace Digital port oder Gpio-Port für RL oder R Relais &lt;br /&gt;
|- &lt;br /&gt;
| PiFace / Gpio || STMgpioPortSTART || Zahl || 4 || PiFace Digital Port oder Gpio-Port für START (oder L Relais bei &#039;einzel&#039;) &lt;br /&gt;
|- &lt;br /&gt;
| FhemDev || STMfhemDevRL|| String || RelaisRL || Fhem-Device name für RL (oder R) Aktor (zB.: &#039;keller portB&#039; oder &#039;dummyRLrelais&#039;)&lt;br /&gt;
|- &lt;br /&gt;
| FhemDev || STMfhemDevSTART|| String || RelaisSTART || Fhem-Device name für START (oder L) Aktor  (zB.: &#039;keller portC&#039; oder &#039;dummySTARTrelais&#039;)&lt;br /&gt;
|- &lt;br /&gt;
| SysCmd || STMsysCmdRL|| String || 0 || freies Command, das für RL an die Shell übergeben wird (zB: &#039;/Usr/local/bin/gpio write 4&#039;, STELLMOTOR fügt 0 oder 1 arg. dazu)&lt;br /&gt;
|- &lt;br /&gt;
| SysCmd || STMsysCmdSTART|| String || 0 || freies Command, das für START an die Shell übergeben wird (zB: &#039;/Usr/local/bin/gpio write 5&#039;, STELLMOTOR fügt 0 oder 1 arg. am Ende dazu)&lt;br /&gt;
|- &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SET !! Wertebereich !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|set &amp;lt;name&amp;gt; N||[1...100]||stellt den Mischer auf N % Öffnung&lt;br /&gt;
|-&lt;br /&gt;
|set &amp;lt;name&amp;gt; calibrate|| - ||stellt den Mischer auf Min. oder Max. (in Fhem 1% oder 100%); default: maximaler Linkslauf bis zur Endschalterpostion. Kann über Attr in Rechtslauf geändert werden.&lt;br /&gt;
|-&lt;br /&gt;
|set &amp;lt;name&amp;gt; reset|| - ||Setzt die Position und die Werte im Cache auf Null. Verwendung ist intern (am Ende von calibrate) oder nach mechanischem Neueinbau des Motors (da reicht aber auch ein Calibrate)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Alle Readings sind auch in fhem durch das Kommando get readingsHelp &amp;lt;varname&amp;gt; erklärt, für das &amp;quot;schnelle nachschauen zwischendurch&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! readings !! Wertebereich !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|position||[1..100%]||der Wert wird gesetzt am Beginn einer Mischerbewegung (anderer Wertebereich, wenn MaxTics nicht 100)&lt;br /&gt;
|-&lt;br /&gt;
|state||active,error,position||Position wird beim Stopp der Motorbewegung gesetzt&lt;br /&gt;
|-&lt;br /&gt;
|lastStart|| Float ||Zeitstempel der letzten Motorbewegung&lt;br /&gt;
|-&lt;br /&gt;
|locked||[0 1]||Steht auf 1 während der Motor gerade läuft (Calibrate oder gewünsche Position per set). &lt;br /&gt;
&lt;br /&gt;
Neue Kommandos werden während lock nur in eine Warteschleife (reading: command_queue) genommen.&lt;br /&gt;
&lt;br /&gt;
Zeigt im im Frontend, dass der Motor gerade läuft.&lt;br /&gt;
|-&lt;br /&gt;
|queue_lastdiff||||Letzte Zeitdifferenz beim Stopp: abhängig von der Systemlast oder anderen blockierenden Kommandos wird das Stopp-Kommando nur nahe an der kalkulierten Stoppzeit ausgeführt, potentiell niemals exakt zum berechneten Zeitpunkt. STELLMOTOR merkt sich die Zeitdifferenz zwischen geplantem und tatsächlichem Stopp und addiert bei der nächsten Bewegung des Motors die Differenz, um möglichst präzise die gewünschte Motorstellung zu erreichen.&lt;br /&gt;
|-&lt;br /&gt;
|stopTime||||Null oder die errechnete Zeit zum Stopp der Motorbewegung&lt;br /&gt;
|-&lt;br /&gt;
|command_queue||||Position einer anstehenden neuen Motorposition, die angefordert wurde als die letzte Motorbewegung noch ausgeführt oder das Modul disabled war&lt;br /&gt;
|-&lt;br /&gt;
|OutType||||Bei der Defintion gewählte Arbeitsart: PiFace,Gpio,FhemDev,SysCmd&lt;br /&gt;
|-&lt;br /&gt;
|DoResetAtStop||||Zeitstempel des Ende der letzten Kalibrierfahrt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,23933.msg174400.html#new Thread im Forum], in dem dieses Modul vorgestellt wurde&lt;br /&gt;
* to be continued&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=7252</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=7252"/>
		<updated>2014-08-12T20:21:06Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &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 [http://forum.fhem.de/index.php/topic,18920.msg128100.html#msg128100]&lt;br /&gt;
&lt;br /&gt;
besteht aus &lt;br /&gt;
* physisches Modul &lt;br /&gt;
* logische Modul(e)&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;
&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>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung_-_Remote_Fritzbox&amp;diff=7251</id>
		<title>Anwesenheitserkennung - Remote Fritzbox</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung_-_Remote_Fritzbox&amp;diff=7251"/>
		<updated>2014-08-12T20:20:04Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Erweiterung des Beitrages [[Anwesenheitserkennung|Anwesenheitserkennung]] wird eine Beispiel-Lösung für folgendes Szenario vorgestellt:&lt;br /&gt;
&lt;br /&gt;
* Eine (nicht modifizierte) Fritzbox wird als WLAN Access Point und Router genutzt, jedoch läuft auf dieser Box kein FHEM oder Perl.&lt;br /&gt;
* Ein Linux Rechner (in diesem Beispiel ein RPI) wird als FHEM host verwendet.&lt;br /&gt;
* Device Erkennung mittels PRESENCE - ident mit PRESENCE fritzbox&lt;br /&gt;
&lt;br /&gt;
Die Lösung basiert auf dem PRESENCE Modul und nutzt die Funktion &#039;&#039;&#039;PRESENCE function { }&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Auch bei einem Repeater-Einsatz im WLan (zweite Fritzbox) kann diese Lösung eingesetzt werden - es ist nur eine Installation auf der Haupt-Fritzbox notwendig, nicht auf dem Repeater.&lt;br /&gt;
&lt;br /&gt;
== Background / Motivation ==&lt;br /&gt;
Ich hatte während der letzten 12 Monate ein modifiziertes PRESENCE Modul im Einsatz, das jedoch immer wieder ein Hängen oder Reboots der Fritzbox verursacht hatte (speziell bei 7270), daher hatte ich es nicht veröffentlicht. Die Vermutung liegt nahe, dass das ständige Telnet ein/aus-loggen die Hänger/Reboots verursacht hat.&lt;br /&gt;
&lt;br /&gt;
== Konzept ==&lt;br /&gt;
=== Variante 1 ===&lt;br /&gt;
* Diese Lösung basiert (wie auch die &#039;&#039;&#039;PRESENCE fritzbox&#039;&#039;&#039; Funktion) auf dem Fritzbox Befehl &#039;&#039;ctlmgr_ctl&#039;&#039;, der jedoch von der &amp;quot;Ferne&amp;quot; ausgelöst werden muss, da FHEM ja nicht auf der Fritzbox läuft. Weiters wurden Ideen/Konzepte des presenced/collectord verwendet.&lt;br /&gt;
* Die Lösung läuft bei mir seit Anfang Dez. 2013 stabil mit 12 abgefragten Devices / 120 Sekunden Intervall. (Env: FHEM auf RPI, Fritzbox 7390)&lt;br /&gt;
* Auf der Fritzbox wird ein &#039;&#039;&#039;shellscript&#039;&#039;&#039; installiert, dass von remote gestartet wird,  Kommandos lokal ausführt und das Ergebniss zurückschickt.&lt;br /&gt;
* Am FHEM host läuft ein &#039;&#039;&#039;perl basierender daemon&#039;&#039;&#039; der Kommandos von FHEM empfängt, aufbereitet und das shellscript auf der Fritzbox (mit parameter) startet. Dieser Daemon hält auch die Telnet Verbindung zur Fritzbox permanent aufrecht. Gestartet wird dieser Daemon automatisch beim ersten Aufruf durch FHEM.  &lt;br /&gt;
* ein Modul &#039;&#039;&#039;99_RFritzBox.pm&#039;&#039;&#039; ist die Schnittstelle zwischen FHEM und dem daemon.   &lt;br /&gt;
&lt;br /&gt;
=== Variante 2 ===&lt;br /&gt;
* Die WEB Oberfläche der Fritzbox wird über http abgefragt. &lt;br /&gt;
* Es ist kein code und kein Telnet auf der Fritzbox selbst notwendig, ein Nachteil könnte jedoch die Performance der Abfrage sein.&lt;br /&gt;
* Diese Variante ist vor allem für jene FB-Benutzer interessant, die kein Telnet auf der FB aktivieren können (oder wollen).&lt;br /&gt;
&lt;br /&gt;
== Code (beide Varianten)==&lt;br /&gt;
Der code ist als zip-file im thread [http://forum.fhem.de/index.php/topic,17957.0.html PRESENCE-RemoteFritzbox] abgelegt. Bitte in diesem thread auch Fragen/Feedback/Wünsche posten.&lt;br /&gt;
&lt;br /&gt;
== Installation &amp;amp; Debug Variante 1 ==&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
* Telnet auf der Fritzbox aktiviert &lt;br /&gt;
* perl NET::Telnet Modul auf dem Host wo FHEM läuft installiert. Beim Raspberry-PI geht das so:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Folgende Reihenfolge ist empfehlenswert:&lt;br /&gt;
&lt;br /&gt;
=== Kopieren von  Rpresence.sh in die Fritzbox === &lt;br /&gt;
z.B. mittels FTP in folgendes Verzeichnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/var/media/ftp/FRITZ/bin # Der Verzeichnispfad muss angepasst werden! In diesem Beispiel ist das eine FB7390 im Internen Speicher.&lt;br /&gt;
chmod +x Rpresence.sh # shell script ausführbar machen.&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ein erster Test von der Telnet Konsole der Fritzbox:&lt;br /&gt;
&amp;lt;pre&amp;gt;./Rpresence.sh &amp;lt;FBdevicename&amp;gt;&amp;lt;/pre&amp;gt; sollte folgendes Ergebnis liefern: &amp;lt;pre&amp;gt;RFritzBox: &amp;lt;FBdevicename&amp;gt; y z&amp;lt;/pre&amp;gt; wobei für &amp;lt;FBdevicename&amp;gt; der Name eines Gerätes, so wie in der Fritzbox Weboberfläche definert einzusetzen ist. y ist die Fritzbox interne Devicenummer dieses Gerätes (es sollte jedenfalls nicht 999 hier stehen, in diesem Fall hat die FB den Namen nicht gefunden. z ist der Status (0==abwesend/1==anwesend).&lt;br /&gt;
Falls bis hierher alles geklappt hat, ist die Einrichtung auf der Fritzbox fertig.&lt;br /&gt;
&lt;br /&gt;
=== Installation &amp;amp; konfig &amp;amp; test Daemon am FHEM host === &lt;br /&gt;
kopieren von RFritzBoxScan.pl ins FHEM Verzeichnis (dort wo alle Module 00_xxx.pm - 99_yyy.pm sind)&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chmod +x RFritzBoxScan.pl # ausführbar machen&lt;br /&gt;
sudo chown fhem:root RFritzBoxScan.pl #for user fhem &amp;lt;/pre&amp;gt;&lt;br /&gt;
Erstellen eines config- files für den daemon:&lt;br /&gt;
im root FHEM-Verzeichnis ( dort wo üblicherweise auch die fhem.pl zu finden ist )&lt;br /&gt;
ein file: &#039;&#039;&#039;credentials.cfg&#039;&#039;&#039; mit folgendem Inhalt erstellen (Adressen/User/Passwort/pfad anpassen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# PRESENCE credentials (only required for function RemoteFritzBox)&lt;br /&gt;
$credentials{RemoteFritzBox}{ipadress} = &#039;192.168.1.254&#039;; # FB LAN Adress&lt;br /&gt;
$credentials{RemoteFritzBox}{username} = &#039;FritzBoxusername&#039;;&lt;br /&gt;
$credentials{RemoteFritzBox}{password} = &#039;FritzboxPasswort&#039;;&lt;br /&gt;
$credentials{RemoteFritzBox}{shellcmd} = &#039;/var/media/ftp/FRITZ/bin/Rpresence.sh&#039;; # pfad anpassen!&lt;br /&gt;
$credentials{RemoteFritzBox}{serverhost} = &#039;localhost&#039;;  #  RFritzBoxScan.pl provides this service&lt;br /&gt;
$credentials{RemoteFritzBox}{serverport} = 7777;&lt;br /&gt;
$credentials{RemoteFritzBox}{serverbin} = &#039;RFritzBoxScan.pl&#039;; # Fritzbox daemon&lt;br /&gt;
$credentials{RemoteFritzBox}{speedmatching} = &amp;quot;active&amp;quot;;         # optional valid: &amp;lt;active|speed&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Format dieser cfg-file entspricht dem im Modul Webcam. &lt;br /&gt;
Ein erster Test:&lt;br /&gt;
&amp;lt;pre&amp;gt;./RFritzBoxScan.pl &amp;lt;fullpath and name&amp;gt; # of credentials.cfg  eg: /opt/fhem/credentials.cfg&amp;lt;/pre&amp;gt; &lt;br /&gt;
Damit wir der Daemon von Hand gestartet und alle debug-Meldungen kommen auf diese Konsole.&lt;br /&gt;
Beim Start sollte der Output so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RFritzBoxScan: server waiting for client connection on port 7777&lt;br /&gt;
RFritzBoxScan: Fritzbox login ok&lt;br /&gt;
### die folgenden Zeilen kommen erst ab dem nächsten Schritt !&lt;br /&gt;
### und zwar jedesmal wenn ein request von FHEM an den daemon kommt...&lt;br /&gt;
RFritzBoxScan: connection from 127.0.0.1:57595&lt;br /&gt;
RFritzBoxScan: ..from FHEM received data: Nokia-N810&lt;br /&gt;
RFritzBoxScan: ..sending to Fritzbox: Nokia-N810 17&lt;br /&gt;
RFritzBoxScan: ..cmdresult: RFritzBox: Nokia-N810 17 1&lt;br /&gt;
RFritzBoxScan: ..result to fhem: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation und Konfiguration FHEM-Module ===&lt;br /&gt;
kopieren von 99_RFritzBox.pm ins FHEM Verzeichnis&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown fhem:root 99_RFritzBox.pm # for user fhem&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im FHEM command-feld: &amp;lt;pre&amp;gt;reload 99_RFritzBox.pm&amp;lt;/pre&amp;gt; eintippen (oder FHEM neu starten)&lt;br /&gt;
Die FHEM-PRESENCE Definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;myName&amp;gt; PRESENCE function {RemoteFritzBox(&amp;quot;&amp;lt;FBdevicename&amp;gt;&amp;quot;)} 120 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
damit wird in 120 sec Abständen der Status abgefragt.&lt;br /&gt;
im Telnet Fenster sollten jetzt die requests / response - Meldungen kommen.&lt;br /&gt;
&lt;br /&gt;
Zum Abschluß:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;Strg-C&amp;gt;&amp;lt;/pre&amp;gt; im telnet Fenster eingeben, der Daemon wird dadurch gestoppt. Auf den nächsten Aufruf durch FHEM warten, der Daemon wird automatisch (im Hintergrund) gestartet. Überprüfen durch Eingabe von &amp;lt;pre&amp;gt;ps -e | grep RFritzBoxScan&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation &amp;amp; Debug Variante 2 ==&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
* fhem auf raspberry o.ä.&lt;br /&gt;
&lt;br /&gt;
=== installation &amp;amp; konfig &amp;amp; test am FHEM host === &lt;br /&gt;
Erstellen eines config- files im root FHEM-Verzeichnis ( dort wo üblicherweise auch die fhem.pl zu finden ist )&lt;br /&gt;
ein file: &#039;&#039;&#039;credentials.cfg&#039;&#039;&#039; mit folgendem Inhalt erstellen (Adressen/User/Passwort/pfad anpassen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# PRESENCE credentials (only required for function RemoteFritzBox)&lt;br /&gt;
$credentials{RemoteFritzBox}{ipadress} = &#039;192.168.1.254&#039;; # FB LAN Adress&lt;br /&gt;
$credentials{RemoteFritzBox}{username} = &#039;FritzBoxusername&#039;;&lt;br /&gt;
$credentials{RemoteFritzBox}{password} = &#039;FritzboxPasswort&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Format dieser cfg-file entspricht dem im Modul Webcam. &lt;br /&gt;
&lt;br /&gt;
=== Installation und Konfiguration FHEM-Module ===&lt;br /&gt;
kopieren von 99_RFritzBox.pm ins FHEM Verzeichnis&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown fhem:root 99_RFritzBox.pm # for user fhem&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im FHEM command-feld: &amp;lt;pre&amp;gt;reload 99_RFritzBox.pm&amp;lt;/pre&amp;gt; eintippen (oder FHEM neu starten)&lt;br /&gt;
&lt;br /&gt;
Die FHEM-PRESENCE Definition:&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;myName&amp;gt; PRESENCE function {RemoteFritzBoxWeb(&amp;quot;&amp;lt;FBdevicename&amp;gt;&amp;quot;)} 120 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
damit wird in 120 sec Abständen der Status abgefragt.&lt;br /&gt;
&lt;br /&gt;
== Debug Tip (beide Varianten)==&lt;br /&gt;
Log Meldungen vom Daemon bekommt man im FHEM Log durch Anlegen eines dummy devices mit dem Namen &#039;&#039;&#039;RemoteFritzBox&#039;&#039;&#039; :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define RemoteFritzBox dummy&lt;br /&gt;
attr RemoteFritzBox verbose 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Den Daemon beenden, falls er im Hintergrund läuft (nur Variante 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo killall RFritzBoxScan.pl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
have fun&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelines&amp;diff=7250</id>
		<title>DevelopmentGuidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelines&amp;diff=7250"/>
		<updated>2014-08-12T20:16:27Z</updated>

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

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Todo|Der Artikel sollte in die Beschreibung des Nachfolgers [[Tuxradio 2]] eingearbeitet oder auf die Erwähnung der Unterschiede zu diesem reduziert werden.}}&lt;br /&gt;
&lt;br /&gt;
Das TuxRadio der Firma busware.de[http://busware.de/] kommt mit einem minimalen Debian-Betriebssystem daher und wird über eine Konsole bedient. Die Verbindung zum Router wird über einen USB/Lan Adapter oder einen USB/WLan Adapter hergestellt. Für den USB/Lan Adapter sind keine weiteren Einstellungen erforderlich, für den USB/WLan Adapter müssen die WLan Zugangsdaten in der Datei /etc/Wireless/RT2870STA/RT2870STA.dat editiert werden.&lt;br /&gt;
&lt;br /&gt;
== TuxRadio Startup ==&lt;br /&gt;
Um auf TuxRadio zugreifen zu können benötigt man auf seinem Computer einen SSH-Clienten. Unter Windows gibt es z.b. das Program [http://www.putty.org/ Putty], bei Ubuntu-Linux gibt es z.B. [http://wiki.ubuntuusers.de/Vinagre Vinagre] (muss über den Terminal mit root-Rechten geöffnet werden: sudo vinagre). Im Clienten Vinagre wählt man &amp;quot;verbinden&amp;quot;, in dem geöffneten Fenster SSH, als Rechner gibt man die vom Router zugewiesene IP-Adresse von TuxRadio ein, Benutzername ist der von busware.de mitgeteilte. In der sich öffnenden Konsole wird noch das von busware.de mitgeteilte Passwort eingegeben.&lt;br /&gt;
&lt;br /&gt;
Als Erstes sollte eine Aktualisierung des Systems mit folgenden Befehlen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktualisierungen sollten regelmäßig durchgeführt werden, um immer auf dem aktuellen Stand zu sein.&lt;br /&gt;
&lt;br /&gt;
Um die aktuelle Zeit aus dem Internet beziehen zu können, muss noch ein Zeitprotokoll installiert werden. Debian bietet das Network Time Protocol (NTP)[http://packages.debian.org/de/source/squeeze/ntp] zum installiert an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aptitude install ntp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fhem installieren ==&lt;br /&gt;
Das aktuelle fhem Paket wird von [http://fhem.de/fhem.html fhem.de] heruntergeladen. Für Debian benötigen wir das .dep Paket. Nun wird das Paket über ein Dateiverwaltungsprogramm zum TuxRadio in den Ordner &amp;quot;home&amp;quot; kopiert. Dazu geht man z.B. im Programm Nautilus (Ubuntu) auf &amp;quot;Datei&amp;quot; und dann auf &amp;quot;mit Server verbinden&amp;quot; (SSH wählen) Zum Installieren wird in der Konsole folgender Befehl (mit der richtigen Versions-Nr) eingegeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install /home/fhem-5.&#039;&#039;x&#039;&#039;.dep&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CUL flashen ==&lt;br /&gt;
&lt;br /&gt;
Zum Abschluß muss die CUL (das Radiomodul) geflasht (neue firmware aufgespielt) werden. Dazu wird von der Seite [http://culfw.de/culfw.html culfw.de] die aktuelle Version heruntergeladen und entpackt.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung von HomeMatic muss culfw noch bearbeitet werden. Dazu geht man in den Ordner CULFW_VER_xxx/culfw/Devices/Tuxradio und dann auf board.h. Hier müssen ganz unten in der Liste bei den Einträgen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//#define HAS_ASKSIN&lt;br /&gt;
&lt;br /&gt;
//#define HAS_ESA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
die beiden // entfernt werden. Dann speichern. Jetzt wird CULFW_VER_xxx in den Ordner &amp;quot;dev&amp;quot; auf dem TuxRadio kopiert. Um flashen zu können müssen, noch mehrere Programme in der Konsole installiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install make avrdude avr-libc binutils-avr gcc-avr dfu-programmer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann folgendes eingeben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /dev/CUL_VER_&#039;&#039;xxx&#039;&#039;/culfw/Devices/TuxRadio&lt;br /&gt;
&lt;br /&gt;
make clean&lt;br /&gt;
&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
make program&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluß noch TuxRadio herunterfahren und neustarten mit dem Befehl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Browser kann jetzt unter der Adresse &amp;lt;nowiki&amp;gt;http://&amp;lt;IP-Adresse von TuxRadio&amp;gt;:8083/fhem&amp;lt;/nowiki&amp;gt;  auf die Bedienoberfläche von fhem zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:TuxRadio]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SML&amp;diff=7248</id>
		<title>SML</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SML&amp;diff=7248"/>
		<updated>2014-08-12T19:52:22Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Auswertung von SML Zählern (SmartMeter)&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory=?? --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef=http://fhem.de/commandref.html#LightScene --&amp;gt;&lt;br /&gt;
|ModForumArea=[http://forum.fhem.de/index.php/board,46.0.html Sonstiges]&lt;br /&gt;
|ModTechName=70_SML.pm&lt;br /&gt;
|ModOwner=[[SML#Kontakt|bentele]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Smart Metering Language ([[SML]], auf XML basierende Syntax) Modul ist ein Modul zur Auswertung von über LAN (TCP/IP) abfragbaren Stromzählern.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Der Stromzähler muss von FHEM aus über das Netzwerk erreichbar sein, üblich ist der Port 80, es ist aber auch jeder andere Port denkbar.&lt;br /&gt;
&lt;br /&gt;
Zur Zeit bekannte Stromzähler, die abgefragt werden können:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Intelligenter Strom Zähler&amp;quot; (ENBW)&lt;br /&gt;
* &amp;quot;Sparzähler&amp;quot; (Yellow Strom)&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
Die Definition eines SML Devices erfolgt mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define &amp;amp;lt;name&amp;amp;gt; SML &amp;amp;lt;host&amp;amp;gt; &amp;amp;lt;port&amp;amp;gt; [&amp;amp;lt;interval&amp;amp;gt; [&amp;amp;lt;timeout&amp;amp;gt;]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Wobei &amp;amp;lt;host&amp;amp;gt; der Hostname und &amp;amp;lt;port&amp;amp;gt; der angegebene TCP Port des Zählers sind.&lt;br /&gt;
&lt;br /&gt;
Das &amp;amp;lt;interval&amp;amp;gt; ist per default 300 sec. Das bedeutet, es wird der Durchschnitt aus den letzten 300 sec (5 Minuten) ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Der &amp;amp;lt;timeout&amp;amp;gt; gibt an, wie lange ein Verbindungsaufbau versucht wird, Default ist hier 4 Sekunden.&lt;br /&gt;
&lt;br /&gt;
Zählerstand einzutragen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set &amp;amp;lt;name&amp;amp;gt; TOTALPOWER &amp;amp;lt;wert&amp;amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loggen ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define SML_log FileLog /var/log/fhem/enbw-%Y.log sml:.*&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
So sieht dann eine Log Zeile aus, die pro Intervall erzeugt wird:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;2012-08-08_19:03:08 enbw min: 441 max: 1935 last: 672 avg: 771.35 day: 5.124356 month: 66.241639 year: 11834.708207 total: 11834.708207&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Day: das ist die Tagessumme, und wird um 24 Uhr wieder auf 0 KW gesetzt.&lt;br /&gt;
Month: das ist die Monatssumme und wird jeden Monat wieder auf 0 KW gesetzt.&lt;br /&gt;
Year: das ist die Jahressumme und wird jedes Jahr auf 0 KW gesetzt.&lt;br /&gt;
Total: das ist der Zählerstand und wird nicht verändert.&lt;br /&gt;
&lt;br /&gt;
== Plotten ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define wl_ENBW weblink fileplot SML_log:smartmeter:CURRENT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[File:SML2.png|808px|Beispiel eines SML-Plots]]&lt;br /&gt;
&lt;br /&gt;
smartmeter.gplot:&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 title &#039;&amp;amp;lt;TL&amp;amp;gt;&#039;&lt;br /&gt;
 set y2label &amp;quot;currentPower (W)&amp;quot;&lt;br /&gt;
 set ylabel &amp;quot;totalEnergyDay (kWh)&amp;quot;&lt;br /&gt;
 #FileLog 12:enbw:0:&lt;br /&gt;
 #FileLog 10:enbw:0:&lt;br /&gt;
 #FileLog 8:enbw:0:&lt;br /&gt;
 #FileLog 6:enbw:0:&lt;br /&gt;
 #FileLog 4:enbw:0:&lt;br /&gt;
 plot \&lt;br /&gt;
 &amp;quot;&amp;amp;lt; awk &#039;/enbw:/ {print $1, $12}&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;\&lt;br /&gt;
   using 1:2 ls l9 axes x1y1 title &#039;day&#039; with filledcurve,\&lt;br /&gt;
 &amp;quot;&amp;amp;lt; awk &#039;/totalEnergyDay:/ {print $1, $10}&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;,\&lt;br /&gt;
   using 1:2 ls l2 axes x1y2 title &#039;averange&#039; with histeps,\&lt;br /&gt;
 &amp;quot;&amp;amp;lt; awk &#039;/totalEnergyDay:/ {print $1, $8}&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;,\&lt;br /&gt;
   using 1:2 ls l3 axes x1y2 title &#039;last&#039; with histeps,\&lt;br /&gt;
 &amp;quot;&amp;amp;lt; awk &#039;/totalEnergyDay:/ {print $1, $6}&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;,\&lt;br /&gt;
   using 1:2 ls l1 axes x1y2 title &#039;max&#039; with histeps,\&lt;br /&gt;
 &amp;quot;&amp;amp;lt; awk &#039;/totalEnergyDay:/ {print $1, $4}&#039; &amp;amp;lt;IN&amp;amp;gt;&amp;quot;,\&lt;br /&gt;
   using 1:2 ls l0fill axes x1y2 title &#039;min&#039; with histeps&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kontakt ==&lt;br /&gt;
Bei Problemen/Fragen bitte per Mail an: gabriel AT bentele DOT de, wenden.&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EM-1000_EM_Wirkleistungsmessger%C3%A4t&amp;diff=7247</id>
		<title>EM-1000 EM Wirkleistungsmessgerät</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EM-1000_EM_Wirkleistungsmessger%C3%A4t&amp;diff=7247"/>
		<updated>2014-08-12T19:51:46Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;EM-1000 EM Wirkleistungsmessgerät&#039;&#039;&#039; ist ein als Zwischensteckdose ausgeführter Sensor. Er misst und sendet die effektive Leistungsaufnahme des angeschlossenen Verbrauchers.&lt;br /&gt;
&lt;br /&gt;
== Lieferumfang ==&lt;br /&gt;
* EM1000-EM&lt;br /&gt;
* Bedienungsanleitung&lt;br /&gt;
&lt;br /&gt;
== Funktionen ==&lt;br /&gt;
*  Der Sender kann über [[CUL]] empfangen werden. &lt;br /&gt;
*  Siehe [[FHEM Command Reference]] unter CUL_EM&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
* Sendefrequenz: 868,35 MHz&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Zum Empfang der Daten muss ein CUL im [[SlowRF]]-Modus verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Definition in fhem.cfg:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; CUL_EM &amp;amp;lt;code&amp;amp;gt; [corr1 corr2 CostPerUnit BasicFeePerMonth]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;amp;lt;code&amp;amp;gt;&#039;&#039;&#039; ist die Einstellung, die innerhalb des Sensors gewählt werden muss. Das EM1000-System sieht insgesamt 12 Adressen vor, von denen die Adressen 5..8 für EM1000EM vorgesehen sind. Aus diesem Bereich muss die zu verwendende Adresse per Tastendruck am Gerät ausgewählt werden (siehe Handbuch)&lt;br /&gt;
* &#039;&#039;&#039;[corr1,corr2]&#039;&#039;&#039; corr1 ist der Kalibrierfaktor für den Momentanverbrauch, corr2 für den Gesamtverbrauch, bitte die [http://fhem.de/commandref.html#CUL_EM Hinweise in der commandref] beachten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EMWZ Geräte&#039;&#039;&#039;&lt;br /&gt;
* corr1 = die Umdrehungsgeschwindigkeit (U/kW) des verwendeten Stromzählers (z.B. 150)&lt;br /&gt;
* corr2 = 12 mal des corr1 Wert (z.B. corr1=150 dann corr2=1800)&lt;br /&gt;
&lt;br /&gt;
=== Log-Auszüge ===&lt;br /&gt;
Erkennung des EM-1000-Sensors durch FHEM&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;2012.11.24 14:13:29 1: CUL_EM detected, Code 7 CNT: 222 CUM: 38721 5MIN: 0 TOP: 0&lt;br /&gt;
2012.11.24 14:13:29 2: autocreate: define CUL_EM_7 CUL_EM 7&lt;br /&gt;
2012.11.24 14:13:29 2: autocreate: define FileLog_CUL_EM_7 FileLog ./log/CUL_EM_7-%Y-%m.log CUL_EM_7:CNT.*&lt;br /&gt;
2012.11.24 14:13:29 2: autocreate: define weblink_CUL_EM_7 weblink fileplot FileLog_CUL_EM_7:power8:CURRENT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empfangene Daten des EM-1000-Sensors&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank CNT: 151 CUM: 41.394 5MIN: 0.050 TOP: 0.130&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank tsecs: 1354046303&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank seqno: 151&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank peak: 0.13&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank total: 41.394&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank current_cnt: 5&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank current: 0.05&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank total_cnt: 41394&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank peak_cnt: 13&lt;br /&gt;
2012-11-27 20:58:23 CUL_EM UG.EM7.Gefrierschrank RAW: CNT: 151 CUM: 41394 5MIN: 5 TOP: 13&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Basiswert zurücksetzen ===&lt;br /&gt;
Um den kumulierten Zählerstand einmalig auf den abgelesenen Zählerstand zu bringen, sind folgende Schritte erforderlich:&lt;br /&gt;
&lt;br /&gt;
* fhem stoppen (shutdown)&lt;br /&gt;
* folgende Zeile in fhem.save erzeugen:&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;setstate EMEZ_NAME 2012-mm-dd hh:MM:SS basis basisWert&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;mit &amp;amp;lt;basisWert&amp;amp;gt; = &amp;amp;lt;abgelesenerMeterWert&amp;amp;gt; / &amp;amp;lt;corr2&amp;amp;gt; - &amp;amp;lt;total_cnt_Reading&amp;amp;gt; &amp;lt;br /&amp;gt;(01.06.2013/Anmerkung PeMue: ist vermutlich nicht ganz korrekt, da im fhem Forum folgendes diskutiert wird: &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;basisWert&amp;gt; = &amp;amp;lt;zaehlerwert&amp;amp;gt; * &amp;amp;lt;corr1&amp;amp;gt; - &amp;amp;lt;total_cnt&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
*  dann fhem starten.&lt;br /&gt;
&lt;br /&gt;
Alternativ im Fhem-Befehlsfeld  mit dem Befehl:&lt;br /&gt;
:&amp;lt;code&amp;gt;{ setReadingsVal($defs{EMEZ_NAME},&amp;quot;basis&amp;quot;,basisWert,TimeNow()) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Das Senden der Verbrauchsdaten findet alle fünf Minuten mit einer Auflösung von 1Wh statt, somit erhält Fhem nur dann einen neuen Energieverbrauchswert, wenn insgesamt 1Wh verbraucht wurde. Bei geringer Leistungsaufnahme des Verbrauchers kann dies recht lange dauern.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Bedienungsanleitung bei ELV [http://www.elv-downloads.de/service/manuals/EM1000EM/62117_um.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EMS Components]]&lt;br /&gt;
[[Kategorie:Energieverbrauchsmessung]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Creating_Plots_-_caching_SVG%27s&amp;diff=7246</id>
		<title>Creating Plots - caching SVG&#039;s</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Creating_Plots_-_caching_SVG%27s&amp;diff=7246"/>
		<updated>2014-08-12T19:51:16Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem: ==&lt;br /&gt;
Die Anzeige von Grafiken in FHEM benötigt relativ lange Zeit. Speziell, wenn es um längere Zeiträume (Monat/Jahr) geht, und viele Werte gespeichert sind, kann das mehrere Sekunden dauern.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung geht davon aus, dass grundsätzliche Kenntnisse über Fhem sowie über die Vorgehensweise, wie Grafiken erstellt werden, besteht. Grundlegende Infos sind im Artikel [[Creating Plots]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Der Lösungsansatz ==&lt;br /&gt;
Alle Grafiken, die sich auf Werte in der Vergangenheit beziehen, ändern sich nicht mehr, werden aber dennoch jedesmal neu abgefragt und neu berechnet. Für diese Art von Grafiken wird eine caching Lösung aufgezeigt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Dieses Beispiel geht von folgendener Situation aus:&lt;br /&gt;
&lt;br /&gt;
* es gibt ein DbLog (in diesem Beispiel myDbLog), das alle readings speichert.&lt;br /&gt;
* es gibt einen Sensor (in diesem Beispiel &#039;&#039;&#039;AussenTempHum&#039;&#039;&#039;), der die readings &#039;&#039;&#039;temperature&#039;&#039;&#039; und &#039;&#039;&#039;humidity&#039;&#039;&#039; liefert.&lt;br /&gt;
* Das Beispiel geht davon aus, dass Fhem unter dem User fhem läuft.&lt;br /&gt;
&lt;br /&gt;
== Definitionen ==&lt;br /&gt;
=== Definition eines weblinks ===&lt;br /&gt;
 define AussenTempHum_current_day weblink dbplot myDbLog:TempHum_MH&lt;br /&gt;
 attr AussenTempHum_current_day label &amp;amp;quot;Temp- min: $data{min1}, max: $data{max1}, last: $data{currval1}, Feuchte- min: $data{min2}, max: $data{max2}, last: $data{currval2}&amp;amp;quot;&lt;br /&gt;
 attr AussenTempHum_current_day plotfunction AussenTempHum&lt;br /&gt;
 attr AussenTempHum_current_day title &amp;amp;quot;Aussen&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;&#039;plotfunction&#039;&#039;&#039; bestimmt, welches device in der Datenbank selektiert wird (in diesem Beispiel AussenTempHum).&lt;br /&gt;
&lt;br /&gt;
Die Attribute &#039;&#039;&#039;title&#039;&#039;&#039; und &#039;&#039;&#039;label&#039;&#039;&#039; bestimmen, was in der Überschriftszeile des Plots steht.&lt;br /&gt;
&lt;br /&gt;
=== Definition des gplotfile (TempHum_MH.gplot) ===&lt;br /&gt;
&lt;br /&gt;
 # TempHum_MH.gplot&lt;br /&gt;
 # MH 12/2012 support both dblog and filelog&lt;br /&gt;
 # Attribute &#039;small&#039; is useful for gnuplot/-scroll only,&lt;br /&gt;
 # if plotsize is less than 800,400&lt;br /&gt;
 #set terminal png transparent small size &amp;amp;lt;SIZE&amp;amp;gt; crop&lt;br /&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;amp;quot;%Y-%m-%d_%H:%M:%S&amp;amp;quot;&lt;br /&gt;
 set xlabel &amp;amp;quot; &amp;amp;quot;&lt;br /&gt;
 set ytics nomirror&lt;br /&gt;
 set y2tics&lt;br /&gt;
 #set ytics&lt;br /&gt;
 set title &#039;&amp;amp;lt;TL&amp;amp;gt; &amp;amp;lt;L1&amp;amp;gt;&#039;&lt;br /&gt;
 set grid xtics y2tics&lt;br /&gt;
 set y2label &amp;amp;quot;Temperature (°C)&amp;amp;quot;&lt;br /&gt;
 set ylabel &amp;amp;quot;Humidity (%RF)&amp;amp;quot;&lt;br /&gt;
 set yrange [0:99]&lt;br /&gt;
 #FileLog 4:temperature:10:&lt;br /&gt;
 #FileLog 4:humidity:50:&lt;br /&gt;
 #DbLog &amp;amp;lt;SPEC1&amp;amp;gt;:temperature:10:&lt;br /&gt;
 #DbLog &amp;amp;lt;SPEC1&amp;amp;gt;:humidity:50:&lt;br /&gt;
 plot \&lt;br /&gt;
  ls l0 axes x1y2 title &#039;Measured temperature&#039; with lines&lt;br /&gt;
  ls l1fill axes x1y1 title &#039;Humidity&#039; with lines&lt;br /&gt;
&lt;br /&gt;
Nachdem diese beiden Definitionen aktiviert worden sind, sollte es in Fehm eine Grafik geben, die in etwa so aussieht:&lt;br /&gt;
&lt;br /&gt;
[[File:Cachesvg.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Bis hierher war alles standard Fhem, das sollte also funktionieren bevor es zum schwierigen Teil kommt.&lt;br /&gt;
&lt;br /&gt;
Es wird ein Verzeichnis benötigt, um die Grafiken zu speichern, wo Fhem sie nachher auch wieder finden kann und darf, in diesem Beispiel (telnet/SSH auf Raspberry PI):&lt;br /&gt;
&lt;br /&gt;
 sudo mkdir /opt/fhem/svgcache/&lt;br /&gt;
 sudo chown -R fhem:root /opt/fhem/svgcache/&lt;br /&gt;
&lt;br /&gt;
== Erster Test ==&lt;br /&gt;
Ein erster Test (von der telnet/SSH commandline) wird mit den folgenden Kommandos durchgeführt:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;cd /opt/fhem/svgcache/&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo -u fhem wget -O testx.svg &amp;lt;nowiki&amp;gt;&#039;http://localhost:8083/fhem?cmd=showlog&amp;lt;/nowiki&amp;gt; AussenTempHum_current_day myDbLog  TempHum_MH -&amp;amp;amp;pos=zoom=month;off=0&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die wesentlichen Parameter sind: &lt;br /&gt;
;sudo -u fhem :damit läuft das wget unter dem user &#039;fhem&#039;, damit es keine Probleme mit Dateiberechtigungen gibt. &lt;br /&gt;
;-O testx.svg :das ist der Dateiname, unter dem die erstellte svg gespeichert wird.&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;http://localhost:8083&amp;lt;/nowiki&amp;gt; : muss jeweils angepasst werden....&lt;br /&gt;
;&amp;amp;amp;pos=zoom=xxx;off=yyy : xxx: year, month, week, day - die Zeitspanne &amp;lt;br&amp;gt;  yyy: 0, -1, -2, ...     - wieviele Zeitspannen zurück, 0==aktuell &amp;lt;br&amp;gt; Beipiel: &amp;amp;amp;pos=zoom=month;off=-1 - ergibt die Grafik des vorherigen Monats.&lt;br /&gt;
&lt;br /&gt;
Und das Ergebnis bewundern (im Browser):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://localhost:8083/fhem/svgcache/testx.svg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es sollte jetzt die gewünschte Grafik aufgebaut werden. &lt;br /&gt;
&lt;br /&gt;
=== Todo ===&lt;br /&gt;
Automatisieren der Grafikerstellung mittels fhem at.&lt;br /&gt;
&lt;br /&gt;
== Die gespeicherten SVGs von Fhem anzeigen lassen ==&lt;br /&gt;
=== Definitionen ===&lt;br /&gt;
Die folgende Definition ist als eine Zeile (ohne Zeilenumbrüche) einzutragen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define AussenTempHum_lastmonth weblink htmlCode &amp;amp;lt;br/&amp;amp;gt;&amp;amp;lt;object data=&amp;amp;quot;/fhem/svgcache/AussenTempHum_month-last.svg&amp;amp;quot; type=&amp;amp;quot;image/svg+xml&amp;amp;quot; width=&amp;amp;quot;800&amp;amp;quot; height=&amp;amp;quot;160&amp;amp;quot; name=&amp;amp;quot;weblink_test&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;/object&amp;amp;gt; &amp;amp;lt;br/&amp;amp;gt; &amp;amp;lt;a href=&amp;amp;quot;/fhem?detail=AussenTempHum_lastmonth&amp;amp;quot;&amp;amp;gt;AussenTempHum last month&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird Fhem mitgeteilt, wo die Grafik zu finden ist (object data=&amp;quot;&#039;&#039;&#039;/fhem/svgcache/Au...&#039;&#039;&#039;).&lt;br /&gt;
Der Dateiname muss natürlich mit dem aus dem vorherigen wget übereinstimmen!&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
Damit können beliebige plots definiert, gepeichert und von Fhem relativ schnell abgerufen werden. Grundsätzlich wäre diese Lösung auch ohne DbLog möglich, allerdings müssten dazu die Beispiele überarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Have fun Erwin. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Intertechno_Code_Berechnung&amp;diff=7245</id>
		<title>Intertechno Code Berechnung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Intertechno_Code_Berechnung&amp;diff=7245"/>
		<updated>2014-08-12T19:50:39Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Intertechno&#039;&#039;&#039; Systemkomponenten sind kostengünstige und weit verbreitete Funkschalter/-dimmer im 433 MHz Bereich, die man in fast jedem Baumarkt unter den Markennamen Intertechno, düwi, KlikAanKlikUit usw. erhalten kann. &lt;br /&gt;
&lt;br /&gt;
Es gibt eine Anzahl weiterer Hersteller/Handelsmarken mit ähnlicher Kodierung oder Einstellmöglichkeiten mit DIP Schaltern, die ebenfalls mit dem Intertechno Code geschaltet werden können. Dazu zählen von Usern bereits erfolgreich getestete Geräte von Elro AB440, FLS-100/m-e, Wetekom/Westfalia und weitere, theoretisch mögliche aber ungetestete Systeme wie Unitec oder Arctech Steckdosen (siehe [http://avr.börke.de/E-Funk.htm Börkes-HP])&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen in Fhem ==&lt;br /&gt;
Schalten kann man die Intertechno Funkkomponenten in Fhem über verschiedene Wege. So z.B. über CUL/CUNO, Tellstick, [[AVR-NET-IO]].&lt;br /&gt;
&lt;br /&gt;
Hier beschrieben ist die Ansteuerung über CUL/CUNO, dessen Firmware für Intertechno erweitert wurde (Danke an Olaf Droegehorn). Momentan ist in CUL/CUNO das SENDEN von Intertechno Funk implementiert. Die Firmware muss mindestens den Stand 1.44 haben (Kontrolle der Version in den Fhem Detaildaten zum [[CUL]]/[[CUNO]]). Die CUL433/CUNO433 haben dabei volle Reichweite, die Versionen CUL868/CUNO868 funktionieren ebenfalls, haben aufgrund der nicht optimalen Antennenlänge für den Frequenzbereich aber nur eine eingeschränke Reichweite.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definiton des IT Gerätes in FHEM sieht so aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define myITSwitch IT &amp;amp;lt;housecode&amp;amp;gt;&amp;amp;lt;group_switch&amp;amp;gt; &amp;amp;lt;on-code&amp;amp;gt; &amp;amp;lt;off-code&amp;amp;gt; [&amp;amp;lt;dimup-code&amp;amp;gt; &amp;amp;lt;dimdown-code&amp;amp;gt;]&lt;br /&gt;
 attr myITSwitch IODev CUL_x (CUNO_x)&lt;br /&gt;
 attr myITSwitch model itswitch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die weitere Anleitung soll die Bildung der Bitfolge für die Zusammensetzung des Schaltcodes erklären. &lt;br /&gt;
Wichtig zu wissen ist auch, dass es sich um einen 3state code handelt, d.h. jedes Bit kann &#039;&#039;&#039;0,1 oder F&#039;&#039;&#039; sein!&lt;br /&gt;
&lt;br /&gt;
== Original Intertechno System ==&lt;br /&gt;
=== Hauscode (die ersten vier Stellen (0-3) ===&lt;br /&gt;
Der Hauscode wird auf dem Drehschalter auf der Rückseite eingestellt und hat die Bezeichnung &#039;&#039;&#039;A-P&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Img_3324_small.png|thumb|Intertechno Schalter]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Drehschalter !! Stelle 0-3&lt;br /&gt;
|-&lt;br /&gt;
| A || 0000&lt;br /&gt;
|-&lt;br /&gt;
| B || F000&lt;br /&gt;
|-&lt;br /&gt;
| C || 0F00&lt;br /&gt;
|-&lt;br /&gt;
| D || FF00&lt;br /&gt;
|-&lt;br /&gt;
| E || 00F0&lt;br /&gt;
|-&lt;br /&gt;
| F || F0F0&lt;br /&gt;
|-&lt;br /&gt;
| G || 0FF0&lt;br /&gt;
|-&lt;br /&gt;
| H || FFF0&lt;br /&gt;
|-&lt;br /&gt;
| I || 000F&lt;br /&gt;
|-&lt;br /&gt;
| J || F00F&lt;br /&gt;
|-&lt;br /&gt;
| K || 0F0F&lt;br /&gt;
|-&lt;br /&gt;
| L || FF0F&lt;br /&gt;
|-&lt;br /&gt;
| M || 00FF&lt;br /&gt;
|-&lt;br /&gt;
| N || F0FF&lt;br /&gt;
|-&lt;br /&gt;
| O || 0FFF&lt;br /&gt;
|-&lt;br /&gt;
| P || FFFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Gruppen-/Gerätecode (Stelle 4-7) ===&lt;br /&gt;
Der zweite Drehschalter ist mit den Zahlen von 1-16 beschriftet. Das ist eine Zusammensetzung von Gruppe und Gerätecode und ergibt die nächsten 4 Stellen. Die dritte Spalte in der Tabelle zeigt die Zuordnung einer Intertechno YCT-100 / ITS-150 Fernbedienung. Diese ist mit Drehschalter auf der Rückseite (A-P), einem Gruppenschalter (1-4) , und je vier  ein-/aus-Tasten belegt.&lt;br /&gt;
&lt;br /&gt;
[[File:Img_3325_small.png|right|thumb|Intertechno Fernbedienung]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Drehschalter !! Stelle 4-7 !! Fernbedienung Gruppe/Taste&lt;br /&gt;
|-&lt;br /&gt;
| 01 || 0000 || 1 - 1&lt;br /&gt;
|-&lt;br /&gt;
| 02 || F000 || 1 - 2&lt;br /&gt;
|-&lt;br /&gt;
| 03 || 0F00 || 1 - 3&lt;br /&gt;
|-&lt;br /&gt;
| 04 || FF00 || 1 - 4&lt;br /&gt;
|-&lt;br /&gt;
| 05 || 00F0 || 2 - 1&lt;br /&gt;
|-&lt;br /&gt;
| 06 || F0F0 || 2 - 2&lt;br /&gt;
|-&lt;br /&gt;
| 07 || 0FF0 || 2 - 3&lt;br /&gt;
|-&lt;br /&gt;
| 08 || FFF0 || 2 - 4&lt;br /&gt;
|-&lt;br /&gt;
| 09 || 000F || 3 - 1&lt;br /&gt;
|-&lt;br /&gt;
| 10 || F00F || 3 - 2&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0F0F || 3 - 3&lt;br /&gt;
|-&lt;br /&gt;
| 12 || FF0F || 3 - 4&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 00FF || 4 - 1&lt;br /&gt;
|-&lt;br /&gt;
| 14 || F0FF || 4 - 2&lt;br /&gt;
|-&lt;br /&gt;
| 15 || 0FFF || 4 - 3&lt;br /&gt;
|-&lt;br /&gt;
| 16 || FFFF || 4 - 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Stellen 8-9 (Festwert 0F) ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Die Positionen 8-9 sind immer fest auf &#039;&#039;&#039;0F&#039;&#039;&#039;zu stellen&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stellen 10-11 (Ein/Aus) ===&lt;br /&gt;
Bei den beiden letzten Stellen steht als Codierung für ON = FF und OFF = F0.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Drehschalter/Hauscode auf &#039;&#039;&#039;A&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Schalter 1 -&amp;amp;gt; 000000000F FF F0 (entspricht Fernbedienung Gruppe I und Schalter 1)&lt;br /&gt;
 Schalter 2 -&amp;amp;gt; 0000F0000F FF F0 (entspricht Fernbedienung Gruppe I und Schalter 2)&lt;br /&gt;
 Schalter 3 -&amp;amp;gt; 00000F000F FF F0 (entspricht Fernbedienung Gruppe I und Schalter 3)&lt;br /&gt;
 Schalter 4 -&amp;amp;gt; 0000FF000F FF F0 (entspricht Fernbedienung Gruppe I und Schalter 4)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drehschalter/Hauscode auf &#039;&#039;&#039;L&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Schalter 11 -&amp;amp;gt; FF0F0F0F0F FF F0 (entspricht Fernbedienung Gruppe III und Schalter 3)&lt;br /&gt;
 Schalter 16 -&amp;amp;gt; FF0FFFFF0F FF F0 (entspricht Fernbedienung Gruppe IV und Schalter 4)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
komplett für die fhem cfg also z.B. Hauscode A und Gruppe 1 Gerät/Schalter 1 und CUL Bezeichnung CUL1:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; define schalter1 IT 000000000F FF F0&lt;br /&gt;
 attr schalter1 IODev CUL1&lt;br /&gt;
 attr schalter1 model itswitch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selbstlernende Intertechno Funksteckdosen (z.B. ITR-1500) ===&lt;br /&gt;
Zum Anlernen der selbst lernenden Funksteckdosen muss ein gültiger(!) ON-Befehl in den ersten fünf Sekunden nach dem Einstecken der Funksteckdose in eine normalen Steckdose gesendet werden. Die Funksteckdosen haben drei Speicherplätze, so dass man beispielsweise ein ITR-1500 Set zuerst mit der Fernbedienung anlernen und anschließend eigene Codes von Fhem senden lassen kann. Damit man einen gültigen Code sendet, sucht man sich einfach eine beliebige Kombination aus der obigen Tabelle aus (z.B. C-1, C-2 und C-3) und ergänzt entsprechend um die immer identischen Stellen 8 und 9 (0F) und den ON- und OFF-Code (FF/F0).&lt;br /&gt;
Das Senden der Codes von Fhem erfolgt am einfachsten, indem man sich die Steckdosen vorher in der Konfiguration so anlegt, wie man sie haben möchte und anschließend über die Weboberfläche den ON-Befehl gibt.&lt;br /&gt;
&lt;br /&gt;
Mitunter funktioniert das reine Senden des ON Befehls aber nicht, da einige dieser Steckdosen einen längeren ON Befehl benötigen und die Sendedauer bei Fhem/CUL/CUNO nicht beeinflusst werden kann. In diesem Fall nimmt man eine YCT-100 Fernbedienung, an der die gewünschte Adresse eingestellt werden kann. Zum Anlernen drückt man nun etwas länger auf den passenden Einschaltknopf, danach kann die Dose von Fhem normal geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
== FLS 100 ==&lt;br /&gt;
[[File:FLS100.jpg|right|thumb|FLS100 - konfiguriert auf IV/3]]&lt;br /&gt;
&lt;br /&gt;
Beim FLS 100 von m-e.de gibt es nur 4 mögliche Einstellungen: &#039;&#039;&#039;I, II, III und IV&#039;&#039;&#039;. Dies entspricht der Gruppe auf der Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Drehschalter !! Stelle 0-3&lt;br /&gt;
|-&lt;br /&gt;
| I || 0FFF &lt;br /&gt;
|-&lt;br /&gt;
| II || F0FF&lt;br /&gt;
|-&lt;br /&gt;
| III || FF0F&lt;br /&gt;
|-&lt;br /&gt;
| IV || FFF0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die nächsten vier Stellen geben die Geräte ID an; diese ist identisch mit der Taste an der Fernbedienung.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Drehschalter !! Stelle 4-7 !! Fernbedienung Taste&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0FFF || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || F0FF || 2&lt;br /&gt;
|-&lt;br /&gt;
| 3 || FF0F || 3&lt;br /&gt;
|-&lt;br /&gt;
| 4 || FFF0 || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beim FLS 100 ist nur die letzte Stelle relevant, mit ON: F oder OFF: 0&lt;br /&gt;
&lt;br /&gt;
== REV Telecontrol ==&lt;br /&gt;
[[File:Rev-funksteckdose-telecontrol-3500-w-008345.png|right|thumb|REV Telecontrol]]&lt;br /&gt;
&lt;br /&gt;
Die REV Telecontrol haben einen Dreh-Wahlschalter auf der Rückseite, mit dem sich der Hauscode (A - D) und der Gerätecode (1 - 3) bestimmen lässt. &lt;br /&gt;
&lt;br /&gt;
Die Codierung ist dabei:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Hauscode !! Stelle 1-4&lt;br /&gt;
|-&lt;br /&gt;
| A || 1FFF&lt;br /&gt;
|-&lt;br /&gt;
| B || F1FF&lt;br /&gt;
|-&lt;br /&gt;
| C || FF1F&lt;br /&gt;
|-&lt;br /&gt;
| D || FFF1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gerätecode !! Stelle 5-7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1FF&lt;br /&gt;
|-&lt;br /&gt;
| 2 || F1F&lt;br /&gt;
|-&lt;br /&gt;
| 3 || FF1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dazu (Stelle 8+9+10) noch drei statische Werte: 0FF.&lt;br /&gt;
&lt;br /&gt;
Der Code für &#039;&#039;&#039;An&#039;&#039;&#039; ist FF, für &#039;&#039;&#039;Aus&#039;&#039;&#039; 00.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
:&amp;lt;code&amp;gt;define My_Switch IT 1FFF1FF0FF FF 00 für A1&amp;lt;/code&amp;gt;&lt;br /&gt;
Erfolgreich getestet mit CULfw V 1.49 CUL868.&lt;br /&gt;
&lt;br /&gt;
== Elro AB440 ==&lt;br /&gt;
=== Möglichkeit 1: zu Intertechno-Codes umdippen ===&lt;br /&gt;
[[File:ELRO-AB440_Funkschalter.jpg|right|thumb|Élro AB440 Funkschalter]]&lt;br /&gt;
&lt;br /&gt;
Günstige ELRO Funkschalter/Dimmer der Serie 440 lassen sich auch problemlos auf Intertechno Codierung &amp;quot;umdippen&amp;quot; und damit voll kompatibel mit allen möglichen A-P / 1-16 Intertechno Schaltcodes von Fhem aus nutzen. Dazu müssen die Dipschalter-Stellungen entsprechend Intertechno umgerechnet und gesetzt werden (1=ON, 0=OFF). &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Intertechno  !! Elro Hauscode&amp;lt;br&amp;gt;1234  !! Elro Gerätecode&amp;lt;br&amp;gt;5ABCDE &lt;br /&gt;
|-&lt;br /&gt;
| A1  || 1111 || 111110 &lt;br /&gt;
|-&lt;br /&gt;
| A2  || 1111 || 011110 &lt;br /&gt;
|-&lt;br /&gt;
| A3  || 1111 || 101110 &lt;br /&gt;
|-&lt;br /&gt;
| A4  || 1111 || 001110 &lt;br /&gt;
|-&lt;br /&gt;
| A5  || 1111 || 110110 &lt;br /&gt;
|-&lt;br /&gt;
| A6  || 1111 || 010110 &lt;br /&gt;
|-&lt;br /&gt;
| A7  || 1111 || 100110 &lt;br /&gt;
|-&lt;br /&gt;
| A8  || 1111 || 000110 &lt;br /&gt;
|-&lt;br /&gt;
| A9  || 1111 || 111010 &lt;br /&gt;
|-&lt;br /&gt;
| A10  || 1111 || 011010 &lt;br /&gt;
|-&lt;br /&gt;
| A16  || 1111 || 000010 &lt;br /&gt;
|-&lt;br /&gt;
| C1  || 1011 || 111110 &lt;br /&gt;
|-&lt;br /&gt;
| C2  || 1011 || 011110 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Erklärungen sind z.B. im [http://isn-systems.com/tools/it2elro Tool] der Fa. ISN-systems online berechnen lassen.&lt;br /&gt;
&lt;br /&gt;
Einziger Nachteil: Die originale Elro Fernbedienung funktioniert dann nicht mehr uneingeschränkt mit den Funkschaltern (eine Intertechno Fernbedienung funktioniert uneingeschränkt). Wenn man den Hauscode an der Fernbedienung einstellt, kann man durch drücken von z.T. mehreren Tasten gleichzeitig auch Intertechno schalten. Das ist aber nur was für den Notfall oder für Handakrobaten.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;15/16 -&amp;amp;gt; D&lt;br /&gt;
13/14 -&amp;amp;gt; A+D&lt;br /&gt;
11/12 -&amp;amp;gt; B+D&lt;br /&gt;
09/10 -&amp;amp;gt; A+B+D&lt;br /&gt;
07/08 -&amp;amp;gt; C+D&lt;br /&gt;
05/06 -&amp;amp;gt; A+C+D&lt;br /&gt;
03/04 -&amp;amp;gt; B+C+D&lt;br /&gt;
01/02 -&amp;amp;gt; A+B+C+D&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Möglichkeit 2: aus der vorhanden DIP-Schalterstellung den entsprechenden 10-digit InterTechno Code bestimmen ===&lt;br /&gt;
Das ist prinzipiell ganz einfach. Hat man folgende DIP-Schalter-Stellung so muss man von links nach rechts einfach für jeden DIP gleich &amp;quot;ON&amp;quot; eine &amp;quot;0&amp;quot; und für &amp;quot;OFF&amp;quot; ein &amp;quot;F&amp;quot; definieren. Für die dargestellte DIP-Einstellung ergibt sich der damit der darunterstehende InterTechno Code:&lt;br /&gt;
&lt;br /&gt;
[[File:ELRO_0100101111.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0F00F0FFFF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analog dazu ergeben sich für den gleichen Hauscode (Schalter 1-5) folgende Codes für die Funksteckdosen B bis E, wobei die Dose E mit der Originalfernbedienung nicht adressierbar ist, sich mit FHEM aber wunderbar schalten lässt.&lt;br /&gt;
&lt;br /&gt;
[[File:ELRO_0100110111.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0F00FF0FFF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:ELRO_0100111011.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0F00FFF0FF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:ELRO_0100111101.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0F00FFFF0F&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:ELRO_0100111110.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0F00FFFFF0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dazu noch die Codes für AN = FF und AUS = F0 schaut eine vollständige Definition eines ELRO440 Funkschalters dann bsw. so aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; define ELRO_10110_A IT 0F00F0FFFF FF F0&lt;br /&gt;
 attr ELRO_10110_A IODev CUL_0&lt;br /&gt;
 attr ELRO_10110_A alias Stehlampe&lt;br /&gt;
 attr ELRO_10110_A fp_Grundriss 340,50,1,Stehlampe&lt;br /&gt;
 attr ELRO_10110_A group Schalter&lt;br /&gt;
 attr ELRO_10110_A model itswitch&lt;br /&gt;
 attr ELRO_10110_A room Wohnzimmer&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wetekom/Westfalia ==&lt;br /&gt;
[[File:Westfalia-Funksteckdose.jpg|right|thumb|Westfalia Funksteckdose ZTC-S316A.]]&lt;br /&gt;
Der eingestellte Hauscode ist F00F0FFF0F.&lt;br /&gt;
&lt;br /&gt;
In den Westfalia-Baumärkten gibt es Funksteckdosen mit Westfalia-Branding. Auf der Bedienungsanleitung steht aber Wetekom.&lt;br /&gt;
&lt;br /&gt;
Die Funksteckdosen selbst haben zehn DIP-Switches: 1234FEDCBA, während die Fernbedienung nur sechs hat: ABCDEF. Damit die Fernbedienung mit den Funksteckdosen funktioniert, darf man nur einen der DIP-Switches 1234 pro Funksteckdose auf ON schalten.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung der DIP-Switches ABCDEF4321 entspricht direkt und in dieser Reihenfolge (also andersrum als direkt an der Funksteckdose) dem Hauscode und zwar entspricht ein Switch auf OFF einem F im Hauscode und ein Switch auf ON einer 0 im Hauscode.&lt;br /&gt;
&lt;br /&gt;
Die Steckdosen werden dann mit 01 ein- und mit 10 ausgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
define wf_steckdose IT F00F0FFF0F 01 10&lt;br /&gt;
&lt;br /&gt;
== Pollin Funksteckdosen ==&lt;br /&gt;
&lt;br /&gt;
Vom Aussehen sind die Steckdosen von Pollin (z.B. 3fach Set 550666) mit den Westfalia ZTC identisch, aber:&lt;br /&gt;
&lt;br /&gt;
* die DIP Schalter sind beschriftet von 0 bis 10;&lt;br /&gt;
* der Adresscode entspricht dem invertierten ELRO 440 Code -&amp;gt;also  (0=ON, 1=OFF)&lt;br /&gt;
* der Code für &amp;quot;An&amp;quot; ist 0F, für &amp;quot;Aus&amp;quot; F0&lt;br /&gt;
&lt;br /&gt;
Beispiel für Adresse C2:&lt;br /&gt;
&lt;br /&gt;
define IT_C2 IT 0F00F0000F 0F F0&lt;br /&gt;
&lt;br /&gt;
== me micro-electric AS 73 ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Me_AS_73.JPG|right|thumb|micro-electric Funksteckdose AS 73]]&lt;br /&gt;
&lt;br /&gt;
Die micro-electric Funksteckdosen haben 10 DIP-Schalter: 123456ABCD.&lt;br /&gt;
&lt;br /&gt;
Der Hauscode wird an Sender und Steckdose mit 1-6 eingestellt, der Empfängercode A-D entspricht den Kanälen auf dem Handsender.&lt;br /&gt;
&lt;br /&gt;
DIP-Schalterstellung OFF entspricht F und ON entspricht 0.&lt;br /&gt;
&lt;br /&gt;
Die Steckdosen werden mit F0 ein- und mit 0F ausgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Empfängercodes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kanal  !! Position 7-10&lt;br /&gt;
|- &lt;br /&gt;
| A  || 0FFF  &lt;br /&gt;
|-&lt;br /&gt;
| B  || F0FF  &lt;br /&gt;
|-&lt;br /&gt;
| C  || FFF0 (Achtung: bei C und D sind die Codes vertauscht)  &lt;br /&gt;
|-&lt;br /&gt;
| D  || FF0F  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Schalter_ME_A IT 0F0F000FFF F0 0F&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Schalter_ME_A IODev CUL1&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Schalter_ME_A model itswitch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conrad / McPower Funkschaltset 3+1 ==&lt;br /&gt;
Dieses Funkschaltset wird unter mehreren Namen in verschiedenen Bau- und Heimwerkermärkten sowie bei Conrad (Best Nr. 640475 - 62) vertrieben. Teilweise auch mit unterschiedlichen Schaltleistungen.&lt;br /&gt;
Die Konfiguration funktioniert genauso wie beim [http://www.fhemwiki.de/wiki/Intertechno_Code_Berechnung#FLS_100 FLS100]&lt;br /&gt;
&lt;br /&gt;
== Noch nicht aufgeführte Geräte ==&lt;br /&gt;
Wer ein Intertechno-ähnliches Gerät besitzt, das in dieser Liste noch nicht aufgeführt ist, muss die Kodierung selbst bestimmen. Dazu gibt es verschiedene Möglichkeiten, die in diesem Abschnitt aufgeführt werden. Die Ergebnisse bitte hier eintragen, um Nachfolgern die Arbeit zu ersparen!&lt;br /&gt;
&lt;br /&gt;
=== Audio-Eingang zur Messung ===&lt;br /&gt;
Hier wird die Fernbedienung oder der Empfänger mit einer entsprechenden Schaltung an den Mikrofon-Eingang eines Rechners angeschlossen und mit einem Audio-Programm werden die Signalverläufe aufgenommen. Diese Methode wird [http://avr.börke.de/E-Funk.htm hier] näher erläutert.&lt;br /&gt;
&lt;br /&gt;
=== Platine analysieren ===&lt;br /&gt;
Platine der Fernbedienung oder des Empfängers betrachten und so die Beschaltung des Decoder/Encoder Chips ermitteln. Bei der Wetekom-Fernbedienung wird beispielsweise der Chip LP801b verwendet, der funktional identisch zum PT2262 ist. Im [http://www.escol.com.my/Datasheets_specs/pt2262_1.pdf Datenblatt des PT2262] kann man dann die Beschaltung nachsehen. Nun betrachtet man den Verlauf der Leiterbahnen auf der Platine, um die Beschaltung des Chips zu ermitteln. So kann man beispielsweise bei der Wetekom-Fernbedienung sehen, dass die DIP-Switches A bis F auf die Eingänge A0 bis A5 geschaltet sind. Außerdem sieht man, mit welchen Eingängen die einzelnen Taster verbunden sind.&lt;br /&gt;
&lt;br /&gt;
[[File:Westfalia-Funkfernbedienung-hinten.jpg|right|thumb|Platine der Westfalia Funkfernbedienung ZTC-TC von hinten.]]&lt;br /&gt;
[[File:Westfalia-Funkfernbedienung-vorne.jpg|right|thumb|Platine der Westfalia Funkfernbedienung ZTC-TC von vorne.]]&lt;br /&gt;
&lt;br /&gt;
Nun kann man messen, zwischen welchen Chip-Eingängen und Batteriepolen eine Spannung anliegt, bzw. (ohne Batterie) zwischen welchen Chip-Eingängen und Batteriepolen es einen Durchgang gibt, um zu ermitteln, wie die DIP-Switches schalten. Im Fall der Wetekom-Fernbedienung liegt keine Spannung zwischen den Eingängen und den beiden Batteriepolen an, wenn die DIP-Switches auf OFF stehen: Der Eingang liegt also auf F (Float). Wenn die DIP-Switches auf ON stehen, liegt nur eine Spannung zwischen dem Pluspol der Batterie und dem Eingang an, es gibt also einen Durchgang zwischen dem Minuspol und dem Eingang, so dass der Eingang auf V_SS liegt und damit 0 eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
Bei den Eingängen D0 und D1 sieht man, dass der Batterie-Pluspol immer über einen Widerstand mit dem Dateneingang verbunden ist, also normalerweise 1 anliegt. Ist aber ein Ein-Taster gedrückt, wird der Eingang D1 direkt mit dem Minuspol der Batterie verbunden, bei den Aus-Tastern der Eingang D0 (die Verbindung der Aus-Taster ist auf den Bildern nicht besonders gut zu erkennen). Durch diese Verbindung wird der Eingang auf V_SS heruntergezogen und damit ist 0 eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== Mit CUL im Debug-Modus Rohsignale empfangen und analysieren ===&lt;br /&gt;
Das hat wohl noch keiner versucht, wurde aber [http://forum.fhem.de/index.php/topic,5599.0.html in der FHEM Users-Mailingliste diskutiert].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Mischersteuerung&amp;diff=7244</id>
		<title>Mischersteuerung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Mischersteuerung&amp;diff=7244"/>
		<updated>2014-08-12T19:49:11Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:Mischerregelung }}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellmotor Zeitsteuerung mit Zeitabweichungskorrektur.&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef= ---- noch nicht Teil von FHEM ----&lt;br /&gt;
|ModTechName=39_STELLMOTOR.pm&lt;br /&gt;
|ModOwner=epsrw1,cwagner}}&lt;br /&gt;
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[STELLMOTOR]] bietet eine einfache Möglichkeit, mit zwei Relais den Rechts-/Linkslauf eines (Mischer)motors zu steuern. &lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Diese Wiki-Seite beschreibt die Version 2.0 des STELLMOTOR Moduls.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* Wiedereintrittsfähig nach einem Neustart&lt;br /&gt;
* Wiederholungsgenauigkeit durch Ausgleich von Rundungs- und Laufzeitabweichungen&lt;br /&gt;
* Vermeiden von Blockade des FHEM während der Laufzeit des Motors&lt;br /&gt;
&lt;br /&gt;
Thread im Forum:[http://forum.fhem.de/index.php/topic,23933.0.html]&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:dok39_STELLMOTOR.jpg|mini|Funktionsweise]]&lt;br /&gt;
Typischerweise werden im Heizkreislauf Mischer eingesetzt, um einen Heizkreis mit unabhängig vom Kesselbrenner geregelten Vorlauf zu erreichen. Auch kann man so in einer Heizanlage, die mit für Fußbodenheizung zu hohen Vorläufen arbeiten muss, einen Kreis mit begrenztem Vorlauf abzuzweigen.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des hier beschriebenen Moduls VALVES [http://www.fhemwiki.de/wiki/Raumbedarfsabh%C3%A4ngige_Heizungssteuerung] kann ein geschlossener Regelkreislauf hergestellt werden, der sich am Bedarf der Wohnräume orientiert.&lt;br /&gt;
&lt;br /&gt;
Vorrangig ist dieses Modul für zwei Relais an GPIO- oder an PIFace-Pins eines Rasberrys gedacht; es bietet aber auch die Option, zwei Schaltaktoren per Funk (aus Timinggründen nicht empfohlen) oder 1-Wire anzusteuern. &lt;br /&gt;
&lt;br /&gt;
Die Set-Befehle für die Mischerstellung kommen idealerweise aus der Bewertung der Vorlauftemperatur durch ein Modul wie PID20 [http://www.fhemwiki.de/wiki/PID20_-_Der_PID-Regler]. Dieser berücksichtigt auch den zeitlichen Verlauf der Temperaturänderungen im Vorlauf und ist vielfältig anpassbar.&lt;br /&gt;
&lt;br /&gt;
Aus den Werten MaxTics (Default=100, für Prozentanzeige) und MaxDriveSeconds (Laufzeit des Motors von 0 bis 100%) wird die Zeit berechnet, die der Motor nach rechts oder links laufen muss, um die mit set gewünschte Ventilstellung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
FHEM läuft dann weiter ohne einzufrieren, und prüft im Loop nur noch ob, die Stoppzeit im Cache erreicht ist. Da der Stopp nie exakt zur geplanten Zeit ausgeführt wird, liegt im Cache ein weiterer Wert der die Differenz zwischen geplanter und tatsächlicher Stoppzeit dem nächsten Kommando hinzurechnet. So werden sich addierende kleine Zeitdifferenzen vermieden.&lt;br /&gt;
&lt;br /&gt;
Zum Kalibrieren (set calibrate) fährt der Motor einfach volle Zeit nach links/null. Hier wird der in Mischermotoren wie dem Honeywell Centra VMK eingebauten Entschaltetr genutzt, um den &amp;quot;Null-Punkt&amp;quot; sicher zu finden. Falls ein angeschlossener Motor solche Endschalter nicht hat, müssen die für diese Schaltungsweise unbedingt vorgesehen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  define &amp;lt;name&amp;gt; STELLMOTOR &amp;lt;PiFace|Gpio|FhemDev|SysCmd&amp;gt;  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Je nach Device Typ sind verschiedene Attribute zur erforderlich, damit STELLMOTOR weiß wie die beiden Relais angeschlossen sind.&lt;br /&gt;
* &#039;&#039;&#039;PiFace&#039;&#039;&#039; und &#039;&#039;&#039;Gpio&#039;&#039;&#039; benötigen STMgpioPortRL und STMgpioPortSTART&lt;br /&gt;
* &#039;&#039;&#039;FhemDev&#039;&#039;&#039; benötigt STMfhemDevRL und STMfhemDevSTART &lt;br /&gt;
* &#039;&#039;&#039;SysCmd&#039;&#039;&#039; benötigt STMsysCmdRL und STMsysCmdSTART&lt;br /&gt;
&lt;br /&gt;
Für den Schaltvorgang &amp;quot;baut&amp;quot; STELLMOTOR einen set-Befehl zusammen. Beispielsweise bei FhemDev&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  set &amp;lt;**..PortRL&amp;gt; 0     sowie      set &amp;lt;**..PortSTART&amp;gt; 1      zum Einschalten links  &lt;br /&gt;
  set &amp;lt;**..PortRL&amp;gt; 1     sowie      set &amp;lt;**..PortSTART&amp;gt; 0      zum Einschalten rechts (bei Type &amp;quot;einzel&amp;quot;, sonst 1,1)&lt;br /&gt;
  set &amp;lt;**..PortRL&amp;gt; 0     sowie      set &amp;lt;**..PortSTART&amp;gt; 0      zum Ausschalten&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Schaltbefehle 0 und 1 können mit Attributen invertiert und/oder gemapped werden (zB.: On/Off)&lt;br /&gt;
&lt;br /&gt;
Um die Wirkung auszuprobieren, ohne jedes Mal zum Mischer rennen zu müssen, bietet sich an zwei &#039;&#039;&#039;Dummys&#039;&#039;&#039; zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define Stellmotor2rl dummy&lt;br /&gt;
&lt;br /&gt;
define Stellmotor2start dummy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set &amp;lt;name&amp;gt; 45&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
stellt den Mischer nun auf 45%. Angenommen, stand er bei 10%, wird er nun (45-10)*MaxDriveSeconds/MaxTics Sekunden lang nach rechts laufen und dann von STELLMOTOR gestoppt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Bilder zeigen die elektrische Verdrahtung von zwei Relais, die von je einem Aktor gesteuert werden:&lt;br /&gt;
[[Datei:Relais-Schaltung FBH-Mischer attr einzel.jpg|mini|Schaltplan einzel]]       [[Datei:Relais-Schaltung FBH-Mischer attribut Wechsel.jpg|mini|Schaltplan wechsel]]   &lt;br /&gt;
&lt;br /&gt;
Typische Mischermotoren wie der Honeywell VMK haben eingebaute Endschalter, die beim Erreichen der 0%- oder 100%-Position die Stromversorgung unterbrechen. Das Modul Stellmotor nutzt dies aus, um eine Kalibrierung zwischen rechnerischem und tatsächlichen Mischerstand herzustellen. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alle Attributes sind auch in fhem durch das kommando get attrHelp &amp;lt;varname&amp;gt; erklärt, für&#039;s &amp;quot;schnelle Nachschauen zwischendurch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Global gültige Attribute ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Wertebereich !! Default !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| STMrlType|| String || einzel || je nach Schaltplan, Wechsel=start+RL-relais, einzel=R-Relais+L-Relais werden geschaltet&lt;br /&gt;
&amp;lt;b&amp;gt;&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039;&amp;lt;/b&amp;gt; falsche Einstellung kann zu Kurzschluß am Motor führen, bitte Einstellung genau überdenken oder mit dummy testen&lt;br /&gt;
&lt;br /&gt;
bei einzel: &lt;br /&gt;
Rechtslauf: start=0 rl=1 &lt;br /&gt;
Linkslauf: start=1 rl=0 Ruhe: &lt;br /&gt;
start=0 rl=0&lt;br /&gt;
&lt;br /&gt;
bei wechsel: &lt;br /&gt;
Rechtslauf start=0 rl=1 &lt;br /&gt;
Linkslauf: L start=1 rl=0 &lt;br /&gt;
Ruhe: start=0 rl=0&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|STMmaxDriveSeconds ||[0...n]||muss angepasst werden||gestoppte Zeit in Sekunden, die der Motor für die Fahrt von 0 bis 100 Prozent braucht&lt;br /&gt;
|-&lt;br /&gt;
|STMmaxTics ||[0...100]||100||Mischerstellung - bei Prozentangaben (PID20) 100, bei Winkelangaben anzupassen&lt;br /&gt;
|-&lt;br /&gt;
|STMpollInterval || Float ||0.1||Zeitintervall nach dem FHEM prüft, ob die interne Stoppzeit erreicht wurde. Hier sollte mit einem möglichst kleinen Wert gestartet werden, der vorsichtig erhöht werden kann, falls FHEM zu langsam läuft wegen des Mischermotors. Darf nicht größer STMlastDiffMax sein, sonst beginnt der Motor zu Schwingen.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| STMresetOtherDeviceAtCalibrate|| String || 0 || Fhem Device das am Ende des Kalibriervorganges zusätzlich resettet wird. (command: set &amp;lt;STMresetOtherDeviceAtCalibrate&amp;gt; reset&amp;quot; wird abgesetzt), zB für eigenes Logging oder Rotary Encoder&lt;br /&gt;
|- &lt;br /&gt;
| STMinvertOut|| Zahl || 0 || setzen für Devices die 0 für Start und 1 für Stop erwarten &lt;br /&gt;
|- &lt;br /&gt;
| STMmapOffCmd|| String || 0 || string der im device-command anstelle &#039;0&#039; verwendet wird für stop &lt;br /&gt;
|- &lt;br /&gt;
| STMmapOnCmd|| String || 0 || string der im device-command anstelle &#039;1&#039; verwendet wird für start &lt;br /&gt;
|- &lt;br /&gt;
| STMcalibrateDirection|| String || L || auf R wird die Ralibrierung nach rechts gefahren, default= L (links) &lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| STMlastDiffMax|| Zahl || 1|| ist die Stoppzeit weiter als dieser wert vom Soll entfernt, wird sofort ein neuer drive gestartet. Wert muss immer größer als STMpollInterval sein, sonst beginnt der Motor zu Schwingen &lt;br /&gt;
|- &lt;br /&gt;
| STMtimeTolerance|| Float || 0.001 || Stop-Time Differenzen kleiner als dieser Wert werden bei der Berechnung vollständig ignoriert (wird eventuell in Zukunft entfallen)&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|readingFnAttributes||||||readingFnAttributes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Device Type abhängige Attribute ===&lt;br /&gt;
&lt;br /&gt;
Je nach Device Type sind verschiedene Attribute vorgesehen, um STELLMOTOR mitzuteilen, wie die beiden Relais angesprochen werden. Man kann so zB während der Aufbauphase der Installation neben den Gpio devices noch 2 dummy devices im Attr vorhalten um zwischendurch zu testen. Hierzu muss dann nur noch die DEF des STELLMOTOR Devices vorübergehend auf FhemDev geändert werden.&lt;br /&gt;
&lt;br /&gt;
Alle Attributes sind auch in fhem durch das kommando get attrHelp &amp;lt;varname&amp;gt; erklärt, für&#039;s &amp;quot;schnelle Nachschauen zwischendurch&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|- &lt;br /&gt;
! Device Type !! Parameter !! Typ !! Default !! Beschreibung &lt;br /&gt;
|- &lt;br /&gt;
| PiFace / Gpio || STMgpioPortRL || Zahl || 5 || PiFace Digital port oder Gpio-Port für RL oder R Relais &lt;br /&gt;
|- &lt;br /&gt;
| PiFace / Gpio || STMgpioPortSTART || Zahl || 4 || PiFace Digital Port oder Gpio-Port für START (oder L Relais bei &#039;einzel&#039;) &lt;br /&gt;
|- &lt;br /&gt;
| FhemDev || STMfhemDevRL|| String || RelaisRL || Fhem-Device name für RL (oder R) Aktor (zB.: &#039;keller portB&#039; oder &#039;dummyRLrelais&#039;)&lt;br /&gt;
|- &lt;br /&gt;
| FhemDev || STMfhemDevSTART|| String || RelaisSTART || Fhem-Device name für START (oder L) Aktor  (zB.: &#039;keller portC&#039; oder &#039;dummySTARTrelais&#039;)&lt;br /&gt;
|- &lt;br /&gt;
| SysCmd || STMsysCmdRL|| String || 0 || freies Command das für RL an die Shell übergeben wird (zB: &#039;/Usr/local/bin/gpio write 4&#039;, STELLMOTOR fügt 0 oder 1 arg. dazu)&lt;br /&gt;
|- &lt;br /&gt;
| SysCmd || STMsysCmdSTART|| String || 0 || freies Command das für START an die Shell übergeben wird (zB: &#039;/Usr/local/bin/gpio write 5&#039;, STELLMOTOR fügt 0 oder 1 arg. am Ende dazu)&lt;br /&gt;
|- &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SET !! Wertebereich !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|set &amp;lt;name&amp;gt; N||[1...100]||stellt den Mischer auf N % Öffnung&lt;br /&gt;
|-&lt;br /&gt;
|set &amp;lt;name&amp;gt; calibrate|| - ||stellt den Mischer auf Min. oder Max (in Fhem 1% oder 100%); default: maximaler Linkslauf bis zur Endschalterpostion, kann über Attr in Rechtslauf geändert werden.&lt;br /&gt;
|-&lt;br /&gt;
|set &amp;lt;name&amp;gt; reset|| - ||Setzt die Position und die Werte im Cache auf Null. Verwendung ist intern (am Ende von calibrate) oder nach mechanischem Neueinbau des Motors (da reicht aber auch ein Calibrate)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Alle Readings sind auch in fhem durch das kommando get readingsHelp &amp;lt;varname&amp;gt; erklärt, für&#039;s &amp;quot;schnelle nachschauen zwischendurch&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! readings !! Wertebereich !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|position||[1..100%]||der Wert wird gesetzt am Beginn einer Mischerbewegung (anderer Wertebereich, wenn MaxTics nicht 100)&lt;br /&gt;
|-&lt;br /&gt;
|state||active,error,position||Position wird beim Stopp der Motorbewegung gesetzt&lt;br /&gt;
|-&lt;br /&gt;
|lastStart|| Float ||Zeitstempel der letzten Motorbewegung&lt;br /&gt;
|-&lt;br /&gt;
|locked||[0 1]||Steht auf 1 während der Motor gerade läuft (Calibrate oder gewünsche Position per set). &lt;br /&gt;
&lt;br /&gt;
Neue Kommandos werden während lock nur in eine Warteschleife (reading: command_queue) genommen.&lt;br /&gt;
&lt;br /&gt;
Zeigt im im Frontend, dass der Motor gerade läuft.&lt;br /&gt;
|-&lt;br /&gt;
|queue_lastdiff||||abhängig von der FHEM-Last oder anderen blockierenden Kommandos wird das Stopp-Kommando nur nahe an der kalkulierten Stoppzeit ausgeführt, vermutlich nie exakt. STELLMOTOR merkt sich die Zeitdifferenz, zu der der Motor wirklich gestoppt wurde und addiert bei der nächsten Bewegung des Motors die Differenz, um möglichst präzise die wirkliche Motorstellung zu erreichen.&lt;br /&gt;
|-&lt;br /&gt;
|stopTime||||Null oder die errechnete Zeit zum Stopp der Motorbewegung&lt;br /&gt;
|-&lt;br /&gt;
|command_queue||||Position einer anstehenden neuen Motorposition, die angefordert wurde als die letzte Motorbewegung noch ausgeführt oder das Modul disabled war&lt;br /&gt;
|-&lt;br /&gt;
|OutType||||Bei der Defintion gewählte Arbeitsart: PiFace,Gpio,FhemDev,SysCmd&lt;br /&gt;
|-&lt;br /&gt;
|DoResetAtStop||||Zeitstempel des Ende der letzten Kalibrierfahrt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,23933.msg174400.html#new Thread im Forum], in dem dieses Modul vorgestellt wurde&lt;br /&gt;
* to be continued&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Regelungstechnik]]&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMW-IO-12-Sw14-DR_Wired_RS485_I/O-Modul_12_Eing%C3%A4nge_14_Ausg%C3%A4nge&amp;diff=7243</id>
		<title>HMW-IO-12-Sw14-DR Wired RS485 I/O-Modul 12 Eingänge 14 Ausgänge</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMW-IO-12-Sw14-DR_Wired_RS485_I/O-Modul_12_Eing%C3%A4nge_14_Ausg%C3%A4nge&amp;diff=7243"/>
		<updated>2014-08-12T19:48:13Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039; HMW-IO-12-Sw14-DR &#039;&#039;&#039; ist ein 14CH in / 12 CH out-Aktor für die HMW485-Reihe. Das ganze gibts als Bausatz oder fertig aufgebaut vom Händler. Es besitzt 6 digitale Eingänge, die direkt Ports des Mikrocontrollers ansteuern und somit TTL-Kompatibel sind. Die Eingänge sind intern auf High-Potential gelegt und lassen sich auch mit Tastern gegen GND schalten. Die 6 analogen Eingänge können mit Eingangsspannungen von 0-10V beschaltet werden. Hier können Sensoren oder z.B. Potentiometer angeschlossen werden. Als Versorgungsspannung können die +24V des Netzteils verwendet werden, es ist allerdings zu beachten, dass am Eingang die Spannung von 10V nicht überschritten wird. &lt;br /&gt;
&lt;br /&gt;
Ausgangsseitig sind 8 Open-Collector-Transistor-Schaltausgänge vorhanden. Über diese sind Verbraucher mit +24V bis zu 50mA ansteuerbar, z.B. Relais, Optokoppler oder LED&#039;s.Hiermit können z.B. Eltako-Leistungsrelais angesteuert werden. Ausserdem sind noch 6 Relais-Schaltausgänge vorhanden, die mit +24V/0,8A belastet werden können. Hierüber kann z.B.ein Türöffner, ein Garagentormotor o.ä. direkt angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Das Gerät erfordert die Bereitstellung einer 24V Gleichspannung, z.B. durch das zum System gehörige Netzteil. Ebenso ist ein Busabschlussmodul erforderlich (IIRC ein Widerstand mit 120R?)&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
=== Einbindung mit einem [[HomeMatic Wired RS485 LAN Gateway]] ===&lt;br /&gt;
&lt;br /&gt;
Bei mir funktioniert das Discovery nicht. Der einfachste Weg scheint, an einen Eingang (bsp I12) gegen GND einen Schalter anzuschliessen. Durch Betätigung entsteht ein Device bei FHEM.&lt;br /&gt;
&lt;br /&gt;
Mit einem &lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;name&amp;gt; info&lt;br /&gt;
&lt;br /&gt;
werden die grundsätzlichen Geräteeingenschaften abgefragt. Also Typ, Seriennummer, Firmware-Version. Ausserdem legt fhem die Schalter funktionsfähig an. &lt;br /&gt;
&lt;br /&gt;
 get config all&lt;br /&gt;
liest den gesamten benutzten EEprom aus, ju je 16 Byte Blöcken. TODO: wozu braucht man das?&lt;br /&gt;
&lt;br /&gt;
== Kommunikation mit dem Device ==&lt;br /&gt;
=== set on/off ===&lt;br /&gt;
&lt;br /&gt;
5.11.2013&lt;br /&gt;
&lt;br /&gt;
es gibt ein neues Update im Master&lt;br /&gt;
Bei Geräten wie HMW-IO-12-Sw14-DR, HMW_IO_4_FM usw. können die Ein/Ausgangskanäle nun konfiguriert und per set on / off geschaltet werden. Auch der Status wird von FHEM entsprechend ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Das Ganze funktioniert derzeit ausschließlich für auf Ausgang konfigurierte Kanäle.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration der Ausgänge ===&lt;br /&gt;
 (Frequenz, On/Off)&lt;br /&gt;
... TODO&lt;br /&gt;
&lt;br /&gt;
=== RAW-Daten senden ===&lt;br /&gt;
&#039;&#039;&#039; Beispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 set HM485_LAN RAW TTTTTTTT 98 00000001 73AAVVVV&lt;br /&gt;
&lt;br /&gt;
* TTTTTTTT: Target Adresse&lt;br /&gt;
* AA:       Nummer des Ausgangs (00 - 0C) wobei die Zählung bei 0 beginnt und ein HEX-Wert ist&lt;br /&gt;
&lt;br /&gt;
Aus der HMW-Doku: &lt;br /&gt;
* VVVV:     Value ans HEX-Zahl&lt;br /&gt;
** 00-05 = Relaisausgänge&lt;br /&gt;
0x0000 -&amp;gt; Aus, 0x0100 - 0xFE00 -&amp;gt; Ein (Homematic sendet 0xC8), 0xFF -&amp;gt; Toggle&lt;br /&gt;
&lt;br /&gt;
** 06-0C = OpenCollector-Ausgänge&lt;br /&gt;
- Schalt-Ausgang:&lt;br /&gt;
 0x0000 -&amp;gt; Aus, 0x0001 - 0xFFFF -&amp;gt; Ein (Homematic sendet 0x03FF)&lt;br /&gt;
&lt;br /&gt;
- Analog-Digital Ausgang: Frequenz in Milliherz als unsigned long (0x1000 -&amp;gt; 1Hz)&lt;br /&gt;
 1000, also 03E8 Hex entspricht z.B. 1 Hertz&lt;br /&gt;
 50000 also C350 Hex entspricht 50 Hertz&lt;br /&gt;
&lt;br /&gt;
=== notifies ===&lt;br /&gt;
&lt;br /&gt;
 define Licht_an notify HMW_IO_12_Sw14_DR_JEQ0459634_XX:&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[HomeMatic Wired]]&lt;br /&gt;
* [[HomeMatic Wired RS485 LAN Gateway]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-CFG-LAN:_%C3%9Cberwachung_der_1%25-Regel&amp;diff=7242</id>
		<title>HM-CFG-LAN: Überwachung der 1%-Regel</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-CFG-LAN:_%C3%9Cberwachung_der_1%25-Regel&amp;diff=7242"/>
		<updated>2014-08-12T19:46:54Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Gerade in der Entwicklungsphase kann es passieren, dass z.B. durch den Einsatz von Testroutinen der Bereich der [[1% Regel]] erreicht wird und dadurch ein Gerät vorübergehend nicht mehr senden kann.&lt;br /&gt;
&lt;br /&gt;
In solchen Situationen kann es von Nutzen sein, mittels Plot einen Überblick über die aktuelle Auslastung zu bekommen, um eigene Codefehler von dem werksseitig eingebauten Sendestopp zu unterscheiden. Am Beispiel eines [[HomeMatic]]-Gerätes wird im Folgenden gezeigt, wie eine derartige &amp;quot;Überwachung&amp;quot; erreicht werden kann.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;ERROR-Overload&amp;quot; und &amp;quot;Warning-HighLoad&amp;quot; ===&lt;br /&gt;
Der Sendestopp der HMLAN-unit wird durch die Werte &amp;quot;ERROR-Overload&amp;quot; angezeigt bzw. durch &amp;quot;Warning-HighLoad&amp;quot; vorgewarnt. Dabei handelt es sich um direkte Readings der HMLAN-unit und sind auf alle Fälle als richtig bzw. &amp;quot;absolut&amp;quot; anzusehen. Sollte die HMLAN-unit in diesen Zustand sein, wird sie keine Telegramme mehr senden, jedoch wird sie weiterhin alle Telegramme empfangen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;msgLoadEst 1hour&amp;quot; ===&lt;br /&gt;
Die angezeigten &amp;quot;msgLoadEst&amp;quot; - Werte stellen keine 100%ige Genauigkeit dar, da sie &amp;quot;nur&amp;quot; annähernd berechnet werden können. Es kann daher theoretisch vorkommen, dass der Plot die 100% - Marke noch nicht erreicht hat, aber der &amp;quot;ERROR-Overload&amp;quot; Indikator bereits anzeigt, dass die HMLAN-unit seine Sendungen eingestellt hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
msgLoadEst 1hour:44% 10min steps: 12/2/7/23/0/0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
besagt, dass in der aktuellen Stunde 44% der Sendekapazität verbraucht sind. Im aktuellen 10min-Rahmen sind es 12%, in den 10min davor waren es 2%, davor 7% und davor 23%. &lt;br /&gt;
&lt;br /&gt;
Dieser Zähler befindet sich direkt in der HMLAN-unit somit kann FHEM diesen Zähler nicht zurücksetzen. Nur durch Warten oder einen Reset der HMLAN-unit ist ein Rückstellen möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
&lt;br /&gt;
Man muss die folgenden Einschränkungen hinsichtlich des Plots immer beachten:&lt;br /&gt;
&lt;br /&gt;
* Nach dem (shutdown)-restart fängt FHEM wieder bei 0 an zu zählen. Da die HMLAN-unit aber nicht zwangsläufig ebenfalls reseted wurde, kann bereits eine messageload in der HMLAN-unit vorliegen die fhem aufgrund des restarts nicht erfassen kann.&lt;br /&gt;
&lt;br /&gt;
* FHEM kann nicht zwischen einem reboot und einem disconnect der HMLAN-unit unterscheiden. Daher wird ein disconnect als reboot gewertet. Dies führt unter Umständen ebenfalls zu einer &amp;quot;ERROR-Overload&amp;quot; - Nachricht obwohl der Plot die 100%-Marke noch nicht erreicht hat.&lt;br /&gt;
&lt;br /&gt;
* FHEM kann die automatischen Wiederholungen der HMLAN-unit nicht erfassen und können daher nicht berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
* Die AES Verschlüsselung, die weitere Telegramme sendet, kann aktuell nicht gezählt werden&lt;br /&gt;
&lt;br /&gt;
== Versions Updates ==&lt;br /&gt;
[http://forum.fhem.de/index.php/topic,21678.msg151621.html#msg151621 Version 5278]: Die Länge des Nachrichtentelegrams wird berücksichtigt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plot von Highload/Overload und msgLoadEst-Werten == &lt;br /&gt;
&lt;br /&gt;
[[Datei:Msgloadest_2_2.png|mini|350px|rechts|Beispiel-Plot mit einer Auslastung von ca. 80%]]&lt;br /&gt;
Dazu muss im Einzelnen wie folgt vorgegangen werden:&lt;br /&gt;
* Um einen Plot erzeugen zu können, wird ein Log benötigt.&lt;br /&gt;
* Um ein Log erzeugen zu können, wird ein Event benötigt, das geloggt werden kann.&lt;br /&gt;
* Um das Event loggen zu können, wird ein [http://de.wikipedia.org/wiki/Cronjob CronJob] benötigt, der dieses Event wiederholt im Abstand x bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Der CronJob wird mittels &amp;quot;at&amp;quot; im Zeitabstand x= 1 Minute als Reading bereitgestellt, das den Wert von &amp;quot;msgLoadEst-1hour&amp;quot; erhält. Hierdurch werden 60 Werte pro Stunde in die Logdatei geschrieben. Sollte dies zu Performanceeinbußen auf Seiten des [[Systemübersicht#Server|Fhem-Trägersystems]] führen, kann der &amp;quot;+*00:01:00&amp;quot;-Wert entsprechend erhöht werden.&lt;br /&gt;
&lt;br /&gt;
Erforderliche Definition in der [[Konfiguration]] (fhem.cfg):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define a_hmlan_internals at +*00:01:00 {\ &lt;br /&gt;
my $trafficStr = InternalVal(&amp;quot;HMLAN1&amp;quot;,&amp;quot;msgLoadEst&amp;quot;,&amp;quot;???&amp;quot;);;\&lt;br /&gt;
my $trafficHour = $1 if($trafficStr =~ m/1hour:(.*)% 10min steps/);;\ &lt;br /&gt;
fhem(&amp;quot;setreading HMLAN1 hmTrfHour &amp;quot;.$trafficHour.&amp;quot; %&amp;quot; );;\ &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird ein Event ausgelöst, das (z.B. mit den folgenden Definitionen) geloggt werden kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define FileLog_Technik_IO FileLog %L/Technik_IO-%Y-%M.log global:.*|HMLAN1:cond:.*|HMLAN1:hmTrfHour:.*&lt;br /&gt;
attr FileLog_Technik_IO logtype text&lt;br /&gt;
attr FileLog_Technik_IO room Log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die graphische Darstellung (Plot) wird durch die Definition&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define SVG_FileLog_Technik_IO_1 SVG FileLog_Technik_IO:SVG_FileLog_Technik_IO_1:CURRENT&lt;br /&gt;
attr SVG_FileLog_Technik_IO_1 alias 10. hmlan attr SVG_FileLog_Technik_IO_1 label &amp;quot;traffic: min [$data{min1}] - avg [$data{avg1}] - max [$data{max1}] - last [$data{currval1}] ----- [&amp;quot;.localtime().&amp;quot;]&amp;quot;&lt;br /&gt;
attr SVG_FileLog_Technik_IO_1 room 90_Technik &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... in Verbindung mit folgenden [[Plots erzeugen|Plot]]-Anweisungen (im vorgestellten Beispiel in der SVG_FileLog_Technik_IO_1.gplot Datei) erzeugt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Created by FHEM/98_SVG.pm, 2014-03-22 12:11:58 set terminal png transparent size &amp;lt;SIZE&amp;gt; crop set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
set xdata time&lt;br /&gt;
set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
set title &#039;&amp;lt;L1&amp;gt;&#039;&lt;br /&gt;
set ytics &amp;quot;init&amp;quot; 6,&amp;quot;err&amp;quot; 4,&amp;quot;wng&amp;quot; 3,&amp;quot;?&amp;quot; 1,&amp;quot;ok&amp;quot; 0 set y2tics set grid y2tics set ylabel &amp;quot;condition&amp;quot;&lt;br /&gt;
set y2label &amp;quot;msgLoadEst % / hr&amp;quot;&lt;br /&gt;
set yrange [0:7]&lt;br /&gt;
&lt;br /&gt;
#FileLog 4:HMLAN1.hmTrfHour\x3a::&lt;br /&gt;
#FileLog 4:HMLAN1.cond\x3a::$fld[3]=~&amp;quot;init&amp;quot;?6:$fld[3]=~&amp;quot;ERROR-Overload&amp;quot;?4:$fld[3]=~&amp;quot;Warning-HighLoad&amp;quot;?3:$fld[3]=~&amp;quot;ok&amp;quot;?0:1&lt;br /&gt;
#FileLog 3:global.*::$fld[2]=~&amp;quot;SHUTDOWN&amp;quot;?6:$fld[2]=~&amp;quot;INITIALIZED&amp;quot;?0:0&lt;br /&gt;
&lt;br /&gt;
plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 title &#039;msgLoadEst&#039; ls l6fill lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;condition&#039; ls l0 lw 1 with steps,\&lt;br /&gt;
     &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y1 title &#039;shutdown&#039; ls l2fill lw 1 with steps &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Beitrag / Diskussion zu diesem Thema im [http://forum.fhem.de/index.php/topic,21678.msg151772.html#msg151772 Fhem Forum]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Pushover&amp;diff=7241</id>
		<title>Pushover</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Pushover&amp;diff=7241"/>
		<updated>2014-08-12T19:46:28Z</updated>

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

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Z-Wave]] ist ein drahtloser Kommunikations-Standard, der von der Firma Sigma Designs und der Z-Wave Alliance für die Heimautomatisierung entwickelt wurde (Quelle: [http://de.wikipedia.org/wiki/Z-Wave Wikipedia]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- (ph1959de) Vorschlag für die Struktur dieser Seite: - - - - - - - - -&lt;br /&gt;
- Einleitung oben noch erweitern (Beispiel: HomeMatic), dann&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
Hier sollten z.B. Dinge wie die HomeID und die &amp;quot;Association&amp;quot; beschrieben werden&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit Fhem ==&lt;br /&gt;
Um Z-Wave Geräte (Kategorie Z-Wave (Components?) anlegen?) mit Fhem betreiben zu können, wird &lt;br /&gt;
beispielsweise ein USB-Stick [[xyz]] (eigene Seite für xyz, analog z.B. [[Jeelink]]?) als [[Interface]]&lt;br /&gt;
benötigt. &lt;br /&gt;
== Bekannte Probleme (o.ä.) ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Hersteller&lt;br /&gt;
* Protokoll...&lt;br /&gt;
&lt;br /&gt;
Sonstige &amp;quot;Aufgaben&amp;quot;: Z-Wave (als Kommunikationsprotokoll?) in die [[Systemübersicht]] einarbeiten, evtl. exemplarisch ein paar Z-Wave Geräte zumindest rudimentär anlegen, etc.&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite wird das Einrichten eines &#039;&#039;&#039;Z-Wave&#039;&#039;&#039; Systems in FHEM beschrieben.&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
=== Einrichten eines Z-Wave USB Sticks ===&lt;br /&gt;
Das Einrichten eines Z-Wave USB Sticks teilt sich in 2 Schritte.&lt;br /&gt;
* Laden des Kernelmoduls&lt;br /&gt;
* Definieren des USB Sticks&lt;br /&gt;
==== Laden des Kernelmoduls ====&lt;br /&gt;
Zuerst muss sichergestellt werden, dass das entsprechende Kernelmodul &amp;lt;code&amp;gt;cp2101.ko&amp;lt;/code&amp;gt; geladen wird.&lt;br /&gt;
Diese Datei ist bei einer [[FHEM und FritzBox 7390]] Installation über das Image von [http://www.fhem.de fhem.de] bereits enthalten.&lt;br /&gt;
Um den Z-Wave USB Stick zu verwenden muss dieses Kernelmodul vor oder beim Starten des FHEM Servers geladen sein. Dies erreicht man durch einen Eintrag in der Datei &amp;lt;code&amp;gt;startfhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die entsprechende Zeile kann direkt unterhalb der modprobe Anweisungen eingefügt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;insmod $home/lib/cp2101.ko&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Definieren des USB Sticks ====&lt;br /&gt;
Nach einem FHEM Neustart wird der USB Stick nun erkannt.&lt;br /&gt;
Falls der USB Stick nicht automatisch in der &amp;lt;code&amp;gt;fhem.cfg&amp;lt;/code&amp;gt; hinzugefügt wurde, ist die Log-Datei zu durchsuchen. Sie enthält den entsprechenden Eintrag, der in der &amp;lt;code&amp;gt;fhem.cfg&amp;lt;/code&amp;gt; hinzugefügt werden muss.&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Aeon Labs Z-Stick&#039;&#039;&#039; wird an der Fritzbox wie folgend definiert: &lt;br /&gt;
&amp;lt;pre&amp;gt;define zwaveStick ZWDongle /dev/ttyUSB0@115200&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Informationen zu dem USB Stick auslesen ====&lt;br /&gt;
Zum Definieren von Z-Wave Aktoren und Sensoren ist die &amp;lt;code&amp;gt;homeId&amp;lt;/code&amp;gt; notwendig.&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;homeId&amp;lt;/code&amp;gt; des USB Sticks kann man mit folgendem Befehl auslesen:&lt;br /&gt;
&amp;lt;pre&amp;gt;get zwaveStick homeId&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die aktuelle Liste der Z-Wave Knoten, die bereits an dem Stick registriert sind, kann mit dem folgendem Befehl ausgelesen werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;get zwaveStick nodeList&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Hinzufügen eines neuen Z-Wave Geräts ===&lt;br /&gt;
Zuerst wird der Z-Wave Stick in den Modus zum Aufnehmen neuer Geräte gesetzt:&lt;br /&gt;
&amp;lt;pre&amp;gt;set zwaveStick addNode on&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach wird das Gerät in den Aufnahmemodus versetzt. dies geschieht zumeist durch dreimaliges Drücken einer Taste am Gerät.&lt;br /&gt;
&lt;br /&gt;
Abschließend wird der Z-Wave Stick wieder in den Normalmodus versetzt:&lt;br /&gt;
&amp;lt;pre&amp;gt;set zwaveStick addNode off&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Erneutes Hinzufügen eines bereits registrierten Z-Wave Geräts ===&lt;br /&gt;
Es können die bereits an dem Z-Wave Stick registrierten Geräte abgerufen werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;get zwaveStick nodeList&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es werden die verschiedenen IDs zurückgeliefert, wobei 1 der Z-Wave Stick selbst ist.&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Befehl wird das bereits registrierte Gerät mit der ID 2 eingerichtet:&lt;br /&gt;
&amp;lt;pre&amp;gt;set zwaveStick createNode 2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Glossar ==&lt;br /&gt;
=== Was ist eine Association? ===&lt;br /&gt;
Devices die die Association unterstützen sind in der Lage, direkt mit anderen Devices zu kommunizieren. Dies können zum einen direkte Befehle sein, als auch Meldungen über den Status und Zustand der Devices.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann damit ein Bewegungsmelder bei entdeckter Bewegung direkt eine Lampe ein oder ausschalten oder die aktuelle Temperatur an den Controller senden.&lt;br /&gt;
&lt;br /&gt;
Devices können mehrere Association Groups haben, die für vom Hersteller vorgesehene unterschiedliche Aktionen definiert sind. Welche das sind, geht aus der jeweiligen Beschreibung hervor.&lt;br /&gt;
&lt;br /&gt;
Damit FHEM auf Statusmeldungen von Sensoren reagieren (und auch Anzeigen) kann, muss der Controller (ZW_Dongle, DeviceID = 1) mit dem jeweiligen Device assoziiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;set associationAdd &amp;lt;associationGroup&amp;gt; &amp;lt;deviceID&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nahezu alle in Europa erhältlichen Devices unterstützen die Rückmeldung des Status via Association. Daher ist diese Konfiguration in der Regel Pflicht, um ein Device sinnvoll mit FHEM nutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Ausnahmen gibt es in Nordamerika, wo aufgrund von Patentansprüchen einige Hersteller auf die Statusrückmeldungen verzichten. Diese Geräte unterstützen in der Regel die Command Class ASSOCIATION nicht.&lt;br /&gt;
&lt;br /&gt;
== Tipps und Tricks ==&lt;br /&gt;
=== Batterie betriebene Geräte ===&lt;br /&gt;
Um die Batterielaufzeit zu erhöhen, legen sich batteriebetriebene Geräte „schlafen“ und wachen in konfigurierbaren Intervallen auf um einen &amp;quot;wakeup Report&amp;quot; zu senden. Daraufhin senden andere Devices ihre bis daher gesammelten Anfragen, die daraufhin beantwortet werden.&lt;br /&gt;
&lt;br /&gt;
Dies wird in FHEM wie folgt konfiguriert.&lt;br /&gt;
&amp;lt;pre&amp;gt;set wakeupInterval &amp;lt;time&amp;gt; &amp;lt;nodeId&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;time&amp;gt; ist die Zeit in Sekunden zwischen den Intervallen und &amp;lt;nodeID&amp;gt; der gewünschte Empfänger des wakupReports. In der Regel ist dies wieder der Controller (NodeId=1). Viele Geräte kommen im Auslieferungszustand mit der NodeID 255 (der wakeup report wird als Broadcast an alle erreichbaren Devices gesendet). Hier empfiehlt es sich die Konfiguration auf nodeID 1 zu ändern, da dies robuster ist und zusätzlich noch Batterielaufzeit spart.&lt;br /&gt;
&lt;br /&gt;
== Geräte Spezifika ==&lt;br /&gt;
=== Fibaro ===&lt;br /&gt;
Bei den bisher erschienenen Devices Devices wird die Association Group 3 für die Übermittlung von Sensor Werten verwendet.&lt;br /&gt;
&amp;lt;pre&amp;gt;set associationAdd 3 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FGSS-001 ====&lt;br /&gt;
Dieser Rauchmelder scheint einen Falschen Batterie Level (0%) zu senden wenn er Außerhalb des wakeup intervals abgefragt wird.&lt;br /&gt;
&lt;br /&gt;
Workaround: Den Batterie Level nicht direkt via get anfordern sondern per notify auf den wakeup Report anfordern.&lt;br /&gt;
===== FGK-101 =====&lt;br /&gt;
Der Tür/Fensterkontakt sendet Änderungen am Zustand nur als basicReport (ff oder 00). Der Status (open / closed) wird nur nach explizitem GET gemeldet.&lt;br /&gt;
 &lt;br /&gt;
=== GE ===&lt;br /&gt;
==== GE (Model t.b.d) ====&lt;br /&gt;
Dieser Schalter unterstützt keine Statusrückmeldungen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Transceiver]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=JSONMETER&amp;diff=7239</id>
		<title>JSONMETER</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=JSONMETER&amp;diff=7239"/>
		<updated>2014-08-12T19:44:48Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses FHEM-Modul liest Daten von Messgeräten (z.B. Stromzähler, Gaszähler oder Wärmezähler, so genannte Smartmeter),&lt;br /&gt;
die OBIS kompatible Daten im JSON-Format auf einem Webserver oder auf dem FHEM-Dateisystem zur Verfügung stellen.&lt;br /&gt;
&lt;br /&gt;
Das Modul liest derzeit die Werte folgender Smartmeter mit LAN Anschluss&lt;br /&gt;
*ITF Eintarifzähler von N-ENERGY Netz GmbH (ITF Fröschl)&lt;br /&gt;
*EFR Smart Grid Hub für Stromzähler von EON, N-ENERGY, EnBW &lt;br /&gt;
*YouLess LS110 - Netzwerkfähiger Sensor für elektromechanische Stromzähler&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Definition in fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define &amp;lt;name&amp;gt; JSONMETER &amp;lt;Gerätetyp&amp;gt; [&amp;lt;IP-Adresse&amp;gt;] [Abfrageinterval]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.fhem.de/commandref_DE.html#JSONMETER Link auf FHEM commandref]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Energieverbrauchsmessung]]&lt;br /&gt;
[[Kategorie:Energieerzeugungsmessung]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=7238</id>
		<title>Luxtronik 2.0</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=7238"/>
		<updated>2014-08-12T19:44:27Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Luxtronik 2.0 ist eine Heizungssteuerung, die in Wärmepumpen von Alpha Innotec, Siemens Novelan (WPR NET) und Wolf Heiztechnik (BWL/BWS) verbaut ist.&lt;br /&gt;
Sie besitzt einen Ethernet Anschluss, so dass sie direkt in lokale Netzwerke (LAN) integriert werden kann.&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Definition in fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define &amp;lt;name&amp;gt; LUXTRONIK2 &amp;lt;IP-Adresse&amp;gt; [Abfrageinterval]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.fhem.de/commandref_DE.html#LUXTRONIK2 Link auf FHEM commandref]&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Perl-Module ===&lt;br /&gt;
Das FHEM-Modul benutzt das CPAN-Modul &amp;quot;net::Telnet&amp;quot;. Dieses ist standardmäßig auf Fritz!Boxen installiert. Auf anderen Servern muss es eventuell nachinstalliert werden. Unter Debian z.B. mit&lt;br /&gt;
 sudo apt-get install libnet-telnet-perl&lt;br /&gt;
&lt;br /&gt;
== Erläuterung der Readings ==&lt;br /&gt;
===Allgemeine Wärmepumpenwerte===&lt;br /&gt;
* &#039;&#039;&#039;ambientTemperature&#039;&#039;&#039; - Temperatur des Außensensors in °C&lt;br /&gt;
* &#039;&#039;&#039;averageAmbientTemperature&#039;&#039;&#039; - Gemittelte Außentemperatur der letzten 24 h in °C (für Heizgrenze im Sommer)&lt;br /&gt;
* &#039;&#039;&#039;heatSourceIN&#039;&#039;&#039; - Wärmequelle Eingangstemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;heatSourceOUT&#039;&#039;&#039; - Wärmequelle Ausgangstemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;hotGasTemperature&#039;&#039;&#039; - Heißgastemperatur in °C, Temperatur, die hinter dem Kompressor der Wärmepumpe anfällt&lt;br /&gt;
* &#039;&#039;&#039;flowTemperature&#039;&#039;&#039; - Vorlauftemperatur (Rücklauf plus Spreizung) in °C&lt;br /&gt;
* &#039;&#039;&#039;returnTemperature&#039;&#039;&#039; - Rücklauftemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;flowRate&#039;&#039;&#039; - Durchfluss in l/h&lt;br /&gt;
* &#039;&#039;&#039;thermalPower&#039;&#039;&#039; - aktuelle Heizleistung (berechnet) in kW&lt;br /&gt;
* &#039;&#039;&#039;COP&#039;&#039;&#039; - Coefficient Of Performance, Wirkungsgrad der Wärmepumpe (Leistungszahl ε). Eine Leistungszahl von z.B. 4,2 bedeutet, dass von der eingesetzten elektrischen Leistung des Kompressors das 4,2- fache an Wärmeleistung bereitgestellt wird. Anders formuliert, kann mit dieser Wärmepumpe aus einem Kilowatt elektrischer Leistung 4,2 kW Wärmeleistung zur Verfügung gestellt werden. &#039;&#039;Bei der Berechnung des COPs wird die elektrische Leistung aus dem Attribut &amp;quot;heatPumpElectricalPowerWatt&amp;quot; benutzt.&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;deviceTimeCalc&#039;&#039;&#039; - Beim Abrufen der Gerätewerte wird von der Luxtronik-Steuerung auch der Zeitpunkt der internen Ermittlung übergeben.&lt;br /&gt;
* &#039;&#039;&#039;delayDeviceTimeCalc&#039;&#039;&#039; - Abweichung Gerätesystemzeit zur FHEM-Zeit. Dieser kann bis zu 2 s in der Vergangenheit liegen. Höhere Werte weisen auf eine ungenaue Systemzeit in der Steuerung hin.&lt;br /&gt;
* &#039;&#039;&#039;durationFetchReadings&#039;&#039;&#039; - Dauer (in s) des Abrufes der Gerätewerte von der Steuerung&lt;br /&gt;
&lt;br /&gt;
=== Heizung ===&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureTarget&#039;&#039;&#039; - Rücklaufsolltemperatur (wird durch Heizkurve und Außensensor bestimmt, kann über in der Steuerung eingegebene Zeiten und auch manuell gezielt abgesenkt)&lt;br /&gt;
* &#039;&#039;&#039;heatingLimit&#039;&#039;&#039; - Heizgrenze wird ausgewertet (on, off)&lt;br /&gt;
* &#039;&#039;&#039;thresholdHeatingLimit&#039;&#039;&#039; - Heizgrenze in °C, &#039;&#039;&#039;über&#039;&#039;&#039;schreitet die gemittelte Außentemperatur diesen Wert, wird nicht mehr geheizt&lt;br /&gt;
* &#039;&#039;&#039;thresholdTemperatureSetBack&#039;&#039;&#039; - &#039;&#039;&#039;unter&#039;&#039;&#039;schreitet die Außentemperatur diesen Wert, wird die Heizungssolltemperatur nicht mehr abgesenkt&lt;br /&gt;
&lt;br /&gt;
=== Warmwasserbereitung ===&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperature&#039;&#039;&#039; - aktuelle Warmwasser-Boiler-Temperatur in °C (Achtung, die Temperatur im Boiler ist sehr unterschiedliche, es wird also nur die Temperatur am Sensor angezeigt. Typischerweise sackt die Temperaturkurve beim Aufheizen des Boilers etwas ab, weil es durch den Wärmeeintrag zu Strömungen kommt.)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperatureTarget&#039;&#039;&#039; - obere Solltemperatur des Boilers&lt;br /&gt;
=== Solarthermie ===&lt;br /&gt;
* solarBufferTemperature&lt;br /&gt;
* solarCollectorTemperature&lt;br /&gt;
=== Zähler ===&lt;br /&gt;
* &#039;&#039;&#039;counterHours2ndHeatSource1&#039;&#039;&#039; - Betriebsstunden der zweite Wärmequelle (normalerweise elektrische Heizstäbe) &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeatPump&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeating&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Heizung benutzt wurden&lt;br /&gt;
* &#039;&#039;&#039;counterHoursHotWater&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Warmwasserbereitung benutzt wurden&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHeating&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Heizung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHotWater&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Warmwasserbereitung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQTotal&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) insgesam&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
&lt;br /&gt;
=== Ein- und Ausgänge ===&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPump&#039;&#039;&#039; - Umlaufpumpe in der Wärmepumpe&lt;br /&gt;
* &#039;&#039;&#039;hotWaterCircPumpExtern&#039;&#039;&#039; - Zirkulationspumpe im Warmwasserstrang des Hauses (wenn genutzt)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterSwitchingValve&#039;&#039;&#039; - Ventil zur Umschaltung auf die Heizspirale im Boiler&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
* Firmware&lt;br /&gt;
* typeHeatpump&lt;br /&gt;
&lt;br /&gt;
== Tipps zum ökonomischen Betrieb ==&lt;br /&gt;
=== Sperrzeiten ===&lt;br /&gt;
Die Luxtronik 2.0 erlaubt es, sich mit Hilfe von Sperrzeiten an zeitabhängige Strompreise anzupassen. Die Uhr der Steuerung geht jedoch sehr ungenau. Durch Setzen des Attributes &amp;quot;autoSynchClock&amp;quot; wird die Uhr der Steuerung regelmäßig mit der FHEM-Zeit abgeglichen. Die Funktion muss über das Attribut &amp;quot;allowSetParameter&amp;quot; freigegeben werden.&lt;br /&gt;
 attr &amp;lt;device&amp;gt; allowSetParameter 1&lt;br /&gt;
 attr &amp;lt;device&amp;gt; autoSynchClock 10&lt;br /&gt;
=== Warmwasserbereitung bei Luft-Wasser-Wärmepumpen ===&lt;br /&gt;
Die Kosten der Warmwasserbereitung durch Luft-Wasser-Wärmepumpen hängen von zwei Faktoren ab:&lt;br /&gt;
# den Energiekosten: Bei Zweitarifzählern ist der Strom im Nebentarif (z.B. Mo-Fr von 22:00 - 06:00, Sa ab 13:00 und den ganzen So) billiger als im Haupttarif.&lt;br /&gt;
# der Lufttemperatur: Die Heizleistung der Wärmepumpe steigt bei höherer Lufttemperatur trotz konstantem Stromverbrauchs.&amp;lt;br&amp;gt;Die Außentemperatur erreicht ihr Maximum an einem sonnigen &#039;&#039;&#039;Durchschnittstag&#039;&#039;&#039; gegen 15:00 Uhr. Ihr Minimum hat sie kurz vor Sonnenaufgang.&lt;br /&gt;
Das FHEM Modul erlaubt es, durch zeitweises Anheben der Solltemperatur ein Aufheizen des Boilers auszulösen.&lt;br /&gt;
 set &amp;lt;device&amp;gt; hotWaterTemperaturTarget 50&lt;br /&gt;
Es gilt nun den kostengünstigsten Zeitpunkt für diesen Vorgang zu bestimmen. Die nachfolgenden Ausführungen setzen voraus, dass Aufgrund der Boilerisolierung und der Boilergrösse nur ein- oder zweimal pro Tag aufgeheizt werden muss. Zur Vereinfachung wird die Abhängigkeit der Wärmeverluste von der Boilertemperatur vernachlässigt.&lt;br /&gt;
&lt;br /&gt;
Bei den aktuellen Wärmepumpentarifen ist der Strom des Haupttarifes etwa 17&amp;amp;nbsp;% teurer als der des Nebentarifes. Es liegt also nahe, den Boiler in der Woche zu Beginn des Nebentarifes gleich für die nächsten 24&amp;amp;nbsp;h aufzuheizen, weil dann die Aussentemperatur höher ist und man dann am billigsten und effizientesten die entsprechende Wärme produziert.&lt;br /&gt;
 # Sollwert 5&amp;amp;nbsp;K über Standardwert setzen&lt;br /&gt;
  define Boilertemperatur_hoch at *22:05:00 {\&lt;br /&gt;
   if ($we != 1) { fhem (&amp;quot;set WP hotWaterTemperaturTarget 47&amp;quot;);; }\&lt;br /&gt;
  }&lt;br /&gt;
 # Sollwert auf Standwert zurücksetzen&lt;br /&gt;
  define Boilertemperatur_normal at *23:00:00 set WP hotWaterTemperaturTarget 42&lt;br /&gt;
&lt;br /&gt;
==== Detailliertere Berücksichtigung der Temperaturabhängigkeit====&lt;br /&gt;
&lt;br /&gt;
Damit die Warmwasserbereitung vor 6 Uhr nicht startet, muss die Warmwassertemperatur um 22&amp;amp;nbsp;Uhr eigentlich nur ausreichend hoch über der Auslöseschwelle liegen. Bei einer Auslöseschwelle von 40&amp;amp;nbsp;°C und einem Wärmeverlust (&#039;&#039;statBoilerGradientCoolDownMin&#039;&#039;) von 0,25&amp;amp;nbsp;K/h sind dies z.B. 42&amp;amp;nbsp;°C. Beträgt die Solltemperatur-Hysterese 2&amp;amp;nbsp;K, so muss um 22 Uhr die Solltemperatur kurzzeitig auf 44&amp;amp;nbsp;&amp;amp;deg;C angehoben werden bzw. eigentlich nur 2&amp;amp;nbsp;K oberhalb der aktueller Warmwassertemperatur.&lt;br /&gt;
&lt;br /&gt;
Die obigen 47 °C machen zudem nur Sinn, wenn tagsüber die Effektivitätsverbesserung durch die höheren Außentemperaturen den höheren Strompreis nicht wieder ausgleicht. Zudem muss berücksichtigt werden, dass sich bei höherer Vorlauftemperatur auch die Leistungsaufnahme der Wärmepumpe und damit ihre Arbeitszahl ändert. Diese Veränderung beträgt üblicherweise 2&amp;amp;nbsp;%/K.&amp;lt;br&amp;gt;&lt;br /&gt;
Geht man von einer durchschnittlichen Erhöhung der Vorlauftemperatur von 4 K aus, so erhält man dadurch eine Verschlechterung der Arbeitszahl um 8&amp;amp;nbsp;%. Das heißt, die 17&amp;amp;nbsp;% Preisunterschied müssen um den Effektivitätsverlust von 8&amp;amp;nbsp;% korrigiert werden (1,17/1,08=1,08). In unserem Fall reicht also die Temperaturdifferenz aus, die zu einer 8&amp;amp;nbsp;% höheren Heizleistung führt.&lt;br /&gt;
&lt;br /&gt;
Die ungefähre, theoretische Temperaturabhängigkeit der Heizleistung erhält man am schnellsten aus den Grafiken der Betriebsanleitung der Wärmepumpe. Empirisch und genauer lassen sich die Wert durch Loggen der Werte &#039;&#039;thermalPower&#039;&#039; oder besser &#039;&#039;statThermalPowerBoiler&#039;&#039; bestimmen. Liest man die Log-Datei in ein Tabellenkalkulationsprogramm (MS Excel, OO Calc), kann man mit diesem auch gleich eine Regressionsgrade berechnen. Auf diesem Wege erhält man für jede Temperaturdifferenz die prozentuale Änderung der Heizleistung. Nehmen wir an, sie beträgt für 8&amp;amp;nbsp;% 4&amp;amp;nbsp;K.&lt;br /&gt;
&lt;br /&gt;
Über das [http://www.fhem.de/commandref_DE.html#Weather Wettermodul] von FHEM kann man nun Mo-Fr um 22:00 die aktuelle Aussentemperatur &#039;&#039;ambientTemperature&#039;&#039; mit der maximalen Aussentemperatur des nächsten Tages vergleichen. Rechnen wir noch eine Sicherheit von 2 K hinzu, dann kann man z.B. festlegen, dass ab 5 K Temperaturunterschied und jeden Samstag der Boiler nur noch so weit aufgeheizt wird, dass er bis 06:00 nicht mehr auslöst. &lt;br /&gt;
 define Boilertemperatur_hoch at *22:05:00 {\&lt;br /&gt;
   my $delta = ReadingsVal(&amp;quot;Wetter&amp;quot;,&amp;quot;fc2_high_c&amp;quot;,0) - ReadingsVal(&amp;quot;Heizung&amp;quot;,&amp;quot;ambientTemperature&amp;quot;,0);;\&lt;br /&gt;
   if ($delta &amp;gt;=5.0 || $wday == 6) {}&lt;br /&gt;
   my $newTemp = int(ReadingsVal(&amp;quot;Heizung&amp;quot;,&amp;quot;hotWaterTemperature&amp;quot;,42)*2+5)/2;;\&lt;br /&gt;
   if ($newTemp&amp;lt;42.0) {$newTemp = 42;;}\&lt;br /&gt;
   if ($newTemp&amp;gt;44.0) {$newTemp = 44;;}\&lt;br /&gt;
   fhem( &amp;quot;set Heizung hotWaterTemperatureTarget $newTemp&amp;quot; );;\&lt;br /&gt;
 }\&lt;br /&gt;
   else { fhem( &amp;quot;set Heizung hotWaterTemperatureTarget 47&amp;quot; );; }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe der Sperrzeitensteuerung der Luxtronik 2.0 kann man die nächste, zweite Aufheizung dann erst wieder um 15:00 erlauben, da dann Aufgrund der hohen Aussentemperaturen der Strompreisunterschied mehr als ausgeglichen wird. Natürlich kann das Aufheizen auch hier durch ein gezieltes Anheben der Solltemperatur erreicht werden (z.B. am Wochenende).&lt;br /&gt;
 define Boilertemperatur_WE_Hoch at *15:00:00 {\&lt;br /&gt;
    if ($we == 1) {fhem( &amp;quot;set Heizung hotWaterTemperatureTarget 47&amp;quot; );; }\&lt;br /&gt;
 }&lt;br /&gt;
 define Boilertemperatur_WE_Normal at *16:00:00 {\&lt;br /&gt;
    if ( ReadingsVal(&amp;quot;Heizung&amp;quot;,&amp;quot;hotWaterTemperatureTarget&amp;quot;, 42 ) != 42.0 ) {fhem (&amp;quot;set Heizung hotWaterTemperatureTarget 42&amp;quot;);;}\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Frostschutz bei Erreichen der Heizungsgrenze===&lt;br /&gt;
Wenn die mittlere Temperatur &amp;quot;averageAmbientTemperature&amp;quot; die Heizgrenze &amp;quot;thresholdHeatingLimit&amp;quot; überschreitet, so schaltet die Anlage in den Sommermodus, indem sie die Rücklaufsolltemperatur &amp;quot;returnTemperatureTarget&amp;quot; auf 15 °C absenkt.&lt;br /&gt;
&lt;br /&gt;
Allerding gibt es ein undokumentiertes Anheben der Rücklaufsolltemperatur auf 20 °C, sobald die Außentemperatur &amp;quot;ambientTemperature&amp;quot; 10 °C unterschreitet. Ob es bei eine abgekühlten Haus (z.B. wegen Urlaub oder Nachts) dann auch zum ungewollten Heizen kommen kann, ist noch nicht geklärt.&lt;br /&gt;
&lt;br /&gt;
==Abschätzung des elektrischen Verbrauches==&lt;br /&gt;
Über die Attribute &amp;quot;heatPumpElectricalPowerWatt&amp;quot;, &amp;quot;heatPumpElectricalPowerFactor&amp;quot; und &amp;quot;heatRodElectricalPowerWatt&amp;quot; wird der elektrische Verbrauch während der Wärmeerzeugungen (Kompressormotor, Motor(en) der Wärmequelle) und der Heizstäbe festgelegt. Ist zudem das Attribute &amp;quot;doStatistics&amp;quot; auf 1 und der Werte &amp;quot;activeTariff&amp;quot; auf einen Wert zwischen 1 und 9 gesetzt, so berechnet das Modul anhand der Betriebsstunden automatisch den elektrischen Verbrauch innerhalb des angegebenen Stromtarifes.&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird eine Wärmepumpe mit einem zeitabhängigen Stromtarif betrieben (Doppeltarifzähler). Hierbei muss der Werte &amp;quot;activeTariff&amp;quot; zum jeweiligen Zeitpunkt über ein FHEM-Script gesetzt werden.&lt;br /&gt;
Beispiel:&lt;br /&gt;
 define Strom_HT_W at *06:00 { if ( $wday != 0 ) {fhem( &amp;quot;set Heizung activeTariff 1&amp;quot; );;} }&lt;br /&gt;
 define Strom_NT_W at *22:00 set Heizung activeTariff 2&lt;br /&gt;
 define Strom_NT_Sa at *13:00 { if ( $wday == 6 ) {fhem( &amp;quot;set Heizung activeTariff 2&amp;quot; );;} }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=7237</id>
		<title>HMinfo</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMinfo&amp;diff=7237"/>
		<updated>2014-08-12T19:44:11Z</updated>

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

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PDF Dateien unter FHEM darstellen =&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Zeilen kann man eine PDF Datei direkt in seiner FHEM Webseite darstellen. Der PDF&lt;br /&gt;
Reader wird in dem entsprechenden Frame des Computers geöffnet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für fhem.cfg&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;### Aufruf der FHEM Anfänger Anleitung via https&lt;br /&gt;
define FhemDoc weblink iframe https://fhem:8083/fhem/docs/fhem-floorplan-installation-guide_de.pdf&lt;br /&gt;
attr FhemDoc room Anleitung&lt;br /&gt;
attr FhemDoc htmlattr width=&amp;quot;600&amp;quot; height=&amp;quot;900&amp;quot; frameborder=&amp;quot;0&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels des &amp;quot;htmlattr&amp;quot; kann man die Größe des PDF-Viewers innerhalb der Webseite bestimmen.&lt;br /&gt;
&lt;br /&gt;
Hierbei wird bei Anwahl des Menüpunkt &amp;quot;Fhemdoc&amp;quot; innerhalb des gleichen Frames ein PDF Reader geöffnet und&lt;br /&gt;
dieser zeigt dann die entsprechende PDF Seite an.&lt;br /&gt;
== PC basierend ==&lt;br /&gt;
=== Linux ===&lt;br /&gt;
Das Darstellen oder Einbinden von Dokumentation ist auf linux PC ist generell einfach, da durch den Aufruf automatisch ein entsprechender Reader geladen wird.  Unter Linux (kubuntu) wird automatisch okula geöffnet.&lt;br /&gt;
=== Windows/Mac ===&lt;br /&gt;
Auf einer Windows-Maschine oder Mac Maschine ist meist der Acrobat Reader installiert und sollte daher auch sofort arbeitet. Sollte die Darstellung nicht arbeiten, fehlt meistens das Acrobat Reader Plug-in des Internet Browsers.&lt;br /&gt;
== Android basierend ==&lt;br /&gt;
=== Standard Browser ===&lt;br /&gt;
Standardmäßig stellt der WEB Browser eines Android Handy&#039;s oder Tablet keine PDF Dateien dar. Die Datei wird automatisch gedownloaded und muss dann manuell mit einem PDF Reader geöffnet.&lt;br /&gt;
=== FireFox ===&lt;br /&gt;
Der Browser &amp;quot;FireFox&amp;quot; biete die Möglichkeit von Addons, die den Browser um weitere Funktionen erweitert.&lt;br /&gt;
&lt;br /&gt;
Nachdem man im Google Play Store das Programm-Paket &amp;quot;Fire Fox&amp;quot; hinzugefügt hat und diesen nach seinen Wünschen konfiguiert hat, muss hier noch das Addon für &amp;quot;Fire Fox&amp;quot; namens &amp;quot;PDF Viewer&amp;quot; zu Firefox hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
;HInweis zum Browser FireFox&lt;br /&gt;
*Firefox scheint ein Problem mit dem &amp;quot;iFrame&amp;quot; Code zu haben, da ein entsprechender Code nicht auf der Webseite darstellt wird.&lt;br /&gt;
*Firefox ist generell nicht der schnellste Browser&lt;br /&gt;
&lt;br /&gt;
; Nachteile der PDF Viewer Lösung&lt;br /&gt;
* Die Software wandelt die PDF Datei beim Öffnen der PDF-Datei diese in HTML5 um. Hierdurch ist die Darstellung der PDF Datei sehr langsam. Leider ist dies derzeit die einzige Lösung (Stand 12.2013), wie man in Webseiten eine PDF Datei unter Fire Fox darstellen kann.&lt;br /&gt;
&lt;br /&gt;
=== Dolphin Browser ===&lt;br /&gt;
Infos fehlen noch&lt;br /&gt;
=== Boat Browser ===&lt;br /&gt;
Infos fehlen noch&lt;br /&gt;
=== Maxthon Browser ===&lt;br /&gt;
Infos fehlen noch&lt;br /&gt;
=== Opera Browser ===&lt;br /&gt;
Infos fehlen noch&lt;br /&gt;
=== UC Browser ===&lt;br /&gt;
Infos fehlen noch&lt;br /&gt;
=== Chrome Browser ===&lt;br /&gt;
Infos fehlen noch&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=GW1_Gewitterwarner&amp;diff=7235</id>
		<title>GW1 Gewitterwarner</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=GW1_Gewitterwarner&amp;diff=7235"/>
		<updated>2014-08-12T19:41:59Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;GW1 - Gewitterwarner&#039;&#039;&#039;&lt;br /&gt;
Der &#039;&#039;&#039;GW1 Gewitterwarner&#039;&#039;&#039; von ELV ist ein Sensor zur Erkennung von heranziehenden Gewittern. &lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
Der Gewitterwarner wird als Bausatz geliefert, dessen Zusammenbau nicht besonders schwierig ist, da alle SMD-Teile bereits fertig gelötet sind. Der Bausatz enthält alle notwendigen Teile inklusive eines fertig bearbeiteten und bedruckten Gehäuses. Er besitzt 3 Schaltausgänge, die je nach Konfiguration des GW1 per Lötbrücke (J2 offen = statisches Signal, Blitz mit 1 Sekunde oder J2 geschlossen = Impuls von 300 ms Länge) mit einem der folgenden Sender&lt;br /&gt;
&lt;br /&gt;
* HM-SCI-3-FM&lt;br /&gt;
* [[HM-PBI-4-FM]]&lt;br /&gt;
* HMW-Sen-SC-12-FM&lt;br /&gt;
* HMW-Sen-SC-12-DR&lt;br /&gt;
* HMW-IO-4-FM&lt;br /&gt;
* HMW-IO-12-FM&lt;br /&gt;
* HMW-IO-12-Sw7-DR&lt;br /&gt;
* HMW-IO-12-Sw14-DR&lt;br /&gt;
* FS20 S4M&lt;br /&gt;
* FS20 S8M&lt;br /&gt;
* FS20 S4UB&lt;br /&gt;
* FS20 TFK&lt;br /&gt;
&lt;br /&gt;
zur Integration in Fhem genutzt werden können. Es kommt also darauf an, ob der Sender einen Schalt- oder Tastimpuls verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird die Nutzung mit einem [[HM-PBI-4-FM]] dargestellt (J2 also geschlossen). Dabei erfolgt die Verbindung zwischen GW1 und HM-PBI-4-FM nach folgendem Schema:&lt;br /&gt;
&lt;br /&gt;
* schwarz: Masse&lt;br /&gt;
* 1: Entwarnung&lt;br /&gt;
* 2: Blitz&lt;br /&gt;
* 3: Warnung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Der GW1 ist &amp;lt;ins&amp;gt;kein&amp;lt;/ins&amp;gt; Blitzorter wie er z.B. bei [http://www.blitzortung.org/Webpages/index.php Blitzortung.org] verwendet wird. Er kann also nicht die Richtung der detektierte Blitze bestimmen.&lt;br /&gt;
* Um die Empfindlichkeitswerte (z.B. in einer Umgebung mit stärkeren Störeinflüssen) oder andere Einstellungen zu verändern, sind auf der Platine insgesamt 18 DIP-Schalter angebracht. Die von ELV mitgelieferte (Auf-)Bauanleitung geht nur grob auf die Parameterveränderung ein und verweist auf das [http://www.ams.com/eng/Products/Lightning-Sensor/Franklin-Lightning-Sensor/AS3935 Datenblatt des Herstellers].&lt;br /&gt;
&lt;br /&gt;
=== Techn. Daten ===&lt;br /&gt;
Der GW1 beruht auf einem [http://www.elv.de/controller.aspx?cid=758&amp;amp;detail=10&amp;amp;detail2=148 Franklin Lightning Sensor AS3935]. Zu diesem Sensor gibt es einige Links im WWW, vor allem auch zu einer Umsetzung mittels &#039;&#039;Arduino&#039;&#039;, jedoch scheint keine dieser Umsetzungen &amp;quot;von Erfolg gekrönt zu sein&amp;quot; (Stand November 2013).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bausatz:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Versorgungsspannung: 5 - 12 V DC (Hohlstecker 3,5 x 1,3 mm, Plus innen)&lt;br /&gt;
* Stromaufnahme: 10 mA&lt;br /&gt;
* Schaltausgänge: 3 x Open Collector (30 V max., 100 mA max.)&lt;br /&gt;
* Schutzart: IP20&lt;br /&gt;
* Abmessungen (BxHxT): 40 x 70 x 16 mm&lt;br /&gt;
* Gewicht: 33 g&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausgangsmodi&#039;&#039;&#039; (nur für alle 3 Ausgänge gemeinsam):&lt;br /&gt;
&lt;br /&gt;
* Dauersignal (statisch, bei Blitz für 1 Sekunde)&lt;br /&gt;
* Schaltimpuls mit 300 ms Länge&lt;br /&gt;
&lt;br /&gt;
== Alternativen ==&lt;br /&gt;
&amp;lt;ggfls. ergänzen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Wie oben geschrieben, wird der GW1 über entsprechende HM- oder FS20-Sender in Fhem eingebunden.&lt;br /&gt;
&lt;br /&gt;
=== HomeMatic ===&lt;br /&gt;
Nach dem Zusammenbau des GW1 wurde er nach obigem Schema mit dem [[HM-PBI-4-FM]] verbunden. Die Belegung ist natürlich wahlfrei, nur Masse des GW1 muss mit Masse des HM-PBI-4-FM (schwarzes Kabel) Verbindung haben.&lt;br /&gt;
&lt;br /&gt;
=== FS20 ===&lt;br /&gt;
&amp;lt;bitte ergänzen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Das &amp;quot;Problem&amp;quot; liegt darin, dass nicht immer Gewitter ist. Es gibt ein Entwickler-Kit vom Hersteller des Sensor-ICs, dem auch ein &amp;quot;Blitzgenerator&amp;quot; beiliegt. Dieses Kit liegt preislich aber &amp;quot;jenseits von Gut und Böse&amp;quot;. Schaltnetzteile und Piezo-Feuerzeuge funktionierten auch nicht. Diese erzeugten hier maximal ein Aufleuchten der Störimpuls-LED.&lt;br /&gt;
&lt;br /&gt;
Was hier zum Testen funktioniert hat, ist ein normaler (etwas älterer) Schnurschalter (Wippe), der ein Meanwell-Schaltnetzteil ein- und ausgeschaltet hat. Beim Ein- und Ausschalten kommt es in dem Schalter wohl zu Abriss- bzw. Einschaltfunken. Alternativ zum Schaltnetzteil kann man auch eine Glühlampe (getestet mit einer alten 100 W Glüh&amp;quot;birne&amp;quot;) mit dem Wippenschalter betätigen, denn wichtig ist der Wippenschalter, der in der Nähe des GW1 gehalten werden sollte (einige Zentimeter) bzw. dessen Abrissfunken.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorgehensweise:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Einschalten bzw. Anschließen der Spannungsversorgung des GW1 wird nach der Initialisierung zunächst die Meldung &amp;quot;Entwarnung&amp;quot; abgesetzt und von Fhem gelogt.&lt;br /&gt;
&lt;br /&gt;
Nun den GW1 direkt neben dem Wippenschalter legen/halten. Ein Ausschalten erzeugte hier ein kurzes Aufleuchten der Störimpuls-LED am GW1. Ein Einschalten brachte aber (mit ca. 1-sekündiger Verzögerung) die Blitz-LED zum Aufleuchten. Dies konnte mehrmals reproduziert werden. Zudem wurde der Ausgang &amp;quot;Warnung&amp;quot; aktiv.&lt;br /&gt;
&lt;br /&gt;
Nach ca. 15 Minuten ohne Blitzerkennung schaltet der GW1 wieder auf &amp;quot;Entwarnung&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hier ein Mitschnitt der entsprechenden Log-Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2013-12-11_21:13:42 Gewitterwarner battery: ok&lt;br /&gt;
2013-12-11_21:13:42 Gewitterwarner CUL_HM_HM_PBI_4_FM_1EFBFC_Btn_01 Short (to broadcast)&lt;br /&gt;
2013-12-11_21:14:10 Gewitterwarner battery: ok&lt;br /&gt;
2013-12-11_21:14:10 Gewitterwarner CUL_HM_HM_PBI_4_FM_1EFBFC_Btn_03 Short (to broadcast)&lt;br /&gt;
2013-12-11_21:14:20 Gewitterwarner battery: ok&lt;br /&gt;
2013-12-11_21:14:20 Gewitterwarner CUL_HM_HM_PBI_4_FM_1EFBFC_Btn_02 Short (to broadcast)&lt;br /&gt;
2013-12-11_21:14:27 Gewitterwarner battery: ok&lt;br /&gt;
2013-12-11_21:14:27 Gewitterwarner CUL_HM_HM_PBI_4_FM_1EFBFC_Btn_02 Short (to broadcast)&lt;br /&gt;
2013-12-11_21:14:40 Gewitterwarner battery: ok&lt;br /&gt;
2013-12-11_21:14:40 Gewitterwarner CUL_HM_HM_PBI_4_FM_1EFBFC_Btn_02 Short (to broadcast)&lt;br /&gt;
2013-12-11_21:14:48 Gewitterwarner battery: ok&lt;br /&gt;
2013-12-11_21:14:48 Gewitterwarner CUL_HM_HM_PBI_4_FM_1EFBFC_Btn_02 Short (to broadcast)&lt;br /&gt;
2013-12-11_21:30:45 Gewitterwarner battery: ok&lt;br /&gt;
2013-12-11_21:30:45 Gewitterwarner CUL_HM_HM_PBI_4_FM_1EFBFC_Btn_01 Short (to broadcast)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Btn_01 =&amp;gt; Entwarnung&lt;br /&gt;
* Btn_03 =&amp;gt; Warnung&lt;br /&gt;
* Btn_02 =&amp;gt; Blitz wurde erkannt&lt;br /&gt;
&lt;br /&gt;
Der GW1 mitsamt HM-PBI-4-FM wird nun an einen Ort &amp;quot;verfrachtet&amp;quot;, wo er weitestgehend ungestört ist und sobald Erfahrungen mit realen Gewittern vorliegen, wird dieser Beitrag entsprechend ergänzt.&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
&amp;lt;ggfls. ergänzen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&amp;lt;ggfls. ergänzen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.elv.de/output/controller.aspx?cid=74&amp;amp;detail=10&amp;amp;detail2=43718 ELV-Bausatz]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,15319.0.html Thread im Fhem-Forum]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=AS3935 Beiträge zum AS3935 auf Mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Gewittersensor]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=7234</id>
		<title>ReadingsGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ReadingsGroup&amp;diff=7234"/>
		<updated>2014-08-12T19:41:21Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:readingsGroup}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einfache zusammenfassende Darstellung von Informationen über mehrere Geräte&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=readingsGroup&lt;br /&gt;
|ModTechName=33_readingsGroup.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=430 Andre / justme1968]}}&lt;br /&gt;
Das Fhem-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[readingsGroup]] bietet eine einfache Möglichkeit, &#039;&#039;readings&#039;&#039; und &#039;&#039;internal values&#039;&#039; von einem oder mehreren &#039;&#039;Devices&#039;&#039; darzustellen und flexibel zu formatieren. &lt;br /&gt;
&lt;br /&gt;
Hier soll eine Sammlung von Beispielen zur Verwendung der &#039;&#039;readingsGroup&#039;&#039; mitsamt der zugehörigen Screenshots entstehen.&lt;br /&gt;
&lt;br /&gt;
== Definition == &lt;br /&gt;
Siehe commandref.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Weitergehende Erläuterungen zu einzelnen Attributen:&lt;br /&gt;
&lt;br /&gt;
=== noheading ===&lt;br /&gt;
[[Datei:ReadingsGroup_noheading.png|mini|rechts|400px|ReadingsGroup: rechts mit &amp;quot;noheading&amp;quot; Attribut, links der anklickbare Titel]]&lt;br /&gt;
Das Attribut &amp;lt;code&amp;gt;noheading&amp;lt;/code&amp;gt; führt dazu, dass der Alias der ReadingsGroup nicht mehr als Titel angezeigt wird. Das kann wünschenswert sein, wenn die ReadingsGroup auf einer [[Dashboard]]-Seite angezeigt werden soll, hat allerdings den Nachteil, dass die Detail-Ansicht der ReadingsGroup nicht mehr über einen Klick auf den Titel aufgerufen werden kann. Der Einstellungsdialog der ReadingsGroup ist dann nur noch (z.&amp;amp;nbsp;B.) über&lt;br /&gt;
* einen &amp;quot;Probably associated with&amp;quot;-Link eines anderen Objekts oder über&lt;br /&gt;
* manuelle Modifikation der URL eines anderen Objekts (&amp;lt;code&amp;gt;http:.../fhem?detail=&amp;lt;objektname&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
erreichbar.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie in Fhemweb, in der command box oder nach Klick auf DEF eingegeben werden. Beim manuellen Einfügen in eine [[Konfiguration|Konfigurationsdatei]] sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
=== Einfache Auswahl über Reading-Namen ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define battStatus readingsGroup .*:[Bb]attery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;Battery&#039;&#039;&#039; oder &#039;&#039;&#039;battery&#039;&#039;&#039; von allen Devices. &lt;br /&gt;
| rowspan=3 | [[Datei:rgBattery.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr battStatus alias FHT Batteriestatus &amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias wird als Zeilentitel verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr battStatus mapping %ROOM &amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;Mapping %ROOM&#039;&#039; führt dazu, dass der Raumname als Zeilentitel angezeigt wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Auswahl über Reading-Namen, Status als Symbol dargestellt ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_battery readingsGroup .*:battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;battery&#039;&#039;&#039; von allen Devices. &lt;br /&gt;
| rowspan=4 | [[Datei:rgBattery2.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery alias Batteriestatus &amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias wird als Überschrift verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Statt der reading Werte &amp;quot;ok&amp;quot; und &amp;quot;low&amp;quot; soll ein Icon angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr rg_battery commands { &amp;quot;battery.low&amp;quot; =&amp;gt; &amp;quot;set %DEVICE replaceBatteryForSec 60&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für LaCrosse devices kann man beim Klick auf ein rotes &amp;quot;battery low icon&amp;quot; direkt replaceBatteryForSec setzen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reading-Werte zuordnen (Icon / Text) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg readingsGroup Contact.Dachboden_gross:sensed.*&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle sensedreadings des Contact.Dachboden_gross device. &lt;br /&gt;
| rowspan=4 | [[Datei:rgFenster.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg mapping { &#039;sensed.A&#039; =&amp;gt; &#039;links&#039;, &#039;sensed.B&#039; =&amp;gt; &#039;rechts&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung rechts/links&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg valueFormat {($VALUE eq &#039;1&#039;)?&amp;quot;fts_window_roof&amp;quot;:&amp;quot;fts_window_roof_open_2&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung von reading Wert zu Icon Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_battery valueIcon %VALUE &amp;lt;/code&amp;gt;&lt;br /&gt;
| Statt des reading Werts soll ein Icon angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Formatvorgabe für Ausgabewerte ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define TempHygro readingsGroup TYPE=CUL_WS:temperature,humidity,dewpoint&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039;, &#039;&#039;&#039;dewpoint&#039;&#039;&#039; von allen Devices des Typs &#039;&#039;&#039;CUL_WS&#039;&#039;&#039;&lt;br /&gt;
| rowspan=4 | [[Datei:rgTemperatur.png|thumb|[[S300TH]]-Werte in einer readingsGroup]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro alias Temperatur / rel. Feuchte / Taupunkt&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Alias der readingsGroup wird als Überschrift verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro mapping %ALIAS&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;Mapping %ALIAS&#039;&#039; führt dazu, dass der Alias des Geräts als Zeilentitel angezeigt wird.&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;attr TempHygro valueFormat { temperature =&amp;gt; &amp;quot;%.1f&amp;amp;amp;deg;C&amp;quot;, humidity =&amp;gt; &amp;quot;%.1f %%&amp;quot;, dewpoint =&amp;gt; &amp;quot;%.1f&amp;amp;amp;deg;C&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Formatierung der Ausgabewerte. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; &amp;quot;%&amp;quot; die in der Ausgabe erscheinen sollen, müssen verdoppelt werden!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ausgabestil (hier rechtsbündig) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Wetter readingsGroup WetterXXX:&amp;lt;%temp_temperature&amp;gt;,&amp;lt;Temperatur&amp;gt;,temperature WetterXXX:&amp;lt;%weather_humidity&amp;gt;,&amp;lt;Luftfeuchte&amp;gt;,humidity WetterXXX:&amp;lt;%weather_baraometric_pressure&amp;gt;,&amp;lt;Luftdruck&amp;gt;,pressure&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings mit Namen &#039;&#039;&#039;temperature&#039;&#039;&#039;, &#039;&#039;&#039;humidity&#039;&#039;&#039; und &#039;&#039;&#039;pressure&#039;&#039;&#039; vom Device WetterXXX jeweils mit einem Icon und einem Label davor.&lt;br /&gt;
| rowspan=3 | [[Datei:rgWetter.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueFormat { temperature =&amp;gt; &#039;%1.f &amp;amp;amp;deg;C&#039;, humidity =&amp;gt; &#039;%1.f %%&#039;, pressure =&amp;gt; &#039;%i mbar&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Readingswerte&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Wetter valueStyle style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Readings sollen rechtsbündig dargestellt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Value ausgeben ===&lt;br /&gt;
Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den cul_RSSI Wert aller Devices die einen solchen haben anzeigen.&amp;lt;br&amp;gt; &#039;&#039;&#039;Achtung&#039;&#039;&#039;: &amp;quot;internal values&amp;quot; werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.&lt;br /&gt;
| rowspan=1 | [[Datei:rgculRSSI.png|thumb]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Values ausgeben ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI,+cul_TIME&amp;lt;/code&amp;gt;&lt;br /&gt;
| Den cul_RSSI Wert mit der zugehörigen Zeit aller Devices die einen solchen haben anzeigen.&amp;lt;br&amp;gt; &#039;&#039;&#039;Achtung&#039;&#039;&#039;: &amp;quot;internal values&amp;quot; werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.&amp;lt;br&amp;gt;&amp;quot;Internal Values&amp;quot; werden durch das vorangestellte &#039;&#039;&#039;+&#039;&#039;&#039; (Pluszeichen) identifiziert.&lt;br /&gt;
| rowspan=1 | [[Datei:rgculRSSI2.png|thumb]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Alle Readings eines Gerätes, mit Ausnahme von... ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Systemstatus readingsGroup sysstat&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle readings des sysstat Device&lt;br /&gt;
| rowspan=4 | [[Datei:rgSysstat.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne state&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne readings timestamp&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Systemstatus mapping {&#039;load&#039; =&amp;gt; &#039;Systemauslastung&#039;, &#039;temperature&#039; =&amp;gt; &#039;Systemtemperatur in &amp;amp;amp;deg;C&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung der reading Namen zu den Zeilentiteln&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Anzeige auf einem Floorplan ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen !! Aussehen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizung readingsGroup t(1|2|3):temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Temperatur readings der Devices t1, t2 und t3&lt;br /&gt;
| rowspan=6 | [[Datei:rgHeizung.png|thumb]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung mapping {&#039;t1.temperature&#039; =&amp;gt; &#039;Vorlauf&#039;, &#039;t2.temperature&#039; =&amp;gt; &#039;R&amp;amp;amp;&amp;amp;uuml;cklauf&#039;, &#039;t3.temperature&#039; =&amp;gt; &#039;Zirkulation&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Zuordnung der reading Namen zu den Zeilentiteln&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung nameStyle style=&amp;quot;text-align:left&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Zeilentitel linksbündig wegen floorplan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung style style=&amp;quot;font-size:20px;color:lightgray&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Großer Font und Farbe passend für den floorplan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ohne readings timestamp&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizung valueFormat : %.1f &amp;amp;amp;deg;C&amp;lt;/code&amp;gt;&lt;br /&gt;
| Doppelpunkt zwischen Zeilentitel und Wert, eine Nachkommastelle plus Einheit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Schriftgrößen, Farben, Icons ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgVerbrauchPCA301.png|links|mini|400px|Schriftgröße, Farbe, Icons...]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Verbrauch readingsGroup TYPE=PCA301:state,power,consumption&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings state, power und consumption aller [[PCA301 Funkschaltsteckdose mit Energieverbrauchsmessung|PCA301]] Devices mit einer Zeile pro Device. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch mapping %ROOM %ALIAS&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Raumname und der Alias werden als Zeilentitel verwendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch nameStyle style=&amp;quot;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Zeilentitel soll fett sein&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch style style=&amp;quot;font-size:20px&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alles in einem größeren Font&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Verbrauch valueFormat {power =&amp;gt; &amp;quot;%.1f W&amp;quot;, consumption =&amp;gt; &amp;quot;%.2f kWh&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung für die power und consumption readings: eine Nachkommastelle plus Einheit.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr Verbrauch valueIcon { state =&amp;gt; &#039;%devStateIcon&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für die Dosen, die schaltbar sind, soll das anklickbare device icon gezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr Verbrauch valueStyle {($READING eq &amp;quot;power&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 40)?&#039;style=&amp;quot;color:red&amp;quot;&#039;:&#039;style=&amp;quot;color:green&amp;quot;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Wenn das power reading &amp;gt;40 ist, soll es in rot angezeigt werden, alle anderen Werte und readings in grün&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wertabhängige Farbgebung ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:TemperaturenRG.png|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
[[Datei:TemperaturenRG2.png|600px|mini|links|Andere Werte - andere Farben]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define wzTemperaturenRG readingsGroup Aussen:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity Wohnzimmer:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity Kasten_E_Geraete:,&amp;lt;Temperatur&amp;gt;,temperature,&amp;lt;Luftfeuchte&amp;gt;,humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readings temperatur und humidity der Devices Aussen, Wohnzimmer und Kasten_E_Geraete in einer Zeile pro Device. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG group 3. Temperaturen&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readingsGroup kommt in eine Gruppe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG noheading 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| noheading&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| nostate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| notime&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzTemperaturenRG valueFormat {temperature =&amp;gt; &amp;quot;%.1f °C&amp;quot;, humidity =&amp;gt;&amp;quot;%.1f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung für die temperatur und humidity readings: eine Nachkommastelle plus Einheit.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr wzTemperaturenRG valueStyle { if($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 30) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 20) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Aussen&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 5) { &#039;style=&amp;quot;color:blue&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 23) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 21) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Wohnzimmer&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 20) { &#039;style=&amp;quot;color:blue&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Kasten_E_Geraete&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 30) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($DEVICE eq &amp;quot;Kasten_E_Geraete&amp;quot; &amp;amp;&amp;amp; $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 28) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}elsif($READING eq &amp;quot;humidity&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 65) { &#039;style=&amp;quot;color:red&amp;quot;&#039;}elsif($READING eq &amp;quot;humidity&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 60) { &#039;style=&amp;quot;color:orange&amp;quot;&#039;}else{&#039;style=&amp;quot;color:green&amp;quot;&#039;} }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Farbkombinationen sind möglich&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Enigma Receiver ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:ReceiverRG.jpg|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
[[Datei:ReceiverRGmute.jpg|600px|mini|links|Wertabhängige Farben]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define wzReceiverRG readingsGroup wzReceiver:,&amp;lt;Aktuell&amp;gt;,eventtitle,&amp;lt;Rest&amp;gt;,eventremaining_hr,&amp;lt;Dauer&amp;gt;,eventduration_hr wzReceiver:&amp;lt;Beschreibung&amp;gt;,eventdescription wzReceiver:,&amp;lt;Nächste&amp;gt;,eventtitle_next,&amp;lt;Start&amp;gt;,eventstart_next_hr,&amp;lt;Dauer&amp;gt;,eventduration_next_hr wzReceiver:,&amp;lt;HDD Kapazität&amp;gt;,hdd1_capacity,&amp;lt;Frei&amp;gt;,wzReceiver:hdd1_free wzReceiver:,&amp;lt;Lautstärke&amp;gt;,volume,&amp;lt;HDD&amp;gt;,hdd1_capacity,&amp;lt;Frei&amp;gt;,hdd1_free&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mehrere readings des Device wzReceiver in mehreren Zeilen. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke, mute angezeigt. Farbige Anzeige des freien Speicherplatzes&lt;br /&gt;
&#039;&#039;&#039;Benötigt:&#039;&#039;&#039; ENIGMA2 Receiver, 70_ENIGMA2.pm - Siehe: [[Enigma2 Receiver (Dreambox, VUplus etc.) steuern]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG group Fernseher Receiver&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die readingsGroup kommt in eine Gruppe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG mapping &amp;amp;amp;nbsp;&amp;lt;/code&amp;gt;&lt;br /&gt;
| mapping wird auf &amp;amp;amp;nbsp; (Leerzeichen) gesetzt, damit der Device Name nicht angezeigt wird&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG noheading 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| noheading&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG nostate 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| nostate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG notime 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| notime&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG valueColumns { eventdescription =&amp;gt; &#039;colspan=&amp;quot;4&amp;quot;&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Beschreibung soll über 4 Spalten gehen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr wzReceiverRG valueFormat { wzReceiverRGvalueFormat($DEVICE,$READING,$VALUE);; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung wird in die 99_myUtils.pm ausgelagert. Siehe: [[99 myUtils anlegen]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;attr wzReceiverRG valueStyle { if($READING eq &amp;quot;hdd1_free&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 200){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }elsif( $READING eq &amp;quot;hdd1_free&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt; 500 ){ &#039;style=&amp;quot;color:orange&amp;quot;&#039; }elsif( $READING eq &amp;quot;volume&amp;quot; &amp;amp;&amp;amp; ReadingsVal($DEVICE, &amp;quot;mute&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot; ){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }else{ &#039;style=&amp;quot;color:green&amp;quot;&#039; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Farbkombinationen sind möglich. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;mute&amp;lt;/span&amp;gt; angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 sub wzReceiverRGvalueFormat($$$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING,$VALUE) = @_;&lt;br /&gt;
 &lt;br /&gt;
   if($READING eq &#039;hdd1_capacity&#039;) { &lt;br /&gt;
     return &amp;quot;%.2f MB&amp;quot;;&lt;br /&gt;
   } elsif( $READING eq &#039;hdd1_free&#039;) {&lt;br /&gt;
     return &amp;quot;%.2f MB&amp;quot;;&lt;br /&gt;
   } elsif( $READING eq &#039;volume&#039; ) {&lt;br /&gt;
     if( ReadingsVal($DEVICE, &amp;quot;mute&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;on&amp;quot;) {&lt;br /&gt;
       return &amp;quot;mute&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       return &amp;quot;%i %%&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte inklusive Batterie- und Fensterstatus ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung3.png|thumb|links|500px|Heizungswerte inklusive Batterie- und Fensterstatus]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt; &amp;gt;,&amp;lt;Act&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt; TYPE=FHT:actuator,desired-temp,measured-temp,&amp;lt;%18&amp;gt;,&amp;lt;%20&amp;gt;,&amp;lt;%22&amp;gt;,window,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;FHT&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte commands { &#039;Heizungswerte.18&#039; =&amp;gt; &#039;set $DEVICE desired-temp 18&#039;, &#039;Heizungswerte.20&#039; =&amp;gt; &#039;set $DEVICE desired-temp 20&#039;, &#039;Heizungswerte.22&#039; =&amp;gt; &#039;set $DEVICE desired-temp 22&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Links/Kommandos die hinter den 18, 20 und 22 liegen sollen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte inklusive Ventilposition ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:Rg_Heizung_Valveposition.png|thumb|links|500px|Heizungswerte inklusive Statusinformationen (MAX!)]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt;Ventil&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt;,&amp;lt;MaxV&amp;gt;,&amp;lt;GID&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Batterie&amp;gt; type=CUL_HM:ValvePosition,desired-tempe,measured-temp,R-valveMaxPos,groupid,mode,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;MAX&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte mapping %ROOM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Raumnamen werden angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb (fett) sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte room Heizung&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die &amp;quot;readingsgroup&amp;quot; wird dem Ruam &amp;quot;Heizung&amp;quot; zugeordnet.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueFormat {temperature =&amp;gt; &amp;quot;%.0f °C&amp;quot;, desiredTemperature =&amp;gt; &amp;quot;%.0f °C&amp;quot;, valveposition =&amp;gt;&amp;quot;%.0f %%&amp;quot;,maxValveSetting =&amp;gt;&amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Es wird noch die Einheit °C hinter den Temperaturwerten angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batterzustand werden Icons anstatt Klartextwerte genommen!&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueStyle { if($READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 20){ &#039;style=&amp;quot;color:green;;font-weight:bold&amp;quot;&#039; }elsif( $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;lt;= 20 ){ &#039;style=&amp;quot;color:blue&amp;quot;&#039; }elsif( $READING eq &amp;quot;temperature&amp;quot; &amp;amp;&amp;amp; $VALUE &amp;gt; 23 ){ &#039;style=&amp;quot;color:red&amp;quot;&#039; }else{ &#039;style=&amp;quot;color:gray&amp;quot;&#039; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Temperaturwerte werden abhängig vom Wert farbig dargestellt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Heizungswerte, Status und Regelmöglichkeit ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung2.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define Heizungswerte2 readingsGroup &amp;lt;%sani_heating&amp;gt;,&amp;lt; &amp;gt;,&amp;lt;Act&amp;gt;,&amp;lt;Soll&amp;gt;,&amp;lt;Ist&amp;gt; TYPE=FHT:actuator,desired-temp,measured-temp,&amp;lt;{myUtils_HeizungUpDown($DEVICE,&amp;quot;up&amp;quot;)}@desired-temp&amp;gt;,desired-new,&amp;lt;{myUtils_HeizungUpDown($DEVICE,&amp;quot;down&amp;quot;)}@desired-temp&amp;gt;,window,battery&amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse readings aller Devices des Typs &amp;lt;b&amp;gt;FHT&amp;lt;/b&amp;gt;. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 nameStyle style=&amp;quot;color:yellow;font-weight:bold&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;, &#039;window.closed&#039; =&amp;gt; &#039;fts_window_1w@lightgreen&#039;, &#039;window.open&#039; =&amp;gt; &#039;fts_window_1w_open@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr Heizungswerte2 valueStyle {($VALUE eq &amp;quot;00&amp;quot;)?&#039;style=&amp;quot;visibility:hidden&amp;quot;&#039;:&#039;&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nach dem Einstellen den Wert wieder ausblenden. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #Heizung regeln in readingsGroup&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDown($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$CMD) = @_;&lt;br /&gt;
  &lt;br /&gt;
   my $icon = $CMD;&lt;br /&gt;
   my $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-new&amp;quot;,&amp;quot;20&amp;quot; );&lt;br /&gt;
   $VALUE = ReadingsVal($DEVICE,&amp;quot;desired-temp&amp;quot;,&amp;quot;20&amp;quot; )&lt;br /&gt;
      if( !$VALUE || $VALUE == 0 );&lt;br /&gt;
   my $link;&lt;br /&gt;
  &lt;br /&gt;
   if( $CMD eq &amp;quot;up&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_upward&amp;quot;;&lt;br /&gt;
     $VALUE += 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;lt;= 24 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@red&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   } elsif( $CMD eq &amp;quot;down&amp;quot; ) {&lt;br /&gt;
     $icon = &amp;quot;control_arrow_downward&amp;quot;;&lt;br /&gt;
     $VALUE -= 1;&lt;br /&gt;
  &lt;br /&gt;
     if( $VALUE &amp;gt;= 18 ) {&lt;br /&gt;
       $icon .= &amp;quot;\@blue&amp;quot;;&lt;br /&gt;
       $link = &amp;quot;setreading $DEVICE desired-new $VALUE&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $notify = &amp;quot;notifyHeizungUpDown&amp;quot;;&lt;br /&gt;
   if( !defined($defs{$notify}) ) {&lt;br /&gt;
     CommandDefine(undef,&lt;br /&gt;
                    &amp;quot;$notify notify .*:desired-new.* &amp;quot;&lt;br /&gt;
                    .&amp;quot;{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   my $ret = &amp;quot;%$icon&amp;quot;;&lt;br /&gt;
   $ret .= &amp;quot;%$link&amp;quot; if( $link );&lt;br /&gt;
  &lt;br /&gt;
   return $ret;&lt;br /&gt;
 }&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_HeizungUpDownNotify($$)&lt;br /&gt;
 {&lt;br /&gt;
   my($DEVICE,$VALUE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   return if( $VALUE == 0 );&lt;br /&gt;
  &lt;br /&gt;
   my $at = &amp;quot;triggerHeizungUpDown_$DEVICE&amp;quot;;&lt;br /&gt;
   CommandDelete(undef, $at) if( defined($defs{$at}) );&lt;br /&gt;
   CommandDefine(undef,&lt;br /&gt;
                  &amp;quot;$at at +00:00:03 &amp;quot;&lt;br /&gt;
                  .&amp;quot;{my \$v = ReadingsVal(\&amp;quot;$DEVICE\&amp;quot;,\&amp;quot;desired-new\&amp;quot;,undef);&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;set $DEVICE desired-temp \$v\&amp;quot;) if( \$v );&amp;quot;&lt;br /&gt;
                  .&amp;quot;fhem(\&amp;quot;setreading $DEVICE desired-new 00\&amp;quot;);}&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
   return undef;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich &amp;gt;=18 und &amp;lt;= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Readings aus zusätzlichen Devices ===&lt;br /&gt;
Im folgenden Beispiel wird gezeigt wie sich Readings zusätzlicher Devices zu einer Zeile mit mehreren Readings hinzufügen lassen. Diese zusätzlichen Devices können z.b. die unterschiedlichen Channel eines HomeMatic Gerätes sein. Im folgenden Beispiel wird der Name des zugehörigen Geräts dynamisch bestimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rgHeizung4.png|thumb|500px|links|Anzeige + Regelmöglichkeit]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define myTemp readingsGroup &amp;lt;Raum&amp;gt;,&amp;lt;Tist&amp;gt;,&amp;lt;Tsoll&amp;gt;,&amp;lt;Mode&amp;gt;,&amp;lt;Tnight&amp;gt;,&amp;lt;Tday&amp;gt;,&amp;lt;Hum&amp;gt;,&amp;lt;BatTC&amp;gt;,&amp;lt;Vist&amp;gt;,&amp;lt;Vsoll&amp;gt;,&amp;lt;Verr&amp;gt;,&amp;lt;BatVD&amp;gt; Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst &amp;lt;/code&amp;gt;&lt;br /&gt;
| Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilanriebs. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp mapping    { &#039;Broetje&#039; =&amp;gt; &#039;Garten&#039;,&#039;Thermostat.AZ&#039; =&amp;gt; &#039;EG Arbeitszimmer&#039;,&#039;Thermostat.SZ&#039; =&amp;gt; &#039;OG Schlafzimmer&#039;,&#039;Thermostat.WZ&#039;=&amp;gt;&#039;EG Wohnzimmer&#039;,&#039;Thermostat.Kueche&#039; =&amp;gt; &#039;EG Küche&#039;,&#039;Thermostat.GZ&#039; =&amp;gt; &#039;OG Gästezimmer&#039;,&#039;Thermostat.Bad&#039; =&amp;gt; &#039;EG Bad&#039;,&#039;Thermostat.Bad.OG&#039; =&amp;gt; &#039;OG Bad&#039;,&#039;Thermostat.OZ&#039; =&amp;gt; &#039;EG Kaminzimmer&#039;,&#039;desired-temp&#039; =&amp;gt; &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp commands   { &#039;desired-temp&#039; =&amp;gt; &#039;desired-temp:&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| desired-temp soll per dropDown einstellbar sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp nameStyle style=&amp;quot;color:yellow&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Überschriften sollen gelb sein.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueIcon {&#039;battery.ok&#039; =&amp;gt; &#039;batterie@lightgreen&#039;, &#039;battery.low&#039; =&amp;gt; &#039;batterie@red&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Für den Batteriestand sollen jeweils Icons angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr myTemp valueFormat { &#039;measured-temp&#039; =&amp;gt; &amp;quot;%0.1f &amp;amp;amp;deg;C&amp;quot;,&#039;ToutIst&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;night-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;day-temp&#039; =&amp;gt; &amp;quot;%.1f &amp;amp;amp;deg;C&amp;quot;,&#039;humidity&#039; =&amp;gt; &amp;quot;%.0f &lt;br /&gt;
%%&amp;quot;,&#039;ValvePosition&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;ValveDesired&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot;,&#039;R-valveErrorPos&#039; =&amp;gt; &amp;quot;%.0f %%&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die Formatierung der Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&lt;br /&gt;
 #namen des ventil device aus thermostat device ableiten&lt;br /&gt;
 sub valveOfDevice ($) {&lt;br /&gt;
   my ($DEVICE) = @_;&lt;br /&gt;
  &lt;br /&gt;
   if ($DEVICE =~ m/AZ/) {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11).&amp;quot;.Nord&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
  	return &amp;quot;Ventil.&amp;quot;.substr($DEVICE,11);  	&lt;br /&gt;
   }&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.&lt;br /&gt;
|}&lt;br /&gt;
Da im {...} Teil des &amp;lt;reading&amp;gt;@&amp;lt;device&amp;gt; Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar &#039;Tricks&#039; lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:&amp;lt;code&amp;gt;...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dynamische Inhalte ===&lt;br /&gt;
[[Datei:rgDynamic-1.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 1]]&lt;br /&gt;
[[Datei:rgDynamic-2.png|mini|450px|readingsGroup mit umschaltbarem Inhalt 2]]&lt;br /&gt;
Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich&lt;br /&gt;
einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define LXrg dummy&lt;br /&gt;
attr LXrg group -&lt;br /&gt;
attr LXrg setList mode1:on,off mode2:open,closed,tilted&lt;br /&gt;
attr LXrg stateFormat 1=mode1 2=mode2&lt;br /&gt;
attr LXrg webCmd mode1:mode2&lt;br /&gt;
&lt;br /&gt;
define rg readingsGroup Window.*:state Light.*:state&lt;br /&gt;
attr rg group -&lt;br /&gt;
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode1&amp;quot;,&amp;quot;&amp;quot;) || $VALUE eq ReadingsVal(&amp;quot;LXrg&amp;quot;,&amp;quot;mode2&amp;quot;,&amp;quot;&amp;quot;) );; return undef;;}&lt;br /&gt;
&lt;br /&gt;
define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,&#039;state&#039;,&#039;&#039;);;;;fhem(&amp;quot;setreading $NAME $value&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Enable/Disable Button am Beispiel eines WeekdayTimer ===&lt;br /&gt;
Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading &amp;quot;disabled&amp;quot;). Es gibt aber auch eine allgemeinere Variante (siehe [http://forum.fhem.de/index.php/topic,23655.msg169141.html#msg169141 diesen Forumsbeitrag]) für alle Objekte, die das FHEM Attribut &amp;quot;disable&amp;quot; unterstützen.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Definition !! Erläuterungen &lt;br /&gt;
|-&lt;br /&gt;
| colspan=2 | [[Datei:rg_scheduling.png|thumb|500px|links|Enable/Disable Button]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:40%&amp;quot; |&amp;lt;code&amp;gt;define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextUpdate&amp;quot;)}@disabled&amp;gt;,&amp;lt;{rg_timer_Wasser_show_conditional($DEVICE,&amp;quot;nextValue&amp;quot;)}@disabled&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine &amp;lt;code&amp;gt;rg_timer_Wasser_show_conditional&amp;lt;/code&amp;gt;, die in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, daß der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueFormat  { if ( $READING =~ m/.*DEF/ ) { my @text = split(&amp;quot; &amp;quot;, $VALUE); shift @text; return join(&amp;quot; &amp;quot;, @text) }}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Der Name des Timers wird aus dem interal Reading &amp;quot;+DEF&amp;quot; vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser valueIcon { &#039;disabled.0&#039; =&amp;gt; &#039;Restart&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;Shutdown&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attr rg_Timer_Wasser commands  { &#039;disabled.0&#039; =&amp;gt; &#039;set $DEVICE disable&#039;, &#039;disabled.1&#039; =&amp;gt; &#039;set $DEVICE enable&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Toggle-Funktion für den Button. Wenn der Timer aktiv (&amp;quot;disabled.0&amp;quot;) sorgt ein Klick auf den Button, daß der Timer deaktiviert wird (&amp;quot;set $DEVICE disable&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&lt;br /&gt;
 sub rg_timer_Wasser_show_conditional($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($DEVICE,$READING) = @_;&lt;br /&gt;
   return ( ReadingsVal($DEVICE, &amp;quot;disabled&amp;quot;, &amp;quot;1&amp;quot;) eq &amp;quot;0&amp;quot; )? &lt;br /&gt;
      ReadingsVal($DEVICE, $READING, &amp;quot;reading_undef&amp;quot;) : &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dieser Teil kommt in die [[99_myUtils_anlegen|99_myUtils.pm]]: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String &amp;quot;disabled&amp;quot; stattdessen angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links und Trigger ==&lt;br /&gt;
[[Datei:rgPCA-detail.png|mini|400px|readingsGroup mit Link]]&lt;br /&gt;
Das PCA301 Beispiel oben lässt sich mit einem ans Ende des define angehängten &lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;{appendTrigger($DEVICE,&amp;quot;clear&amp;quot;,&amp;quot;Alle löschen&amp;quot;)}&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
und der folgenden appendTrigger Definition in 99_myUtils.pm um einen Link erweitern, der ein Event auslöst, an das z.B. ein notify gehängt werden kann, um die Verbrauchszähler der PCA301 Dosen zurückzusetzen. &lt;br /&gt;
:&amp;lt;code&amp;gt;define clearVerbrauch notify Verbrauch:clear set TYPE=PCA301 clear&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;use vars qw($FW_ME);&lt;br /&gt;
use vars qw($FW_subdir);&lt;br /&gt;
sub&lt;br /&gt;
appendTrigger($$$)&lt;br /&gt;
{&lt;br /&gt;
  my ($name,$trigger,$label) = @_; &lt;br /&gt;
&lt;br /&gt;
  my $ret .= &amp;quot;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $link = &amp;quot;cmd=trigger $name $trigger&amp;quot;;&lt;br /&gt;
  my $txt = &amp;quot;&amp;lt;a onClick=\&amp;quot;FW_cmd(&#039;$FW_ME$FW_subdir?XHR=1&amp;amp;$link&#039;)\&amp;quot;&amp;gt;$label&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  $ret .= &amp;quot;&amp;lt;td colspan=\&amp;quot;99\&amp;quot;&amp;gt;&amp;lt;div style=\&amp;quot;cursor:pointer;color:#888888;text-align:right\&amp;quot;&amp;gt;$txt&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return ($ret,0);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für &#039;custom links und trigger&#039; findet sich im  [http://forum.fhem.de/index.php/topic,14425.msg109383.html#msg109383 Forum]: dort wird damit eine readingsGroup dynamisch umgeschaltet, um nur die eingeschalteten, nur die ausgeschalteten oder alle Lampen anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
In der Regel werden die Parameter zu einem reading in den mappings unter &amp;lt;$DEVICE&amp;gt; und dann &amp;lt;$DEVICE&amp;gt;.&amp;lt;$READING&amp;gt; und dann unter &amp;lt;$READING&amp;gt;.&amp;lt;$VALUE&amp;gt; gesucht.&lt;br /&gt;
&lt;br /&gt;
===Lesbar machen===&lt;br /&gt;
Für die meisten Attribute gilt:&lt;br /&gt;
&lt;br /&gt;
*Wenn es komplexer wird ist es einfacher den Code in eine sub in 99_myUtils auszulagern und diese aufzurufen:&lt;br /&gt;
 &amp;lt;code&amp;gt; attr &amp;lt;name&amp;gt; valueStyle {myValueToFormat($READING,$VALUE)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*code für unterschiedliche readings kann man auch im mapping schon aufteilen:&lt;br /&gt;
 &amp;lt;code&amp;gt;attr &amp;lt;name&amp;gt; valueStyle { SuperE5 =&amp;gt; &#039;{perl code}&#039;, Diesel =&amp;gt; &#039;{perl code}&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:&lt;br /&gt;
 &amp;lt;code&amp;gt;if( $READING eq ... ) {&lt;br /&gt;
   return xxx if( $VALUE &amp;lt; 1 );&lt;br /&gt;
   return yyy if( $VALUE &amp;lt; 1.5 );&lt;br /&gt;
   return zzz;&lt;br /&gt;
 } elsif( $READING eq ... ) {&lt;br /&gt;
   ...&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.&lt;br /&gt;
&lt;br /&gt;
===group===&lt;br /&gt;
Wenn der doppelte Rahmen um eine readingsGroup in eine group  stört, lässt er sich mit dem passenden style entfernen: &lt;br /&gt;
 &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; style style=&amp;quot;border:0px;background:none;box-shadow:none&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Serial/Netzwerk-RS485-Adapter&amp;diff=7233</id>
		<title>Serial/Netzwerk-RS485-Adapter</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Serial/Netzwerk-RS485-Adapter&amp;diff=7233"/>
		<updated>2014-08-12T19:41:02Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vorbemerkungen ==&lt;br /&gt;
Alternativ zum [[HomeMatic_Wired_RS485_LAN_Gateway]], können einfache Serial/Netzwerk-RS485-Adaptern für die Kommunikation von FHEM zu HomeMatic-Wired-Geräten eingesetzt werden.&lt;br /&gt;
In diesem Artikel werden sowohl RS232-RS485-Adapter, USB-RS485-Adapter als auch Netzwerk-RS485-Adapter als Serial-RS485-Adaptern bezeichnet, denn in jedem Fall wird ein serieller Datenstrom an den RS485 Tranceiver weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
Da diese hier beschriebenen Interfaces keine &amp;quot;Intelligenz&amp;quot; besitzen, also die Daten lediglich auf den RS485-Bus umsetzen, wird zur Ansteuerung noch der &#039;&#039;hm485d.pm&#039;&#039;-Daemon benötigt. Dieser Prozess setzt die RAW-Befehle in das HomeMatic-Wired-Protokoll um. Der hm485d kann dabei transparent im Hintergrund arbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Liste der aktuell getesteten Adapter / Schnittstellen (bitte ggf. ergänzen) ===&lt;br /&gt;
&lt;br /&gt;
* DIGITUS DA-70157: USB-Serial Adapter mit RS485 Schnittstelle, funktioniert auch an der FritzBox [http://www.reichelt.de/USB-Konverter/DIGITUS-DA-70157/3//index.html?ARTICLE=122187]&lt;br /&gt;
* Wiznet - WIZ108SR Compact RS422/RS485-to-Ethernet module [http://tigal.at/product/2276]&lt;br /&gt;
* Wiznet - WIZ108SR im Hutschienengehäuse [http://forum.fhem.de/index.php/topic,14096.msg88557.html#msg88557]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
Zum Einbinden des HMW-LAN-GW müssen folgend Zeilen in die fhem.cfg eintragen werde:&lt;br /&gt;
&lt;br /&gt;
 define HM485_LAN HM485_LAN localhost:2000&lt;br /&gt;
 attr HM485_LAN hmwId 00000001&lt;br /&gt;
 attr HM485_LAN HM485d_device &amp;amp;lt;SerialDevice&amp;amp;gt;&lt;br /&gt;
 attr HM485_LAN HM485d_bind 1&lt;br /&gt;
 attr HM485_LAN room HM485&lt;br /&gt;
&lt;br /&gt;
Der Name HM485_LAN kann frei vergeben werden.&lt;br /&gt;
Bei &amp;amp;lt;SerialDevice&amp;amp;gt; muss der Gerätename angegeben werden unter dem das serielle Device anzusprechen ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
 # Serieller USB-RS485-Adapter&lt;br /&gt;
 attr HM485_LAN HM485d_device /dev/ttyUSB0&lt;br /&gt;
&lt;br /&gt;
 # Netzwerk-RS485-Adapter&lt;br /&gt;
 attr HM485_LAN HM485d_device 192.168.1.15:5000&lt;br /&gt;
&lt;br /&gt;
HM485d_bind 1 sorgt dafür, dass der hm485d beim FHEM-Start automatisch mit gestartet wird und durch FHEM auch gesteuert, also auch beendet werden kann.&lt;br /&gt;
&lt;br /&gt;
HM485_LAN kennt weitere Attribute, die zur Kontrolle des hm485d dienen.&lt;br /&gt;
Wichtig ist vor allem, für HM485_LAN eine Adresse festzulegen. Die HMW-ID muss eine 8-stellige Hexadezimalzahl sein.&lt;br /&gt;
Theoretisch könnten die bis zu 256 HMW-LAN-GW angelegt werden. Diese Annahme ist aktuell aber nur Theorie und noch nicht getestet und ggf. mit einigen Problemen verbunden. Die HMW-ID&#039;s für die HMW-Interfaces könnten dafür im Bereich von 00000001 - 000000FF gewählt werden.&lt;br /&gt;
Da in den HMW-Geräten die HMW-ID der Zentrale aber mit 00000001 vordefiniert ist, sollte hier aktuell nur diese ID verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist auch, dass der hm485d &#039;&#039;&#039;gleichzeitig&#039;&#039;&#039; nur eine Netzwerkverbindung erlaubt. Somit ist ein Gateway auch nur mit einer Zentrale / FHEM-Instanz zur gleichen Zeit nutzbar.&lt;br /&gt;
&lt;br /&gt;
=== HM485_LAN Attribute ===&lt;br /&gt;
* &#039;&#039;&#039;hmwId&#039;&#039;&#039; Hier muss die HMW-ID angegeben werden. Standardmäßig wird die 00000001 benutzt.&lt;br /&gt;
* &#039;&#039;&#039;do_not_notify&#039;&#039;&#039; FileLog/notify/inform Benachrichtigung für das Gerät ist abgeschaltet.&lt;br /&gt;
* &#039;&#039;&#039;HM485d_bind&#039;&#039;&#039; Startet den hm485d automatisch beim Start von FHEM und ermöglicht FHEM zudem die Prozesskontrolle&lt;br /&gt;
* &#039;&#039;&#039;HM485d_startTimeout&#039;&#039;&#039; Manchmal, z.B. auf langsameren Geräten wie der FritzBox oder dem Raspberry Pi, ist es erforderlich den hm485d verzögert zu starten. Hier kann die Verzögerung in Sekunden angegeben werden.&lt;br /&gt;
* &#039;&#039;&#039;HM485d_device&#039;&#039;&#039; Das serielle Gerät zum Interface (siehe Beispiel oben).&lt;br /&gt;
* &#039;&#039;&#039;HM485d_serialNumber&#039;&#039;&#039; Die Seriennummer die der hm485d an die Zentrale (FHEM) melden soll.&lt;br /&gt;
* &#039;&#039;&#039;HM485d_logfile&#039;&#039;&#039; Der hm485d kann ein eigenes Logfile schreiben. Hier kann dafür ein Dateiname angegeben werden.&lt;br /&gt;
* &#039;&#039;&#039;HM485d_detatch&#039;&#039;&#039; Wenn der hm485d mit FHEM zusammen gestartet wird (siehe HM485d_bind) so kann der Prozess hier von FHEM entkoppelt werden. Der Prozess wird dann auch nicht zusammen mit FHEM beendet.&lt;br /&gt;
* &#039;&#039;&#039;HM485d_logVerbose&#039;&#039;&#039; Der Loglevel vom hm485d.&lt;br /&gt;
&lt;br /&gt;
Die folgenden drei Attribute können verwendet werden, wenn der hm485d über einen einfachen UART ohne Flusskontrolle z.B. über den UART des Raspberry Pi, an einen RS485 Tranceiver angeschlossen wird. Dafür müssen ggf. GPIO-Pins zur Steuerung des RS485 Tranceivers (Senden/Empfangen) definiert werden:&lt;br /&gt;
* &#039;&#039;&#039;HM485d_gpioTxenInit&#039;&#039;&#039; Shell-Befehl zum initialisieren des benutzten GPIO-Pins für die Sendekontrolle&lt;br /&gt;
* &#039;&#039;&#039;HM485d_gpioTxenCmd0&#039;&#039;&#039; Shell-Befehl um den Sende-GPIO-Pin zurück zu setzen&lt;br /&gt;
* &#039;&#039;&#039;HM485d_gpioTxenCmd1&#039;&#039;&#039; Shell-Befehl um den Sende-GPIO-Pin zu setzen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;&lt;br /&gt;
Da auch der hm485d sich noch in Entwicklung befindet, ist es möglich dass es in einigen Fällen noch zu Fehlverhalten kommen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pairen von Geräten ==&lt;br /&gt;
Jedes HM Geräte muss vor Verwendung mit der Zentrale, hier also FHEM, gepairt werden. Anders als bei den HomeMatic-Funk-Geräten erfolgt das Pairing bei HMW automatisch, sobald ein Gerät das erste Mal eine Nachricht über den Bus versendet. Alternativ kann das Pairing auch durch das Absetzen eines Discovery-Befehls ausgelöst werden.&lt;br /&gt;
Beim Pairen werden die Geräteadressen FHEM bekannt gemacht. Die Adresse der HMW Geräte ist nicht frei wählbar, sondern fest in den Geräten eingestellt. Alle HMW-Geräte haben standardmäßig die Adresse 00000001 als Zentralen-Adresse gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Discovery ===&lt;br /&gt;
Mit dem discovery-Befehl wird der gesamte RS485-Bus nach unbekannten HMW Geräten durchsucht.&lt;br /&gt;
 set HM485_LAN discovery start&lt;br /&gt;
&lt;br /&gt;
Nachdem neue Geräte gefunden worden, werden diese automatisch mit FHEM gepairt.&lt;br /&gt;
&lt;br /&gt;
== RAW-Befehle ==&lt;br /&gt;
Über den HM485_LAN können so genannte RAW-Befehle an die am Bus angeschlossenen Geräte gesendet werden. Mit diesen RAW-Befehlen können z.B. Funktionen ausgelöst werden, die aktuell für ein Gerät noch nicht in FHEM implementiert sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 DDDDDD&lt;br /&gt;
&lt;br /&gt;
* 01234567 - entspricht hier der Adresse des Gerätes an das der Befehl gesendet werden soll&lt;br /&gt;
* 98 - das so genannte Steuerzeichen (Siehe HMW-Protokoll-Dokumentation)&lt;br /&gt;
* 00000001 - die HMW-ID der Zentrale (FHEM)&lt;br /&gt;
* DDDDDD - das sind die zu sendenden Daten.&lt;br /&gt;
&lt;br /&gt;
Da zum Senden von RAW-Befehlen Kenntnisse über das HMW-Protokoll vorhanden sein sollten, lohnt sich ein Blick in die [http://forum.fhem.de/index.php?action=dlattach;topic=10027.0;attach=2441 HMW-Protokoll-Doku]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionale Beispiele:&#039;&#039;&#039;&lt;br /&gt;
 # Rollladenaktor öffnen&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 7802C8&lt;br /&gt;
 &lt;br /&gt;
 # Rollladenaktor stoppen&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 7802C9&lt;br /&gt;
 &lt;br /&gt;
 # Rollladenaktor schließen&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 780200&lt;br /&gt;
 &lt;br /&gt;
 # erster Ausgang (Relais) eines HMW-IO-12-Sw14-DR ein&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 730003FF&lt;br /&gt;
 &lt;br /&gt;
 # erster Ausgang (Relais) eines HMW-IO-12-Sw14-DR aus&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 73000000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wechsel von Serial/Netzwerk-RS485-Adaptern zu HMW-LAN-GW ==&lt;br /&gt;
Der Wechsel zwischen den verschiedenen Interface-Typen geht einfach und bedarf kein neues Pairing.&lt;br /&gt;
Ggf. müssen einige interfacespezifische Attribute in der fhem.cfg hinzugefügt bzw. gelöscht werden. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.reichelt.de/USB-Konverter/DIGITUS-DA-70157/3//index.html?ARTICLE=122187 DIGITUS DA-70157: USB-Serial Adapter]&lt;br /&gt;
* [http://tigal.at/product/2276 Wiznet - WIZ108SR Compact RS422/RS485-to-Ethernet module]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,14096.msg88557.html#msg88557 Wiznet - WIZ108SR im Hutschienengehäuse]&lt;br /&gt;
* [http://forum.fhem.de/index.php?action=dlattach;topic=10027.0;attach=2441 HMW-Protokoll-Doku]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_Wired_RS485_LAN_Gateway&amp;diff=7232</id>
		<title>HomeMatic Wired RS485 LAN Gateway</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_Wired_RS485_LAN_Gateway&amp;diff=7232"/>
		<updated>2014-08-12T19:40:40Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vorbemerkungen ==&lt;br /&gt;
Das [http://www.eq-3.de/produkt-detail-wired/items/homematic-wired-rs485-lan-gateway.html HomeMatic Wired RS485 LAN Gateway], kurz HMW-LAN-GW, stellt eine Alternative zum [[Serial/Netzwerk-RS485-Adapter]] dar. Laut Hersteller arbeitet das HMW-LAN-GW zwar nur mit der CCU2 als HomeMatic Wired Interface zusammen. Das stimmt so aber nicht. Daher kann das Modul ohne Probleme zusammen mit FHEM zur Kommunikation mit HomeMatic Wired Geräten benutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== HMW-LAN-GW versus Serial/Netzwerk-RS485-Adapter ===&lt;br /&gt;
&lt;br /&gt;
Auf dem freien Markt gibt es jede Menge Serial / USB / Netzwerk zu RS485 Adapter. Diese Adapter gibt es teilweise bereits für wenige Euro und können zumeist als HMW Interface eingesetzt werden. Eine Liste dieser Adapter gibt es hier: [[Serial/Netzwerk-RS485-Adapter]]&lt;br /&gt;
Da diese Adapter keine eigene &amp;quot;Intelligenz&amp;quot; besitzen, ist hier zum Betrieb zusätzlich ein Daemon (hm485d.pl) erforderlich. Dieser wird aber, wenn entsprechend konfiguriert, automatisch gestartet und läuft in der Regel unbemerkt im Hintergrund.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
Bevor man das HMW-LAN-GW mit FHEM nutzen kann, müssen noch Einstellungen vorgenommen werden. Dazu braucht man die Software [http://www.eq-3.de/Downloads/eq3/downloads/HM-Cen-O-TW-x-x-2_Usersoftware_V1_1_eQ-3_130816.zip NetFinder]. Diese Java-Anwendung sollte plattformübergreifend funktionieren. Mit diesem Programm muss die netzwerkseitige AES-Verschlüsselung am HMW-LAN-GW abgeschaltet werden. Ansonsten kann FHEM derzeit nicht mit dem Gateway kommunizieren.&lt;br /&gt;
Mit dieser Software lässt sich auch die IP-Adresse des Gateways ändern, falls kein DHCP benutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
Zum Einbinden des HMW-LAN-GW müssen folgende Zeilen in die &#039;&#039;fhem.cfg&#039;&#039; eintragen werde:&lt;br /&gt;
&lt;br /&gt;
 define HM485_LAN HM485_LAN &amp;amp;lt;IP Adresse&amp;amp;gt;:1000&lt;br /&gt;
 attr HM485_LAN hmwId 00000001&lt;br /&gt;
 attr HM485_LAN room HM485&lt;br /&gt;
&lt;br /&gt;
Der Name HM485_LAN kann frei vergeben werden.&lt;br /&gt;
&lt;br /&gt;
HM485_LAN kennt mehrere Attribute, wichtig ist vor allem, für das HMW-LAN-GW eine Adresse festzulegen. Die HMW-ID muss eine 8-stellige Hexadezimalzahl sein.&lt;br /&gt;
Theoretisch könnten bis zu 256 HMW-LAN-GW angelegt werden. Diese Annahme ist aktuell aber nur Theorie und noch nicht getestet und ggf. mit einigen Problemen verbunden. Die HMW-ID&#039;s für die HMW-Interfaces könnten dafür im Bereich von 00000001 - 000000FF gewählt werden.&lt;br /&gt;
Da in den HMW-Geräten die HMW-ID der Zentrale aber mit 00000001 vordefiniert, sollte hier aktuell nur diese ID verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist auch, dass das HMW-LAN-GW &#039;&#039;&#039;gleichzeitig&#039;&#039;&#039; nur &amp;lt;ins&amp;gt;eine Netzwerkverbindung&amp;lt;/ins&amp;gt; erlaubt. Somit ist ein Gateway auch nur mit einer Zentrale / FHEM-Instanz zur gleichen Zeit nutzbar.&lt;br /&gt;
&lt;br /&gt;
=== HM485_LAN Attribute ===&lt;br /&gt;
* hmwId: Hier muss die HMW-ID angegeben werden. Standardmäßig wird die 00000001 benutzt.&lt;br /&gt;
* do_not_notify: FileLog/notify/inform Benachrichtigung für das Gerät ist abgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Attribute sind für das HMW-LAN-GW irrelevant:&lt;br /&gt;
* HM485d_bind&lt;br /&gt;
* HM485d_startTimeout&lt;br /&gt;
* HM485d_device&lt;br /&gt;
* HM485d_serialNumber&lt;br /&gt;
* HM485d_logfile&lt;br /&gt;
* HM485d_detatch&lt;br /&gt;
* HM485d_logVerbose&lt;br /&gt;
* HM485d_gpioTxenInit&lt;br /&gt;
* HM485d_gpioTxenCmd0&lt;br /&gt;
* HM485d_gpioTxenCmd1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pairen von Geräten ==&lt;br /&gt;
Jedes HM Geräte muss vor Verwendung mit der Zentrale, hier also FHEM, gepairt werden. Anders als bei den HomeMatic-Funk-Geräten erfolgt das Pairing bei HMW automatisch, sobald ein Gerät das erste Mal eine Nachricht über den Bus versendet. Alternativ kann das Pairing auch durch das Absetzen eines Discovery-Befehls ausgelöst werden.&lt;br /&gt;
Beim Pairen werden die Geräteadressen FHEM bekannt gemacht. Die Adresse der HMW Geräte ist nicht frei wählbar, sondern fest in den Geräten eingestellt. Alle HMW-Geräte haben standardtmäßig die Adresse 00000001 als Zentralen-Adresse gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Discovery ===&lt;br /&gt;
Mit dem Discovery-Befehl wird der gesamte RS485-Bus nach unbekannten HMW Geräten durchsucht.&lt;br /&gt;
 &lt;br /&gt;
;&amp;lt;code&amp;gt;set HM485_LAN discovery start&amp;lt;/code&amp;gt;&lt;br /&gt;
:Nachdem neue Geräte gefunden worden, werden diese automatisch mit Fhem gepairt.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code&amp;gt;get &amp;lt;name&amp;gt; info&amp;lt;/code&amp;gt;&lt;br /&gt;
:fragt die Grundsätzlichen Geräteeigenschaften ab. Also Typ, Seriennummer, Firmware-Version und legt die Schalter funktionsfähig in Fhem an.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code&amp;gt;get config all&amp;lt;/code&amp;gt;&lt;br /&gt;
:liest den gesamten benutzten EEprom aus. Zu je 16 Byte Blöcken. TODO: wozu braucht man das?&lt;br /&gt;
&lt;br /&gt;
== RAW-Befehle ==&lt;br /&gt;
Über das HMW-LAN-GW können so genannte RAW-Befehle an die am Bus angeschlossenen Geräte gesendet werden. Mit diesen RAW-Befehlen können z.B. Funktionen ausgelöst werden, die aktuell für ein Gerät noch nicht in Fhem implementiert sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 DDDDDD&lt;br /&gt;
&lt;br /&gt;
* 01234567 - entspricht hier der Adresse des Gerätes an das der Befehl gesendet werden soll&lt;br /&gt;
* 98 - das so genannte Steuerzeichen (Siehe HMW-Protokoll-Dokumentation)&lt;br /&gt;
* 00000001 - die HMW-ID der Zentrale (Fhem)&lt;br /&gt;
* DDDDDD - das sind die zu sendenden Daten.&lt;br /&gt;
&lt;br /&gt;
Da zum Senden von RAW-Befehlen Kenntnisse über das HMW-Protokoll vorhanden sein sollten, lohnt sich ein Blick in die [http://forum.fhem.de/index.php?action=dlattach;topic=10027.0;attach=2441 HMW-Protokoll-Doku]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionale Beispiele:&#039;&#039;&#039;&lt;br /&gt;
 # Rollladenaktor öffnen&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 7802C8&lt;br /&gt;
 &lt;br /&gt;
 # Rollladenaktor stoppen&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 7802C9&lt;br /&gt;
 &lt;br /&gt;
 # Rollladenaktor schließen&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 780200&lt;br /&gt;
 &lt;br /&gt;
 # erster Ausgang (Relais) eines HMW-IO-12-Sw14-DR ein&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 730003FF&lt;br /&gt;
 &lt;br /&gt;
 # erster Ausgang (Relais) eines HMW-IO-12-Sw14-DR aus&lt;br /&gt;
 set HM485_LAN RAW 01234567 98 00000001 73000000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wechsel von HMW-LAN-GW zu Serial/Netzwerk-RS485-Adaptern ==&lt;br /&gt;
Der Wechsel zwischen den verschiedenen Interface-Typen geht einfach und bedarf kein neues Pairing.&lt;br /&gt;
Ggf. müssen einige interfacespezifische Attribute in der fhem.cfg hinzugefügt bzw. gelöscht werden. &lt;br /&gt;
&lt;br /&gt;
Allerdings ist bei &amp;quot;nicht original&amp;quot;-Adaptern der Einsatz der [[hm485d.pl]] notwendig!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[HomeMatic Wired]]&lt;br /&gt;
* [http://www.eq-3.de/produkt-detail-wired/items/homematic-wired-rs485-lan-gateway.html HomeMatic Wired RS485 LAN Gateway (Hersteller Homepage)]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/downloads/HM-Cen-O-TW-x-x-2_Usersoftware_V1_1_eQ-3_130816.zip NetFinder Software]&lt;br /&gt;
* [http://forum.fhem.de/index.php?action=dlattach;topic=10027.0;attach=2441 HMW-Protokoll-Dokumentation]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Dashboard&amp;diff=7231</id>
		<title>Dashboard</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Dashboard&amp;diff=7231"/>
		<updated>2014-08-12T19:40:17Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Beliebiges anordnen von Gruppen&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory=?? --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef=?? --&amp;gt;&lt;br /&gt;
|ModTechName=95_Dashboard.pm&lt;br /&gt;
|ModOwner=svenson08&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dieser Artikel wird überarbeitet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Dashboard&#039;&#039;&#039; ist ein [[:Kategorie:Hilfsmodul|Hilfsmodul]], das umfangreiche Gestaltungsmöglichkeiten für das [[PGM2]] Web-Frontend bietet. So z.B. die Anordnung von Gerätegruppen in mehreren Tabs und jeweils in mehreren Spalten mittels Drag&#039;n Drop.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Keine speziellen Voraussetzungen erforderlich.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
=== Define ===&lt;br /&gt;
Die Syntax für die Definition eines Dashboards:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Dashboard&amp;lt;/code&amp;gt;&lt;br /&gt;
Parameterbedeutung:&lt;br /&gt;
;name&lt;br /&gt;
:Eindeutiger Name des anzulegenden Dashboards.&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Das Dashboard unterstützt die folgenden Attribute:&lt;br /&gt;
&lt;br /&gt;
;dashboard_activetab&lt;br /&gt;
:Bestimmt welches der Tabs beim Aufruf des Dashboards ausgewählt ist.&lt;br /&gt;
;dashboard_customcss&lt;br /&gt;
:Über dieses Attribut können CSS Definitionen eingegeben werden, um z.B. mit dem Wert &#039;&#039;body {background-image: none !important;}&#039;&#039; das Hintergrundbild im Dashboard zu deaktiviert werden.&lt;br /&gt;
;dashboard_tabcount&lt;br /&gt;
:Bestimmt die Anzahl der verfügbaren Tabs im Dashboard.&lt;br /&gt;
;dashboard_showtabs&lt;br /&gt;
:Bestimmt die Position der Tabs. Diese kann oben oder unten angezeigt oder komplett ausgeblendet werden. Letzteres führt dazu das dass Dashboard den Lockstate auf lock ändert.&lt;br /&gt;
;dashboard_showfullsize&lt;br /&gt;
:Zeigt das Dashboard ohne die Raumliste von FHEMWEB. Es wird dabei der gesamte linke Bereich (inkl. Raumliste und evtl. gesetzten Logo) und dem Header der Seite (inkl. Eingabezeile) ausgeblendet.&lt;br /&gt;
;dashboard_showtooglebuttons&lt;br /&gt;
:Wer die vergrößern/verkleinern nicht nutzen möchte kann dies mittels diesem Attribut deaktivieren.&lt;br /&gt;
;dashboard_width&lt;br /&gt;
:Bestimmt die Breite des Dashboards. Die Breite kann in Prozent (z.B. 80%) oder in Pixel (z.B. 1200) angegeben werden.&lt;br /&gt;
;dashboard_tab1groups (dashboard_tab2groups dashboard_tab3groups dashboard_tab4groups dashboard_tab5groups dashboard_tab6groups dashboard_tab7groups)&lt;br /&gt;
:Enthält die Auflistung der Gruppen, die im Dashboardtab angezeigt werden. Die Gruppen sind mit einem Komma zu trennen. Einer Gruppe kann ein Icons zugewiesen werden. Hierzu muss nach dem Gruppennamen &#039;&#039;:&amp;lt;icon&amp;gt;@&amp;lt;farbe&amp;gt;&#039;&#039; eingefügt werden. z.B. &amp;lt;code&amp;gt;Light:Icon_Fisch@blue,AVIcon_Fisch@red,Single Lights:Icon_Fisch@yellow&amp;lt;/code&amp;gt;&lt;br /&gt;
;dashboard_tab1name (dashboard_tab2name dashboard_tab3name dashboard_tab4name dashboard_tab5name dashboard_tab6name dashboard_tab7name)&lt;br /&gt;
:Bestimmt den Titel des Tabs.&lt;br /&gt;
;dashboard_tab1icon (dashboard_tab2icon dashboard_tab3icon dashboard_tab4icon dashboard_tab5icon dashboard_tab6icon dashboard_tab7icon)&lt;br /&gt;
:Anzuzeigendes Icon neben dem Titel des Tabs.&lt;br /&gt;
;dashboard_rowtopheight&lt;br /&gt;
:dashboard_webfrontendfilter&lt;br /&gt;
;Dem Attribut ist der Name einer FHEMWEB Instanz zu hinterlegen(z.B. WEB), möchte man das Dashboard darauf beschränken. Es können mehrere Instanzen, durch Komma getrennt, angegeben werden.&lt;br /&gt;
:Festlegen der Höhe der oberen Reihe des Dashboards.&lt;br /&gt;
;dashboard_rowbottomheight&lt;br /&gt;
:Festlegen der Höhe der unteren Reihe des Dashboards.&lt;br /&gt;
;dashboard_rowcenterheight&lt;br /&gt;
:Festlegen der Höhe der mittleren Reihe des Dashboards.&lt;br /&gt;
;dashboard_row&lt;br /&gt;
:Bestimmt welche Reihen im Dashboard angezeigt werden.&lt;br /&gt;
;dashboard_rowcentercolwidth&lt;br /&gt;
:Bestimmt die Breite der einzelnen Spalten der mittleren Dashboardreihe. Je Spalte kann ein separater Wert, durch Komma getrennt, hinterlegt werden. Jeder Wert bestimmt die Spaltenbreite in %.&lt;br /&gt;
;dashboard_colcount&lt;br /&gt;
:Legt die Anzahl der Spalten in der mittleren Reihe des Dashboards festgelegt.&lt;br /&gt;
;dashboard_tab1sorting (dashboard_tab2sorting dashboard_tab3sorting dashboard_tab4sorting dashboard_tab5sorting dashboard_tab6sorting dashboard_tab7sorting)&lt;br /&gt;
:Enthält die Positionierung der Gruppen im jeweiligen Tab. Es wird nicht empfohlen, dieses Attribut zu editieren.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiel(e) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Unterstützte Styles&lt;br /&gt;
Es werden die Styles Default, Dark und IOS7 unterstützt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Dashboard-Styles&lt;br /&gt;
|-&lt;br /&gt;
|[[Datei:dashboard_dark.png|thumb|500px|Dashboard im Style Dark]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Datei:dashboard_default.png|thumb|500px|Dashboard im Default Style]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Datei:dashboard_ios.png|thumb|500px|Dashboard im IOS7]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Benötigte Dateien&lt;br /&gt;
Wenn vom Dashboard benötigte Dateien fehlen zeigt der STATUS des Dashboards den Hinweis &#039;&#039;Missing File, see LogFile for Details&#039;&#039;. Weitere Einzelheiten zu diesem Fehler finden sich dann im Logfile. Es sollte klar sein, dass das Dashboard dann nicht (richtig) funktionieren kann.&lt;br /&gt;
&lt;br /&gt;
== Erklärung / Internes ==&lt;br /&gt;
[[Datei:Dashboard_Menulink.png|mini|120px|Darstellung des Dashboard Menüs]]&lt;br /&gt;
&lt;br /&gt;
Das Dashboard besteht in FHEM eigentlich aus zwei &amp;quot;Komponenten&amp;quot;. Dem eigentlichen definierten Dashboard und einem Weblink. Es muss sich aber nicht um den Weblink für das Dashboard kümmern werden, da dieser bei Bedarf vom Dashboard eigenständig erstellt wird.&lt;br /&gt;
&lt;br /&gt;
== Kleines Howto ==&lt;br /&gt;
;Schritt 1: Erstellen des Dashboards&lt;br /&gt;
:&amp;lt;code&amp;gt;define anyViews Dashboard&amp;lt;/code&amp;gt;&lt;br /&gt;
FHEM neu starten.&lt;br /&gt;
&lt;br /&gt;
;Schritt 2: Grundkonfiguration&lt;br /&gt;
:attr dashboard_width anyViews 80%&lt;br /&gt;
:attr dashboard_tabcount anyViews 3&lt;br /&gt;
:attr dashboard_tab1groups anyViews &amp;lt;GRUPPE1&amp;gt;,&amp;lt;GRUPPE2&amp;gt;,&amp;lt;GRUPPE3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GRUPPE1&amp;gt;, etc. sind durch richtige Gruppennamen zu ersetzen, z.B. Licht,Wetter oder ähnliches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Dashboard-KeinGruppe.png|mini|250px|&amp;quot;Objekt&amp;quot; ohne Gruppe]]&lt;br /&gt;
[[Datei:Dashboard-Gruppe.png|mini|250px|&amp;quot;Objekt&amp;quot; in einer Gruppe]]&lt;br /&gt;
&lt;br /&gt;
Danach sollen die beiden Gruppen im 1. Tab im Dashboard angezeigt werden. Zwar noch etwas chaotisch, aber das wird in den nächsten Schritten bearbeitet.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_tab1groups| Siehe dashboard_tab1groups]]&lt;br /&gt;
&lt;br /&gt;
Das Dashboard zeigt neben den beiden Gruppen bereits einiges andere mit an. Hier werden erst einmal diese &amp;quot;Nebensächlichkeiten&amp;quot; erklärt. Für die weiteren Schritte dieser Anleitung sollten die nun genannten Einstellungen unverändert bleiben. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Dashboard_FirstGroup.png|mini|300px|Erste Gruppe im Dashboard]]&lt;br /&gt;
Am rechten Rand des Dashboards erscheinen einige Schalter (&amp;quot;Set&amp;quot;, &amp;quot;Detail&amp;quot;). Der Schalter &amp;quot;Detail&amp;quot; springt in die Detailansicht des Dashboards um dort z.B. weiter Attribute hinzuzufügen. &amp;lt;br&amp;gt;&lt;br /&gt;
Der Schalter &amp;quot;Set&amp;quot; speichert die per Drag&#039;n Drop vorgenommenen Änderungen &#039;&#039;&#039;temporär&#039;&#039;&#039; (diese sind dann noch nicht gespeichert!). &amp;quot;Set&amp;quot; wird in rot geschrieben wenn die Positionierung einer Gruppe geändert wurde, aber noch nicht mit dem &amp;quot;Set&amp;quot;-Schalter gesichert wurden! Ebenso wird mit dem Schalter &amp;quot;Set&amp;quot; das aktuell [[#dashboard_activetab|aktive Tab]] gesichert &amp;lt;br&amp;gt;&lt;br /&gt;
Die Schalterleiste kann über das Attribut &#039;&#039;dashboard_showtabs&#039;&#039; deaktiviert werden, oder wahlweise über oder unter dem Dashboard platziert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_showtabs| Siehe dashboard_showtabs]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Im Gruppentitel erscheint an deren rechten Rand ein Symbol (+/-). Mit diesem kann man die Gruppe minimieren oder die voreingestellte Größe wieder herstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_showtooglebuttons| Siehe dashboard_showtooglebuttons]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Datei:Dashboard_Helper.png|mini|300px|Dashboard Helper]]&lt;br /&gt;
Zum besseren Ausrichten der einzelnen Gruppen werden zur Unterstützung einige Hilfen angezeigt. Die Erste ist die Anzeige eines Rahmens um das Dashboard. Genauer gesagt um die einzelnen Reihen/Spalten des Dashboards. Eine weitere Hilfe ist der Hintergrund der Gruppen. Dieser kann über die Mindestgröße der Gruppe hinaus gezogen werden. Damit können beliebig große Abstände zwischen den einzelnen Gruppen eingestellt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_showhelper| Siehe dashboard_showhelper]]&lt;br /&gt;
&lt;br /&gt;
Da nun die ersten Gruppen im Dashboard angezeigt werden, geht es nun darum, diese an die gewünschten Stellen zu platzieren. Dazu werden erst noch die verschiedenen Reihen und Spalten eingerichtet.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Dashboard verfügt über drei Reihen. Oben, Mitte und Unten. In der Standardeinstellung wird nur die mittlere Reihe angezeigt. Die mittlere Reihe sollte auch immer eingesetzt werden, da diese die Breite des Dashboard vorgibt. Für dieses kleine HowTo werden aber die obere und die mittlere Reihe eingeblendet, indem das Attribut &#039;&#039;&#039;dashboard_row&#039;&#039;&#039; auf &#039;&#039;&#039;top-center&#039;&#039;&#039; gestellt wird. Diese Einstellung gilt für das gesamte Dashboard und somit für alle verwendeten Tabs. Es ist nicht möglich, je Tab eine andere Einstellung zu wählen.&amp;lt;br&amp;gt; &lt;br /&gt;
[[#dashboard_row| Siehe dashboard_row]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Breite, die das Dashboard auf dem Bildschirm einnimmt, kann über das Attribut &#039;&#039;&#039;dashboard_width&#039;&#039;&#039; festgelegt werden. Standard ist die Breite von 100%. Es kann neben einem Prozentwert auch eine Breite in Pixel angegeben werden.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_width| Siehe dashboard_width]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Höhe der einzelnen Reihen kann über die Attribute dashboard_rowtopheight für die obere Reihe, dashboard_rowbottomheight für die untere Reihe und dashboard_rowcenterheight für die mittlere Reihe festgelegt werden. Damit können die Reihen nach den eigenen Bedürfnissen angepasst werden. Für dieses HowTo wird &#039;&#039;&#039;dashboard_rowtopheight&#039;&#039;&#039; auf &#039;&#039;&#039;300&#039;&#039;&#039; und &#039;&#039;&#039;dashboard_rowcenterheight&#039;&#039;&#039; auf &#039;&#039;&#039;400&#039;&#039;&#039; eingestellt. Diese Einstellung gilt für das gesamte Dashboard und somit für alle verwendeten Tabs. Es ist nicht möglich je Tab eine andere Einstellung zu wählen.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_rowtopheight| Siehe dashboard_rowtopheight]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_rowbottomheight| Siehe dashboard_rowbottomheight]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_rowcenterheight| Siehe dashboard_rowheight]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die mittlere Reihe hat (historisch bedingt) eine Besonderheit. Diese kann in maximal 5 Spalten unterteilt werden. Für unser Beispiel setzten wird das Attribut &#039;&#039;&#039;dashboard_colcount&#039;&#039;&#039; auf &#039;&#039;&#039;2&#039;&#039;&#039;. Diese Einstellung gilt für das gesamte Dashboard und somit für alle verwendeten Tabs. Es ist nicht möglich je Tab eine andere Einstellung zu wählen.&amp;lt;br&amp;gt; Weiter legen wir mit dem Attribut [[#dashboard_rowcentercolwidth|dashboard_rowcentercolwidth]] die Breite der ersten Spalte mit 30% und die der zweiten Spalte mit 70% fest in dem wir dem Attribut &#039;&#039;&#039;dashboard_rowcentercolwidth&#039;&#039;&#039; den Wert &#039;&#039;&#039;30,70&#039;&#039;&#039; zuteilen.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_colcount | Siehe dashboard_colcount ]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sicherlich ist das positionieren einfach, und jeder wird das hin bekommen. Zwei, drei Worte möchte ich trotzdem darüber verlieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;ins&amp;gt;Verschieben&amp;lt;/ins&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:Gruppen können in andere Reihen oder Spalten des Dashboards verschoben werden. Dazu muss in die Gruppe angeklickt werden und die Maustaste gedrückt gehalten werden. Los lässt man diese wenn man an der richtige Stelle ist. Das war wohl schon jedem klar.&amp;lt;br&amp;gt;&lt;br /&gt;
:Ein möglicher Zielort wird mit einem abgerundeten Platzhalter markiert. Dieser verschiebt auch, falls notwendig, andere Gruppen. Manchen wundert es warum dieser Zielort manchmal recht spät angezeigt wird. Dies hängt von der Position des Mauszeigers ab. Aha?! Je weiter oben man eine Gruppe anpackt, desto höher muss man die Maus schieben. Oder anders formuliert, wenn sich ca. 50% der Gruppenfläche im Zielbereich befinden wird dieser Zielort erst markiert. Das verschieben eine Gruppe von einem Tab in das andere ist nicht möglich. Letztendlich bleibt jedem nur &amp;lt;ins&amp;gt;ausprobieren&amp;lt;/ins&amp;gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Gruppen können über, unter, neben und vor anderen Gruppen verschoben werden. Auch das erfolgt wie bereits oben aufgeführt. Dies ist für viele nicht neues. Zu beachten ist aber das sich eine Gruppe nur dann vor oder neben eine anderen positionieren lässt wenn diese von der Breite in das Dashboard passen. Wenn Ihr also Gruppen nebeneinander positionieren wollt dürfen diese in Summe nicht breiter als das Dashboard sein.&amp;lt;br&amp;gt;&lt;br /&gt;
:Dies gilt nicht für die Höhen der Gruppen. Diese können in Summe höher als das Dashboard und höher als eine Reihe sein. Hier findet keine Begrenzung statt wie bei der Breite. Um jedoch das ein oder andere optisch nicht so schöne Ergebnis zu bekommen sollte darauf geachtet werden das keine Gruppe über eine Reihe hinaus ragt.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für unser Beispiel verschieben wir zum Testen die Gruppen in beliebige Reihen bzw. Spalten der mittleren Reihe. Danach bitte den &amp;quot;Set&amp;quot; Schalter drücken, dieser hat sich durch die verschiebe Aktionen bereits rot markiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Dashboard_Positionieren.png|mini|200px|Ausrichtung von einzelnen Gruppen]]&lt;br /&gt;
Das Ausrichten ist gleichermaßen einfach wie das Positionieren und sollte auch nichts Neues sein. Aber auch hier möchte ich darüber zwei, drei Worte verlieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Das Positionieren ist nur möglich, wenn das Dashboard nicht gesperrt ist (Lock/Unlock). Dann wird ein abgeschrägte Ecke an der Gruppe angezeigt, mit der die Größe gezogen werden kann.&lt;br /&gt;
:Jede Gruppe kann in Höhe und Breite beliebig gezogen werden, wobei genau das wieder einen Hacken hat: Das Größerziehen ist nur bedingt möglich. Die Breite/Höhe ist auf die Breite/Höhe der Dashboard Reihe (oder Spalte) begrenzt. Damit kann man eine Gruppe nicht über den Rand des Dashboards hinaus vergrößern.&amp;lt;br&amp;gt;&lt;br /&gt;
:Das Kleinerziehen ist auch nur bis zu einer Mindestgröße möglich. Die Mindestgröße ist abhängig vom Inhalt der Gruppe, kann also von Gruppe zu Gruppe unterschiedlich sein.&amp;lt;br&amp;gt;&lt;br /&gt;
:Ein Sonderverhalten beim Vergrößern/Verkleinern gibt es auch: Ist ein Gruppe höher als die Reihe, lässt sich die Gruppe zwar dort positionieren. Beim Ausrichten springt dann der untere Rand nicht auf die Mindesthöhe der Gruppe, sondern auf die maximale Höhe der Reihe. In diesem Fall sollte die Höhe der Reihe geändert werden. Ähnliches kann auch in der Breite auftreten.&amp;lt;br&amp;gt;&lt;br /&gt;
:Ändert sich der Inhalt einer Gruppe (wird z.B. ein Dummy dazugepackt), ändert sich die Positionierung der Gruppe &#039;&#039;&#039;nicht&#039;&#039;&#039; automatisch. In diesem Fall ist man immer gezwungen auch die Größe der Gruppe im Dashboard an die neue Gegebenheit anzupassen.&lt;br /&gt;
&lt;br /&gt;
Für unser Beispiel ziehen wir die Gruppen beliebig größer. Danach bitte den &amp;quot;Set&amp;quot;-Schalter drücken. Dieser hat sich durch die Verschiebeaktionen bereits rot markiert.&lt;br /&gt;
&lt;br /&gt;
Wie bereits etwas weiter oben erklärt wird die Positionierung der Gruppen im Dashboard durch die Betätigung des Schalters &amp;quot;Set&amp;quot; temporär zwischengespeichert. Dadurch wird die Positionierung bereits für einen Seitenrefresh gespeichert. Solange bis das Browserfenster geschlossen wird. Danach wären diese Einstellungen verloren.&amp;lt;br&amp;gt;&lt;br /&gt;
Darum ist es notwendig die Positionierung permanent zu speichern, damit auch nach einem Neustart von Fhem die getroffenen Einstellungen und Positionierungen vorhanden sind. Dies geht über den in Fhem bekannten weg über &#039;&#039;Save config&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Wird der Schalter &amp;quot;Set&amp;quot; nicht betätigt, wird auch über &#039;&#039;Save config&#039;&#039; die Positionierung nicht gespeichert. Daher ist es wichtig, immer &#039;&#039;&#039;zuerst&#039;&#039;&#039; mit dem Schalter &#039;&#039;&#039;&amp;quot;Set&amp;quot;&#039;&#039;&#039; die Einstellung zwischenzuspeichern und &#039;&#039;&#039;danach mit &#039;&#039;Save config&#039;&#039;&#039;&#039;&#039; den Zwischenspeicher permanent zu sichern.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch den Schalter &amp;quot;Set&amp;quot; wird für jedes Tab die Einstellung in das für das jeweilige Tab zuständige Attribut geschrieben. Für Tab 1 ist das Attribut &#039;&#039;dashboard_tab1sorting&#039;&#039; zuständig, für Tab 2 das Attribut &#039;&#039;dashboard_tab2sorting&#039;&#039;, usw. &#039;&#039;&#039;Diese Attribute sollten nicht editiert werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es ist möglich jedem Tab einen eigenen individuellen Namen zu vergeben. Dazu ist für das jeweilige Tab das entsprechende Attribut zu befüllen. Z.B. für Tab 1 ist das Attribut &#039;&#039;dashboard_tab1name&#039;&#039; mit dem gewünschten Titel zu füllen.&amp;lt;br&amp;gt;&lt;br /&gt;
[[#dashboard_tab1name| Siehe dashboard_tab1name]]&lt;br /&gt;
&lt;br /&gt;
== Letzte Änderungen / Dashboard-Historie ==&lt;br /&gt;
&lt;br /&gt;
* (03.03.2014) Anzeigefehler bei readingGroups in einem Hiddenroom behoben&lt;br /&gt;
* (17.03.2014) Fehlerausgabe durch dashboard_webfrontendfilter behoben&lt;br /&gt;
* (26.03.2014) dashboard_showfullsize wird nicht im Raum &amp;quot;all&amp;quot; bzw. Everything angewendet&lt;br /&gt;
* (18.04.2014) Attribut dashboard_lock State entfernt. Kann nur noch in der Detailansicht verändert werden.&lt;br /&gt;
* (24.04.2014) Attribut dashboard_showhelper wird nicht mehr genutzt. Der Helper wird nur angezeigt wenn lockstate unlock ist.&lt;br /&gt;
* (24.04.2014) Schalter Detail und Set werden nun rechts angezeigt.&lt;br /&gt;
* (24.04.2014) Attribut dashboard_showtabs kann nicht mehr tabs-at-the-top-buttonbar-hidden oder tabs-on-the-bottom-buttonbar-hidden sein.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,16503.0.html Forenthread] über &#039;&#039;Dashboard&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=WebViewControl&amp;diff=7230</id>
		<title>WebViewControl</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=WebViewControl&amp;diff=7230"/>
		<updated>2014-08-12T19:39:38Z</updated>

		<summary type="html">&lt;p&gt;Kamischi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:WebViewControl_Icon.png|mini|rechts|WebViewControl]]&lt;br /&gt;
&#039;&#039;&#039;WebViewControl&#039;&#039;&#039; ist eine APP, die auf Phonegap basiert und per WebView einen Fullscreen-Browser zur Verfügung stellt. Dieser kommuniziert zusätzlich per Javascript mit dem Android-Gerät und stellt so einige Geräteeigenschaften zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Darüber können dann einige Funktionen wie z.B. die Bildschirmhelligkeit und der Batteriestatus per Fhem-Modul zur Verfügung gestellt, ausgewertet und auch gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- [http://forum.fhem.de/index.php/topic,10628.msg63572.html#msg63572] umgestellt auf ersten Beitrag --&amp;gt;&lt;br /&gt;
Im Fhem-Forum ist im ersten Beitrag [http://forum.fhem.de/index.php/topic,10628 dieses Threads] jeweils die aktuelle Version zu finden.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
Grundsätzlich kann die APP mit jeder Website zusammen benutzt werden. Für Fhem ist jedoch ein Modul verfügbar, damit Fhem einfach mit der APP zusammenarbeiten kann. Dafür sind folgende Anforderungen zu erfüllen:&lt;br /&gt;
* Ein laufendes Fhem.&lt;br /&gt;
* aktiviertes Longpoll (Die Kommunikation zwischen Fhem zur APP erfordert aktiviertes Longpoll). &lt;br /&gt;
* Android ab Verion 2.3.3 besser jedoch Android ab Version 4 &lt;br /&gt;
&lt;br /&gt;
== Screenshots ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;			&lt;br /&gt;
File:WebViewControl_screenshot_01.png|Aktive Spracherkennung&lt;br /&gt;
File:WebViewControl_screenshot_02.jpg|Eine Toastmessage&lt;br /&gt;
File:WebViewControl_screenshot_03.jpg|Menü&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verfügbare Funktionen ==&lt;br /&gt;
=== Fullscreen Browser ===&lt;br /&gt;
{{Randnotiz|RNText=Der Fullscreen-Mode wird nicht von allen Geräten unterstützt.}}&lt;br /&gt;
Ab Android 4 Ice Cream Sandwich (ICS) (oder auch schon seit Version 3?) ist auf den meisten Geräten die &amp;quot;System-Bar&amp;quot; am unteren Rand nicht ausblendbar. Es sei denn, das ROM des Gerätes unterstützt das. Das geht zwar auch mit einem gerooteten Gerät, das wollte ich hier aber nicht vorraussetzen. Beim &amp;quot;Archos 10D G3&amp;quot; wird das Ausblenden der &amp;quot;System-Bar&amp;quot; z.B. unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Eigene APP-ID ===&lt;br /&gt;
Jeder APP kann eine eigene APP-ID zugewiesen werden. So können im Netzwerk mehrere APPs direkt adressiert werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Ändern der APP-ID muss die App neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Autostart ===&lt;br /&gt;
Im Menü kann eingestellt werden, ob die APP nach einem Booten des Gerätes automatisch startet.&lt;br /&gt;
&lt;br /&gt;
=== Bildschirm eingeschaltet lassen ===&lt;br /&gt;
Per Menüeinstellung, per Javascript bzw. per Fhem kann eingestellt werden, ob der Bildschirm bei laufender App eingeschaltet bleibt.&lt;br /&gt;
&lt;br /&gt;
=== Ändern der Bildschirmhelligkeit ===&lt;br /&gt;
Die Bildschirmhelligkeit kann per Javascript und über FHEM eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Toast Nachrichten ===&lt;br /&gt;
Kurze, sogenannte Toast-Nachrichten, können an das Gerät per Javascript und per Fhem gesendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Netzwerk- und Batteriestatus ===&lt;br /&gt;
Der Batterie- und Netzwerkstatus kann vom Gerät per Javascript abgefragt werden. Mit diesen Informationen wird z.B. in der rechten unteren Ecke der Fhem-Weboberfläche ein entsprechendes Icon angezeigt. (Netzwerk wird derzeit nur grün, wenn eine WIFI- oder Ethernet-Verbindung aktiv ist.)&lt;br /&gt;
&lt;br /&gt;
=== Abspielen von Audio Dateien ===&lt;br /&gt;
Es können Audiodateien vom Netzwerk oder internen Speicher / von SD-Karte abgespielt werden.&lt;br /&gt;
&lt;br /&gt;
=== TTS (Text To Speach) ===&lt;br /&gt;
Es können Sprachausgaben per Javascript bzw. von FHEM aus ausgelöst werden. Damit können z.B. Statusinformation per Sprache ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
=== Spracherkennung ===&lt;br /&gt;
Nutzung der Spracherkennungs-API. Somit ist es möglich, die angezeigte Webseite und auch Fhem per Sprache zu steuern. Es kann dann ein Wort bzw. eine Wortgruppe gesprochen werden (z.B. &amp;quot;Wohnzimmer Licht an&amp;quot;), das direkt per &#039;&#039;Notify&#039;&#039; in Fhem ausgewertet werden kann. Per Fhem und per Tap auf das Batterie-Icon wird am Gerät die Spracherkennung gestartet. Der &amp;quot;Tap&amp;quot; auf das Batteriesymbol ist derzeit eine &amp;quot;Notlösung&amp;quot;, weil es noch keine bessere Idee gab.&lt;br /&gt;
Zusätzlich kann die Erkennung durch Fhem gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Im Zip-Archiv befinden sich folgende Dateien:&lt;br /&gt;
* 95_WebViewControl.pm - kommt in den Ordner Fhem (als Kopie oder als Symlink)&lt;br /&gt;
* webviewcontrol.css und webviewcontrol.js - kommen in den Ordner /www/pgm2&lt;br /&gt;
* WebViewControl.apk - das ist die APP und muss auf dem Android Gerät installiert werden.&lt;br /&gt;
* Die Phonegap JS-Library wurden von der WebViewControl-JS-Datei entkoppelt. Daher muss cordova-2.3.0.js in www/pgm2.&lt;br /&gt;
* mic_sprite.png muss in den Images-Ordner.&lt;br /&gt;
&lt;br /&gt;
Da die APP noch nicht aus dem Playstore kommt und auch keine qualifizierte Signatur hat, muss zum Installieren der APP in den Einstellungen des Android Gerätes im Punkt Sicherheit die Einstellung &amp;quot;Unbekannte Quellen&amp;quot; aktiviert sein. Das kann nach der Installation wieder deaktiviert werden.&lt;br /&gt;
&lt;br /&gt;
== Angeforderte Berechtigungen ==&lt;br /&gt;
Die App verlangt bei der Installation die folgenden Berechtigungen&lt;br /&gt;
* Netzkommunikation (sonst könnte die App keine Webseiten öffnen)&lt;br /&gt;
* System-Tools (für das Deaktivieren des Standby-Modus)&lt;br /&gt;
* Netzwerkkommunikation (zum Abfragen des Netzwerkstatus)&lt;br /&gt;
* System-Tools (für den Autostart nach dem Booten)&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der APP ==&lt;br /&gt;
Beim ersten Start der APP muss diese an einigen Punkten konfiguriert werden.&lt;br /&gt;
* Start-URL (die komplette URL, unter der die Fhem-Weboberfläche erreichbar ist)&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die Start-URL muss derzeit komplett mit Protokoll eingegeben werden, also beispielsweise als &#039;&#039;&#039;http://&#039;&#039;&#039;192.168.1.1:8083/fhem}}&lt;br /&gt;
* APP-ID (die APP-ID unter der FHEM die APP finden kann; Standard=12345)&lt;br /&gt;
* Username / Password (falls die FHEM-Weboberfläche passwortgeschützt ist, muss das hier entsprechend eingegeben werden)&lt;br /&gt;
* Autostart (falls dieser Punkt aktiviert ist, startet die APP nach dem Booten von Android automatisch)&lt;br /&gt;
* Bildschirm eingeschaltet lassen (der Bildschirm bleib an, wenn die externe Stromversorgung angeschlossen ist)&lt;br /&gt;
* Cache löschen (die Webview der App hat einen internen Cache. Wenn dieser Punkt aktiv ist wird der Cache beim Starten der APP und beim Neuladen gelöscht)&lt;br /&gt;
* URL Timeout (hier kann (in Millisekunden) eingestellt werden, wie lange die APP beim Laden einer URL wartet, bevor eine Fehlermeldung angezeigt wird)&lt;br /&gt;
* Entwickler-Optionen im Hauptmenü (wenn diese Option aktiv ist, werden einige zusätzliche Menüpunkte im Hauptmenü eingeblendet (Cache löschen / Display Helligkeit testen))&lt;br /&gt;
&lt;br /&gt;
== Konfiguration in Fhem ==&lt;br /&gt;
Die folgenden Definitionen sind in der Fhem [[Konfiguration]] vorzunehmen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WebViewControl &amp;lt;app-id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;define androidTablet WebViewControl 12345&amp;lt;/code&amp;gt;&lt;br /&gt;
Die app-id (hier 12345) ist dieselbe Zeichenfolge, die auch in der APP eingestellt wird. So können unterschiedliche APPs mit Fhem adressiert werden. Standardmässig ist als APP-ID in der APP 12345 eingestellt.&lt;br /&gt;
&lt;br /&gt;
== Steuerungsmöglichkeiten per Fhem (set) ==&lt;br /&gt;
Bildschirm bei aktiver APP eingeschaltet lassen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set androidTablet keepScreenOn [on|off]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktuelle Seite im der Weboberfläche neu laden. Kann während der Entwicklung ganz nützlich sein:&lt;br /&gt;
:&amp;lt;code&amp;gt;set androidTablet reload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bildschirmhelligkeit ändern:&lt;br /&gt;
:&amp;lt;code&amp;gt;set androidTablet screenBrightness [WERT]&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Wert kann mit 1-255 eingegeben werden. Allerdings ist es geräteabhängig, was z.B. als Maximalhelligkeit angesehen wird. Hier muss ggf. experimentiert werden. Üblich sind Werte von 1 bis 100 oder auch 1 bis 255. Sollte die Helligkeit nach 100 z.B. wieder abnehmen, dann wäre 100 der Maximalwert.&lt;br /&gt;
&lt;br /&gt;
Kurze Nachrichten auf dem Gerät anzeigen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set androidTablet toastMessage [NACHRICHT]&lt;br /&gt;
&lt;br /&gt;
URL der angezeigten Seite wechseln:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;webViewControl_Name&amp;gt; newUrl &amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die URL muss auch hier komplett angegeben werden. Also http://...&lt;br /&gt;
Man kann hier übrigens JEDE URL angeben. Auch z.b. die von Google.&lt;br /&gt;
Dabei verlässt man dann aber den &amp;quot;Einflussbereich&amp;quot; von FHEM. Somit ist anschließend keine weitere Kommunikation möglich.&lt;br /&gt;
Daher ist es Sinnvoll hier NUR FHEM URLs anzugeben.&lt;br /&gt;
&lt;br /&gt;
Da man hier beliebige URLs an die APP übergeben kann, auch so was hier:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;webViewControl_Name&amp;gt; newUrl javascript:alert(&#039;Huhu!&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
Hiermit könnte man hier natürlich auch &amp;quot;bösartigen&amp;quot; JS-Code einschleusen.&lt;br /&gt;
Natürlich kann man über diesen Weg auch einfach Benutzer definierten Javascript-Code ausführen.&lt;br /&gt;
Hier können wir noch mal diskutieren ob ich die Eingaben hier noch entsprechend filtern soll.&lt;br /&gt;
&lt;br /&gt;
Spracherkennung per FHEM starten:&lt;br /&gt;
:&amp;lt;code&amp;gt;set androidTablet voiceRec start&amp;lt;/code&amp;gt;&lt;br /&gt;
Nachdem die Erkennung gestartet wurde, gibt es ein Tonsignal und ein Overlay (siehe Screenshot oben). Wenn die Erkennung erfolgreich war, also was erkannt wurde, gibt es ein anderes Tonsignal und kurz eine entsprechende Grafik im Overlay. Bei einem Fehler gibt es auch einen Ton und eine entsprechende Grafik mit einem Fehlertext. Der Fehlertext wird genau wie das erkannte Wort/Wortgruppe an FHEM gemeldet und kann dort z.B. mit einem Notify ausgewertet werden. Nach einer erfolgreichen Erkennung bzw. einem Fehler wird das Overlay automatisch wieder geschlossen, es ist also keine Benutzerinteraktion notwendig.&lt;br /&gt;
&lt;br /&gt;
Beispiel für den Notify für die Spracherkennung&lt;br /&gt;
:&amp;lt;code&amp;gt;# Licht im Wohnzimmer einschalten&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define speechRecognizer_wzLich_ein notify .*voiceRecognitionLastResult.*licht.*wohnzimmer.*(ein|an).* set wzLicht on;; set @ ttsSay Licht im Wohnzimmer eingeschaltet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;# Licht im Wohnzimmer ausschalten&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define speechRecognizer_wzLich_aus notify .*voiceRecognitionLastResult.*licht.*wohnzimmer.*aus.* set wzLicht off;; set @ ttsSay Licht im Wohnzimmer ausgeschaltet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;# Einfaches echo&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define speechRecognizer_echo notify .*voiceRecognitionLastResult.* {my @@a=split(&amp;quot;: &amp;quot;,&amp;quot;%&amp;quot;);; fhem &amp;quot;set @ ttsSay $a[1]&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Beispiele zusammen funktionieren anscheinend nicht. Das echo-Notify &amp;quot;drängelt&amp;quot; sich immer vor, die anderen werden dann nicht mehr ausgeführt. Vielleicht hat ja jemand eine Idee.&lt;br /&gt;
&lt;br /&gt;
Die Spracherkennung ist übrigens noch experimentell:&lt;br /&gt;
* Ein Abschalten einer laufenden Erkennung ist noch nicht implementiert. Die Erkennung stoppt aber, wenn keiner mehr was sagt.&lt;br /&gt;
* Vermutlich gibt es noch einige Bugs&lt;br /&gt;
&lt;br /&gt;
== Informationen per FHEM abrufen (get) == &lt;br /&gt;
Akku-Ladestand abrufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;get androidTablet powerLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einige Geräte, speziell das &amp;quot;Archos 10D G3&amp;quot; haben hier allerdings Probleme. Der &amp;quot;echte&amp;quot; Akkuzustand wird hier nur angezeigt, wenn keine externe Stromversorgung angeschlossen ist. Mit externer Versorgung zeigt das Gerät immer 100% an.&lt;br /&gt;
&lt;br /&gt;
Energie-Status abrufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;get androidTablet powerPlugged&amp;lt;/code&amp;gt;&lt;br /&gt;
Zeigt an ob das Gerät an einer externen Energieversorgung angeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,10628 Thread] im Fhem-Forum zu dieser Applikation&lt;br /&gt;
* [http://forum.fhem.de/index.php?action=dlattach;topic=10628.0;attach=12329 aktuelle Version 0.4 der APP]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;/div&gt;</summary>
		<author><name>Kamischi</name></author>
	</entry>
</feed>